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

 
 
> Тестирование exceptions для STM32, Как гарантированно вызвать обработчики исключений?
Lyrri
сообщение Feb 25 2014, 09:48
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 15-01-11
Из: Киев
Пользователь №: 62 244



В текущем проекте сделал сохранение последнего исключения во внешнюю flash память для дальнейшего анализа (сохранение последней причины перезагрузки системы). Осталось это все дело протестировать. То есть написать тестовый код так, чтобы гарантированно вызвать исключения: NMI, HardFault, MemManage, BusFault, UsageFault.
Нашел как вызвать HardFault на просторах этого форума (попытка чтения по невыровненному адресу).

Код
void make_hard_fault()
{
    __asm volatile
    (
        "MOVS r0, #1       \n"
        "LDM r0,{r1-r2}    \n"
        "BX LR                \n"
    );
}


Как лучше/правильнее протестировать все остальные исключения?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 10)
_Артём_
сообщение Feb 25 2014, 10:03
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Lyrri @ Feb 25 2014, 13:48) *
Как лучше/правильнее протестировать все остальные исключения?

Можно так конечно:
Код
UsageFault();

Но лучше создать условия при который вызываются исключения.
MemManage можно вызвать при нарушении защиты памяти - настройте MPU и прочитайте/запишите куда не положено.
UsageFault - возникает при делении на 0 (один из вариантов).
BusFault - ?? Непонятно как вызвать...
NMI:
Цитата
Non maskable interrupt. The RCC
Clock Security System (CSS) is
linked to the NMI vector.
Go to the top of the page
 
+Quote Post
ig_z
сообщение Feb 25 2014, 15:55
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551



QUOTE (Lyrri @ Feb 25 2014, 11:48) *
Как лучше/правильнее протестировать все остальные исключения?


Классика жанра - деление на ноль. Книги и интернет завалены примерами. У меня так
CODE
#ifdef TEST_HARD_FAULT

int div(int lho, int rho)
{
    return lho/rho;
}

void testFault(void)
{
  int a,b,c;
  a = 10;
  b = 0;

  TT_INFO_NM_STR("test HardFalt handler\n");
  c = div(a, b);
  TT_INFO_NM_MSG("c = a / b; => %d",c);
}

#endif  //ifdef TEST_HARD_FAULT
Go to the top of the page
 
+Quote Post
Lyrri
сообщение Feb 26 2014, 07:09
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 15-01-11
Из: Киев
Пользователь №: 62 244



Цитата(ig_z @ Feb 25 2014, 18:55) *
Классика жанра - деление на ноль. Книги и интернет завалены примерами.

С HardFault вопросов как раз нету. Как, к примеру, BusFault вызвать (кроме, конечно BusFault() )? В каких книгах и интернетах это посмотреть?
Go to the top of the page
 
+Quote Post
adnega
сообщение Feb 26 2014, 07:42
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



А у Вас действительно эти обработчики заведены, настроены и разрешены?
Вам будет какая-то выгода, если вместо одного HardFault будут вызаваться все эти обработчики?
В конце концов есть регистры xFSR.
Естественно, что для "не-fault-овых" исключений (SysTick, NMI{CSS}, SVC) должен быть свой обработчик,
но во флеш при этом сохранять ничего не требуется.
Go to the top of the page
 
+Quote Post
Lyrri
сообщение Feb 26 2014, 08:07
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 15-01-11
Из: Киев
Пользователь №: 62 244



Цитата(adnega @ Feb 26 2014, 10:42) *
Вам будет какая-то выгода, если вместо одного HardFault будут вызываться все эти обработчики?
В конце концов есть регистры xFSR.

Выгод то особых и нету (пока). Для анализа "что же произошло" на этапе тестирования достаточно HardFault.
Go to the top of the page
 
+Quote Post
mantech
сообщение Feb 26 2014, 08:11
Сообщение #7


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(Lyrri @ Feb 25 2014, 13:48) *
В текущем проекте сделал сохранение последнего исключения во внешнюю flash память для дальнейшего анализа (сохранение последней причины перезагрузки системы). Осталось это все дело протестировать.


