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

часто валиться 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

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


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

Что видно:

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

- R12 содержит что-то похожее на ключ, например, доступа во флэш.

 

Из опыта:

- слеты часто проявляются при недостатке кучи или стэка.

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

 

Поэтому:

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

- если таки есть запись во флэш, проверить, куда запись идет.

Изменено пользователем IgorKossak
бездумное цитирование

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


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

Поставте нормальный обработчик HF и посмотрите подробнее.
Что есть нормальный обработчик? Где его взять? Есть пример?

 

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


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

Есть Fault регистры, по ним можно понять причину сбоя.

В отладчике можно найти команду, на которой улетает.

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


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

Всем привет. У меня тоже самое на stm32f103zet6. На обыкновенной команде Line_Config для экрана летит в hardfault. Сегодня целый день мучился,думаю завтра получится, сообщу.

 

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


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

Что есть нормальный обработчик? Где его взять? Есть пример?

 

Вот к примеру

http://forum.easyelectronics.ru/viewtopic....p;view=previous

 

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

 

Но судя по вашему первоначальному посту, у вас уже что-то такое есть :)

 

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


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

Но судя по вашему первоначальному посту, у вас уже что-то такое есть :)
Да, именно такой. Но х893 предлагает не такой, как у меня, а нормальный. Вот я и спрашиваю - что значит нормальный?

 

 

Проблему решил. Есть связка.... во внешнюю периферию по SPI+DMA пишу данные.... в один момент в регистре дма с адресом памяти ОЗУ было не то значение. По DMA из SPI писалось куда-то не туда, происходил HF.

 

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


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

часто валиться 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,все остальное заменяйте собственными реализациями

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


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

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

 

http://electronix.ru/forum/index.php?showt...=121871&hl=

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


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

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

Честно интересуюсь, без стёба.

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


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

Видимо, речь идет про конкретный случай. Меня писать свой printf как-то не климатит...

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


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

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

Какой ужас. Рубрика "Вредные советы" :cranky:

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


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

это действительно обоснованный практикой совет или просто по-пугать?

Честно интересуюсь, без стёба.

Да нет особого стёба. Я написал свой printf. Точнее просто сделал п/п вывода чисел различных. В том числе с плавучкой.

Вы же должны понимать как стандартный работает. Там через список передаются параметры и шаблон вывода. Получается, что при обработке тратится значительное количество памяти на стеке.

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

Применение своих п/п вывода экономит эту память. В моём случае скорости особой не требовалось, так как это происходило при выводе на дисплей, принтер, ну и в HTTP задаче.

 

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

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


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

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

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

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

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

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

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

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

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

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