Перейти к содержанию
    

STM32F767, FreeRTOS, HardFault

Коллеги!
Программа работала, но в какой-то момент перестала и постоянно вылетает в hard fault. Ассемблер для ARM не знаю, поэтому понять по скриншоту причину не могу. Не понимаю, почему исполнение обработчика прерывания уходит куда-то не туда. Растолкуйте, пожалуйста, и подскажите причины, по которым такое может происходить.

Screenshot_443.thumb.jpg.de3fb4030db6a3cacf749c501773c841.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ассемблер не знаете, но мануал читать умеете? В мануале описаны регистры с информацией об HF. Прочитайте их. По ним часто можно определить и причину и место.

А какое отношение имеют выложенные скриншоты к HF - вообще непонятно...

 

ЗЫ:  И вообще - в нормальном проекте должен быть встроен обработчик HF, дешифрующий инфу из тех регистров и выводящий в отладочный поток в удобной для разработчика форме. Это Вам для справки....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 minutes ago, jcxz said:

В мануале описаны регистры с информацией об HF

Ессно, прочитал. Не понимаю, почему HF происходит при переключении задачи. Есть идеи?

15 minutes ago, jcxz said:

По ним часто можно определить и причину и место

В этот раз место и причина не определяются.

15 minutes ago, jcxz said:

в нормальном проекте должен быть встроен обработчик HF, дешифрующий инфу из тех регистров и выводящий

Смысла в нём не вижу. Он покажет то же самое, что и Куб:

image.thumb.png.3351aaded0ffd7a3bc3573c504aaf669.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня обычно такое происходит, когда портится стек задачи.

1. Попробуйте включить проверку на переполнение стека в FreeRTOS, если еще не включили. Данный способ работает, но не всегда.

2. Увеличите размер стека всех задач. Если заработает, но методом исключения ищите, ту которая все портит.

3. Если где-то в коде есть обработка больших массивов, следует внимательно посмотреть не выходят ли они за границы раздела.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

30 minutes ago, Sverchok said:

У меня обычно такое происходит, когда портится стек задачи.

320К ОЗУ позволяют тупо включить большие размеры стэка и хипов, чем я грязно воспользовался.

1. Проверку стэка не включил, тупо воткнул 160К. Хотя есть есть смысл включить, видимо. Можно ссылку на шпаргалку как это сделать, если есть под рукой? Я в Кубе пока ни разу такого не делал, хотя там есть встроенные инструменты для мониторинга FreeRTOS.

2. Стэки задач увеличил до неприличия. Задачу, которая спотыкается на portYEILD() нашёл, остальные выключил. Всё равно падает.

3. А вот массивы есть. Щас прогуляюсь за молоком для кофе и ещё раз буду перепроверять.

Изменено пользователем tonyk_av

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, tonyk_av сказал:

Ессно, прочитал. Не понимаю, почему HF происходит при переключении задачи. Есть идеи?

Если асм изучать не хотите, вникать в регистры описывающие HF - тоже, а надеетесь только на мурзилки типа всяких кубов, то остаётся только гадать и пинать колёса. Телепатов тут нет - искать баги удалённо в вашем коде.

Увеличиение стеков, включение их проверок - это пинание колёс наугад....

А если бы открыли мануал, узнали бы что "INVSTATE" это "Attempting to use an instruction set other than the Thumb instruction set or returns to a non load/store-multiple instruction with ICI continuation" и "When this bit is set to 1, the PC value stacked for the exception return points to the instruction that attempted the illegal use of the EPSR". А дальше остаётся только найти адрес....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я такое ловил во FreeRTOS, и не раз тут писал - проверьте установку приоритетов прерываний.

Что-то типа такого в начало main:

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, jcxz said:

не хотите, вникать в регистры описывающие HF - тож

Я этого не говорил, не надо придумывать.

3 minutes ago, jcxz said:

надеетесь только на мурзилки типа всяких кубов

