реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> stm32 Hard fault
juvf
сообщение Jan 23 2016, 08:47
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



часто валиться hf. иногда указывает LR и PC на одно и тоже место.... но иногда на 0х0. Как отловить HF с LR и PC равным нулю?
Код
[Hard fault handler]
R0 = 0x20003d28
R1 = 0x20003db8
R2 = 0x20006230
R3 = 0x20006230
R12 = 0xa5a5a5a5
LR = 0x0
PC = 0x0
PSR = 0x4000000e
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Jan 23 2016, 13:18
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Что видно:
- регистры R0..R3 указывают на память, довольно глубоко, туда, где либо стэк, либо куча лежать могут.
- R12 содержит что-то похожее на ключ, например, доступа во флэш.

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

Поэтому:
- попробуйте увеличить кучу и/или стэк. Это верно как для самописной системы, так и для осей с локальными стеками задач.
- если таки есть запись во флэш, проверить, куда запись идет.

Сообщение отредактировал IgorKossak - Jan 23 2016, 20:10
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
x893
сообщение Jan 23 2016, 18:07
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Поставте нормальный обработчик HF и посмотрите подробнее.
Go to the top of the page
 
+Quote Post
juvf
сообщение Jan 24 2016, 06:09
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(x893 @ Jan 23 2016, 23:07) *
Поставте нормальный обработчик HF и посмотрите подробнее.
Что есть нормальный обработчик? Где его взять? Есть пример?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 24 2016, 08:51
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Есть Fault регистры, по ним можно понять причину сбоя.
В отладчике можно найти команду, на которой улетает.
Go to the top of the page
 
+Quote Post
ARMSTM
сообщение Jan 24 2016, 18:07
Сообщение #6





Группа: Новичок
Сообщений: 1
Регистрация: 17-06-12
Из: Yerevan,Armenia
Пользователь №: 72 367



Всем привет. У меня тоже самое на stm32f103zet6. На обыкновенной команде Line_Config для экрана летит в hardfault. Сегодня целый день мучился,думаю завтра получится, сообщу.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Jan 26 2016, 05:47
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(juvf @ Jan 24 2016, 09:09) *
Что есть нормальный обработчик? Где его взять? Есть пример?


Вот к примеру
http://forum.easyelectronics.ru/viewtopic....p;view=previous

Дальше его можно творчески расширить, чтобы он читал CFSR, HFSR и т.п.

Но судя по вашему первоначальному посту, у вас уже что-то такое есть sm.gif
Go to the top of the page
 
+Quote Post
juvf
сообщение Jan 26 2016, 07:39
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(Непомнящий Евгений @ Jan 26 2016, 10:47) *
Но судя по вашему первоначальному посту, у вас уже что-то такое есть sm.gif
Да, именно такой. Но х893 предлагает не такой, как у меня, а нормальный. Вот я и спрашиваю - что значит нормальный?


Проблему решил. Есть связка.... во внешнюю периферию по SPI+DMA пишу данные.... в один момент в регистре дма с адресом памяти ОЗУ было не то значение. По DMA из SPI писалось куда-то не туда, происходил HF.
Go to the top of the page
 
+Quote Post
x893
сообщение Jan 26 2016, 08:15
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Например
1
2
3
и еще 100500 описаний хэндлера
Go to the top of the page
 
+Quote Post
romas2010
сообщение Jan 26 2016, 17:12
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 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,все остальное заменяйте собственными реализациями
Go to the top of the page
 
+Quote Post
Quasar
сообщение Jan 26 2016, 17:28
Сообщение #11


Местный
***

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



Еще топикстартеру надо сверить ревизии, а то мало ли, как в моем случае окажется...

http://electronix.ru/forum/index.php?showt...=121871&hl=
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jan 26 2016, 23:21
Сообщение #12


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
на вскидку-как можно реже пользуйтесь кейловскими(иаровскими) библиотечными функциями..как максимум-только malloc/free,все остальное заменяйте собственными реализациями
это действительно обоснованный практикой совет или просто по-пугать?
Честно интересуюсь, без стёба.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Alechek
сообщение Jan 27 2016, 05:43
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Видимо, речь идет про конкретный случай. Меня писать свой printf как-то не климатит...
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 27 2016, 06:02
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(romas2010 @ Jan 26 2016, 20:12) *
на вскидку-как можно реже пользуйтесь кейловскими(иаровскими) библиотечными функциями..как максимум-только malloc/free,все остальное заменяйте собственными реализациями

Какой ужас. Рубрика "Вредные советы" cranky.gif
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 27 2016, 06:07
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(sigmaN @ Jan 27 2016, 02:21) *
это действительно обоснованный практикой совет или просто по-пугать?
Честно интересуюсь, без стёба.

Да нет особого стёба. Я написал свой printf. Точнее просто сделал п/п вывода чисел различных. В том числе с плавучкой.
Вы же должны понимать как стандартный работает. Там через список передаются параметры и шаблон вывода. Получается, что при обработке тратится значительное количество памяти на стеке.
Но проблема, если честно, не в самом объёме а в том, что это достаточно сильно меняющееся число. Ну и когда у вас несколько задач используют printf, то при анализе размеров стека понимаешь, что его надо увеличивать. В зависимости от сложности выводимой информации, народ указывает размеры до 2к. Вот и получается, что использование printf в трёх задачах - 6к озу.
Применение своих п/п вывода экономит эту память. В моём случае скорости особой не требовалось, так как это происходило при выводе на дисплей, принтер, ну и в HTTP задаче.

Никто не призывает отказываться от стандартных п/п. Просто надо знать инструмент, который применяешь. В случае с printf, надо автоматически увеличивать объём стека ну и убедится что вы выделили его достаточно. В частности FreeRTOS это позволяет делать.
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 01:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.01512 секунд с 7
ELECTRONIX ©2004-2016