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

 
 
> Nested interrupts and Hard Fault, Происходит hard fault если есть вложенные прерывания
xelax
сообщение Jun 21 2016, 13:08
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Исходные данные.
Код для cortex-m4 (nrf52), язык С, компилятор Keil.

Ситуация следующая. В принципе все ок и работает. Работаем в основном с GCC, но по условиям ТЗ код должен собираться и работать также на IAR и Keil, так что периодически билдим и запускаем код на них.
GCC и IAR работают без проблем. Keil падает в hard fault в рандомном месте. Первые подозрения были на проезды по памяти. Детальное исследование одного из падений показало, что hard fault случается так как портится значение в регистре общего назначения r5, который используется компилятором внутри функции как базовый адрес для работы с периферией. Внутри функции r5 не обновляется (записывается константа при входе в функцию один раз). То есть предположение проезда по памяти отпадает.
Второе предположение что поведение ломают вложенные прерывания подтвердилось. Сделали все прерывания одинакового приоритета hard fault исчез.

Вроде как баг исчез и стоит порадоваться, но очень похоже на черную магию, так как логического объяснения такому поведению не можем дать. Сохранение регистров в стек и восстановление везде присутствует (как минимум тщательно проверил сохранение\восстановление контекста в функции где упал в hard fault и тела высокоприоритетного прерывания).

Кто-нибудь может дать теоретически обоснованную модель такому поведению, чтобы понять куда еще стоит посмотреть?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
romas2010
сообщение Jun 21 2016, 16:37
Сообщение #2


Участник
*

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



Цитата(xelax @ Jun 21 2016, 16:08) *
Исходные данные.
Код для cortex-m4 (nrf52), язык С, компилятор Keil.
.......
Второе предположение что поведение ломают вложенные прерывания подтвердилось. Сделали все прерывания одинакового приоритета hard fault исчез.
.....
Кто-нибудь может дать теоретически обоснованную модель такому поведению, чтобы понять куда еще стоит посмотреть?


Судя по приведенному ниже дизассемблеру, код кейл скомпилировал с опцией --use_frame_pointer. C этой опцией кейл генерит некорректный выход из функции..Попробуйте скомпилировать без нее...и еще нюанс-отключите оптимизацию,то есть --O0
Go to the top of the page
 
+Quote Post
xelax
сообщение Jun 22 2016, 13:11
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Цитата(romas2010 @ Jun 21 2016, 19:37) *
Судя по приведенному ниже дизассемблеру, код кейл скомпилировал с опцией --use_frame_pointer. C этой опцией кейл генерит некорректный выход из функции..Попробуйте скомпилировать без нее...и еще нюанс-отключите оптимизацию,то есть --O0

Да мы действительно используем --use_frame_pointer. r11 как раз компилятором отводится под frame pointer. Можно поподробней о некорректном выходе из функции? есть какая-нибудь errata или ссылка на описание проблемы?
И оптимизацию зачем выключать? Мы без нее на финальном этапе проекта не влезем в размер памяти, отведенный нам по ТЗ.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 12:14
Рейтинг@Mail.ru


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