|
stm32 Hard fault |
|
|
|
Jan 23 2016, 13:18
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Что видно: - регистры R0..R3 указывают на память, довольно глубоко, туда, где либо стэк, либо куча лежать могут. - R12 содержит что-то похожее на ключ, например, доступа во флэш. Из опыта: - слеты часто проявляются при недостатке кучи или стэка. - если писать из программы во флэш, можно случайно записать в область, откуда как раз программа исполняется - слет гарантирован. Поэтому: - попробуйте увеличить кучу и/или стэк. Это верно как для самописной системы, так и для осей с локальными стеками задач. - если таки есть запись во флэш, проверить, куда запись идет.
Сообщение отредактировал IgorKossak - Jan 23 2016, 20:10
Причина редактирования: бездумное цитирование
|
|
|
|
|
Jan 24 2016, 18:07
|
Группа: Новичок
Сообщений: 1
Регистрация: 17-06-12
Из: Yerevan,Armenia
Пользователь №: 72 367

|
Всем привет. У меня тоже самое на stm32f103zet6. На обыкновенной команде Line_Config для экрана летит в hardfault. Сегодня целый день мучился,думаю завтра получится, сообщу.
|
|
|
|
|
Jan 26 2016, 05:47
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(juvf @ Jan 24 2016, 09:09)  Что есть нормальный обработчик? Где его взять? Есть пример? Вот к примеру http://forum.easyelectronics.ru/viewtopic....p;view=previousДальше его можно творчески расширить, чтобы он читал CFSR, HFSR и т.п. Но судя по вашему первоначальному посту, у вас уже что-то такое есть
|
|
|
|
|
Jan 26 2016, 17:12
|
Участник

Группа: Участник
Сообщений: 63
Регистрация: 25-11-11
Пользователь №: 68 515

|
Цитата(juvf @ Jan 23 2016, 11:47)  часто валиться hf. иногда указывает LR и PC на одно и тоже место.... но иногда на 0х0. Как отловить HF с LR и PC равным нулю? Код [Hard fault handler] ....... LR = 0x0 PC = 0x0 PSR = 0x4000000e Здесь немного более сложный случай...очень вероятно,что исключение возникло в результате команды pop {Rx-Ry,pc} компилятор генерирует эту команду при возврате из подпрограммы,т.е return..в стеке на смешении "PC" почему-то оказался ноль..... попробуйте локализовать место так 1) объявляем глобальную переменную например int __pc; 2) в теле каждой написанной вами функции первым оператором делаем __pc=__current_pc(); 3) возникло исключение-во вкладе disassemble переходим на адрес,хранящейся в этой переменной __pc и по семантике узнаем,в теле какой функции произошло исключение ну и далее анализируем код..на вскидку-как можно реже пользуйтесь кейловскими(иаровскими) библиотечными функциями..как максимум-только malloc/free,все остальное заменяйте собственными реализациями
|
|
|
|
|
Jan 27 2016, 06:07
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(sigmaN @ Jan 27 2016, 02:21)  это действительно обоснованный практикой совет или просто по-пугать? Честно интересуюсь, без стёба. Да нет особого стёба. Я написал свой printf. Точнее просто сделал п/п вывода чисел различных. В том числе с плавучкой. Вы же должны понимать как стандартный работает. Там через список передаются параметры и шаблон вывода. Получается, что при обработке тратится значительное количество памяти на стеке. Но проблема, если честно, не в самом объёме а в том, что это достаточно сильно меняющееся число. Ну и когда у вас несколько задач используют printf, то при анализе размеров стека понимаешь, что его надо увеличивать. В зависимости от сложности выводимой информации, народ указывает размеры до 2к. Вот и получается, что использование printf в трёх задачах - 6к озу. Применение своих п/п вывода экономит эту память. В моём случае скорости особой не требовалось, так как это происходило при выводе на дисплей, принтер, ну и в HTTP задаче. Никто не призывает отказываться от стандартных п/п. Просто надо знать инструмент, который применяешь. В случае с printf, надо автоматически увеличивать объём стека ну и убедится что вы выделили его достаточно. В частности FreeRTOS это позволяет делать.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|