Может немного не в тему, но для чего все это? Вы уверены, что перезагрузка происходит именно из-за исключительной ситуации, просто у меня еще никогда такого не было...

Сообщение отредактировал mantech - Feb 26 2014, 08:11
Go to the top of the page
 
+Quote Post
Lyrri
сообщение Feb 26 2014, 09:01
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 15-01-11
Из: Киев
Пользователь №: 62 244



Цитата(mantech @ Feb 26 2014, 11:11) *
Может немного не в тему, но для чего все это?

Это все для того чтобы понять что же произошло у конечного пользователя, если что-то пойдет не так. Ведь обычно feedback приходит в виде "А я включил а оно не работает.... Оно то работает то не работает... итд".
Цитата
Вы уверены, что перезагрузка происходит именно из-за исключительной ситуации, просто у меня еще никогда такого не было...

Перегрузка происходит во вачдогу. Если программа застряла в исключении, то пишется тип исключения и содержание соотв. регистров. Если какая-то из задач (у меня FreeRtos) не "отчиталась" за определенный период времени о том что она жива, также произойдет перезагрузка системы по вачдогу. В этом случае во флеш будет записано имя повисшей задачи.
Go to the top of the page
 
+Quote Post
adnega
сообщение Feb 26 2014, 10:41
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(mantech @ Feb 26 2014, 12:11) *
Может немного не в тему, но для чего все это? Вы уверены, что перезагрузка происходит именно из-за исключительной ситуации, просто у меня еще никогда такого не было...

+1
Исключительная ситуация возникает крайне редко. Чаще всего на этапе разработки софта.
В жизни (у разработанного изделия) ниразу не видел HardFault.

Цитата(Lyrri @ Feb 26 2014, 13:01) *
Это все для того чтобы понять что же произошло у конечного пользователя, если что-то пойдет не так. Ведь обычно feedback приходит в виде "А я включил а оно не работает.... Оно то работает то не работает... итд".

Перегрузка происходит во вачдогу. Если программа застряла в исключении, то пишется тип исключения и содержание соотв. регистров. Если какая-то из задач (у меня FreeRtos) не "отчиталась" за определенный период времени о том что она жива, также произойдет перезагрузка системы по вачдогу. В этом случае во флеш будет записано имя повисшей задачи.

Это большое везенье если попали в HardFault.
Чаще всего программа работает как она написана, просто не все варианты разработчик учел.
С FreeRTOS чтобы попасть в HardFault или получить "странное" поведение системы достаточно запутаться с приоритетами прерываний
(на форуме обсуждалось неоднократно).
Был случай, когда у меня переполнялся софтовый таймер раз в 24 дня. Пока понял что к чему прошло пол года.
Изделие эксплуатировалось на столбе на автодороге (остановочное табло). После перезагрузки исправно работало
ровно 24 дня столько-то часов столько-то минут. Если бы сделал автоматическую перезагрузку, то в жизни бы не узнал
об ошибке).
Сейчас делаю watchdog, но по-умолчанию отключаю, чтоб проблему было явно видно.
Насчет обратной связи полностью с Вами согласен))
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 26 2014, 11:49
Сообщение #10


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

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



У меня так. А какое исключение вызывается, не помню. :-)
Код
/*!****************************************************************************
@brief        HardFault generate
@details    Создать исключительное событие (для проверки)
@param        none
@return    
@note        Create unaligned multiple load/store
*/
__asm void HardFault_generate(void) {
  MOVS R0, #1
  LDM R0, {R1-R2}
  B .
}

Ой, это то же самое, что в первом сообщении!
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Feb 27 2014, 20:35
Сообщение #11


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(ViKo @ Feb 26 2014, 15:49) *
... А какое исключение вызывается, не помню. :-)..

sm.gif
чукча не читатель, чукча писатель (из анекдота)

там как бы название функции само за себя говорит

"HardFault_generate"
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 24th August 2025 - 14:06
Рейтинг@Mail.ru


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