|
STM32F407VET6. Свистопляска с HardFault-ами, Бесстстемные исключения HardFault |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 20)
|
Dec 29 2015, 16:03
|
Местный
  
Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503

|
Цитата(scifi @ Dec 29 2015, 17:22)  Что есть "солидное" число? 100? 1000? 10000? 100000? 1000000? Опять же, нужно сделать обработчик hard fault, собрать всю имеющуюся информацию и точно установить причину. солидное число- чисто прикидочно 1000-1500. Обработчик сделан. Из зслуживающей(на мой взгляд) вничания инфрмвции имеем следующее: в регистре UFSR(старшие 16 бит регистра CFSR) наиболее часто установлен бит INVSTATE, значительно реже имеем установленным бит UNDEFINSTR. всегда только один из них. Регистр HFSR всегда имеет установленным бит FORCED. При пошаговой отладке однажды было замечено, что ХФ происходит при выполнении невинной строки типа(последняя строка) Код bool ok; uint16_t count; uint16_t ChannelCount; ... ... ...
whille (!ok && (++count < ChannelCount))
Сообщение отредактировал nanorobot - Dec 29 2015, 16:05
|
|
|
|
|
Dec 30 2015, 04:12
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 20-11-13
Пользователь №: 79 278

|
возьмите другую плату да проверьте. у меня есть тоже запиленная до дыр discovery f429 , и подобные же спецэффекты не так давно начали проявляться , проблема судя по всему по питанию , ибо если на 0.1 V подать больше , то все работает.
|
|
|
|
|
Jan 4 2016, 21:52
|
Местный
  
Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503

|
Цитата(AlanDrakes @ Dec 31 2015, 21:04)  Так же можно проверить ёмкости на плате. Исключил из процедуры вызов библиотечной функцмм pow() - заменил самописаной - наваждение прошло...
|
|
|
|
|
Jan 5 2016, 09:02
|
Местный
  
Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503

|
Цитата(scifi @ Jan 5 2016, 03:57)  А осадок остался. Причина не найдена, что, скорее всего, означает, что глюк вернётся снова. ... накаркал. Типовая ситуация - в UFSR взводится бит INVSTATE, об'яснение из дефинитив гуиде - attempts to switch to an invalid state (e.g. ARM) - мож подтолкнете в верном направлении? самое что убивает - при пошаговой отладке глюк практически никогда не воспроизводится
|
|
|
|
|
Jan 5 2016, 11:49
|
Местный
  
Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503

|
Цитата(scifi @ Jan 5 2016, 16:03)  Подталкиваю: нужно расшифровать всю информацию, доступную обработчику Hard Fault. Вычислить адрес инструкции, на которой проц спотыкается, посмотреть, что там. ощутил едва уловимый толчок...))
Сообщение отредактировал nanorobot - Jan 5 2016, 11:50
|
|
|
|
|
Jan 5 2016, 13:15
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(nanorobot @ Jan 5 2016, 12:49)  ощутил едва уловимый толчок...)) К какой точке приложения?  . TC: так где расчипятка актуального дампа hardfault? Если определится адрес слёта, берем карту памяти компоновщика, ищем, что там поблизости искомого адреса, находим тело функции. Потом можно под отладчиком там остановиться (даже если при этом не сгенерится исключение) и посмотреть, а нет ли там... рекурсии, которая съедает стек, которого, возможно, маловато будет! Как такая идейка?
Сообщение отредактировал KnightIgor - Jan 5 2016, 13:15
|
|
|
|
|
Jan 5 2016, 14:43
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(KnightIgor @ Jan 5 2016, 19:15)  TC: так где расчипятка актуального дампа hardfault? Если определится адрес слёта, берем карту памяти компоновщика, ищем, что там поблизости искомого адреса, находим тело функции. Потом можно под отладчиком там остановиться (даже если при этом не сгенерится исключение) и посмотреть, а нет ли там... рекурсии, которая съедает стек, которого, возможно, маловато будет! Как такая идейка? Кстати - есть ещё в природе отладчики с функцией трэйсера! Очень пользительная вещь в данном случае!
|
|
|
|
|
Jan 5 2016, 17:28
|
Местный
  
Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503

|
Цитата(jcxz @ Jan 5 2016, 19:43)  Кстати - есть ещё в природе отладчики с функцией трэйсера! Очень пользительная вещь в данном случае! CFSR = 0x20000 HFSR = 0x40000000 DFSR = 0x01 AFSR = 0x0 MMAR = 0xE000ED34 BFAR = 0xE000ED38 PSR = 0x60000000 LR = 0x800A1D7 R0 = 0x0 R1 = 0x2001D370 R2 = 0x2001D370 R12 = 0x0 LR содержит, если я правильно понимаю, адрес следующей инструкции по отношению к вызвавшей ХФ. дизасм сотв фрагмента прилагаю. Судя по всему там содержатся сервисы ChibiOS, которую я использую.
Сообщение отредактировал IgorKossak - Jan 5 2016, 19:19
Эскизы прикрепленных изображений
|
|
|
|
|
Jan 5 2016, 19:03
|
Местный
  
Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503

|
Цитата(ViKo @ Jan 5 2016, 23:37)  Стек для задач попробуйте увеличить. только что методом научного тыка проблема решилась, по крайней мере для данной процедуры. Процедура вызывается из треда(задачи) с приоритетом среднего уровня. В процедуре имеются локальные параметры. Я ко всем описаниям локальных параметров добавил спецификатор static. Проблема ушла. Хороший повод спросить более грамотных товарищей - имееи ли смысл об'являть статическими локальные переменные в процедуре вызываемой из треда(задачи), либо локальные переменные самого треда? По идее выхода из треда(имеется в виду связанной с ним процедуры) нет, значит локальные переменные не разрушаются и без статик. вероятно Ваш совет к этой теме тоже имеет отношение, сейчас прпробую. Благодарю Вас за ответ Цитата(ViKo @ Jan 5 2016, 23:37)  Стек для задач попробуйте увеличить. Помогло. Премного благодарен. Успехов в новом году.
|
|
|
|
|
Jan 10 2016, 09:05
|

Местный
  
Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021

|
Цитата(nanorobot @ Jan 5 2016, 22:03)  Я ко всем описаниям локальных параметров добавил спецификатор static. Проблема ушла. Хороший повод спросить более грамотных товарищей - имееи ли смысл об'являть статическими локальные переменные в процедуре вызываемой из треда(задачи), либо локальные переменные самого треда? Побороли симптом. Спецификатором static вы переместили эти переменные из стека туда же, где хранятся глобальные переменные. Возможно стек текущей задачи портился другой задачей. Теперь вы текущую задачу от этого защитили, а задача, которая портила ей стек, портит его другой задаче. :-)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|