Раньше у меня было написано вытаскивание состояние процессора в HardFault_Handler() для поиска точки сбоя, то сейчас не делаю этого, потому что Куб показывает то же самое.

 

5 minutes ago, jcxz said:

"INVSTATE" это "Attempting to use an instruction set other than the Thumb instruction set or returns to a non load/store-multiple instruction with ICI continuation" и "When this bit is set to 1, the PC value stacked for the exception return points to the instruction that attempted the illegal use of the EPSR". А дальше остаётся только найти адрес....

А вот это дело. Щас поковыряю в эту сторону.

3 minutes ago, adnega said:

Что-то типа такого в начало main:

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

Есть такое. Сама FreeRTOS, вроде, такое даже вызывает.

12 minutes ago, jcxz said:

"INVSTATE" это "Attempting to use an instruction set other than the Thumb instruction set or returns to a non load/store-multiple instruction with ICI continuation" и "When this bit is set to 1, the PC value stacked for the exception return points to the instruction that attempted the illegal use of the EPSR". А дальше остаётся только найти адрес....

Кстати, читал это на сайте STM.

Вот место сбоя:

image.png.199e25b8ecadd853fefa2a4c66a97eba.png

Мне пока не понятно, что из этого я могу извлечь для поиска ошибки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

57 минут назад, tonyk_av сказал:

2. Стэки задач увеличил до неприличия. Задачу, которая спотыкается на portYEILD() нашёл, остальные выключил. Всё равно падает.

Порча стеков задач может происходить не только из-за их переполнения, но и например потому, что другая задача или ISR туда что-то записала. Т.е. - баг находится совсем не в том месте, где происходит fault. Потому всякие "проверки стеков в ОС" и их увеличения хоть до гигабайтов - малопользительны.

В таких случаях может помочь например MPU: разрешать доступ к стеку конкретной задачи (или вообще - ко всем локальным переменным задачи) только из контекста задачи, а при вытеснении задачи - блокировать доступ к стеку через MPU.

Ну или - искать методом исключения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 18.10.2022 в 20:48, tonyk_av сказал:

Есть такое. Сама FreeRTOS, вроде, такое даже вызывает.

Во FreeRTOS не нашел такого вызова. Можете показать?

В F767 в HAL_Init() есть  HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4),

который все размотает в __NVIC_SetPriorityGrouping().

Поэтому с именами у меня сомнения, которые можно развеять значением SCB->AIRCR перед местом фейла.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, adnega said:

Во FreeRTOS не нашел такого вызова. Можете показать?

Не смогу. Раньше, помниться, был макрос, а сейчас нет. Поэтому я сам это всё настраиваю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

После выгребания ошибок получился такой результат.

Есть две пары таймеров ведущий-ведомый в виде TIM3-TIM2 и TIM4-TIM5. Первая пара работает как ожидается, а вот вторая ведёт не понятным мне образом.

Запускаю пару TIM4-TIM5. Жду изменения состояния поля stat, которое должно измениться в обработчике прерывания TIM5.

image.png.f4f507651322930dbf0dda177dde1c9f.png

Есть запрос у TIM5 от CCR1

image.png.4355aef86eda256da28efd2d00f421b1.png

которое разрешено у таймера

image.png.088b56f2cab27ab5357925076559ab98.png

и, теоретически в NVIC вызовом NVIC_EnableIRQ().

image.png.723d9bd846c1e814f2533cf0cea9d05b.png

Но вызова прерывания от TIM5 не происходит. Пока делаю в отладчике шаг (F11 в Кубе), то кручусь в цикле while(), но стоит снять точку останова 1 и запустить выполнение (F5 в Кубе), то вместо точки 2 получаю hard fault.

image.png.d6a5f5c4bf0ee245db4185f6a72ee18e.png

Есть идеи куда рыть?

image.png

Изменено пользователем tonyk_av

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нашёл ошибку.

Таблица векторов была с ошибкой, поэтому при возникновении прерывания от TIM5 происходил переход на адрес 0.

Занавес.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...