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

 
 
 
Reply to this topicStart new topic
> Как отловить глюк, приводящий к HardFault, Появляется и исчезает при добавлении/удалении строк кода
haker_fox
сообщение Sep 27 2016, 07:15
Сообщение #1


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Добрый день, господа!

Я понимаю, что проблема не имеет прямого отношения к FreeRTOS, но всё же.

Я использую версию 8.2.3 на LPC1768. Компилятор IAR 7.5.

Что наблюдается. Периодически прога стала вылетать в HardFault. Причём, если код немного перекомпилировать, буквально добавить/убавить строку, то всё работает прекрасно.

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

Да, включен монитор стека, он не переполняется, либо монитор не ловит ошибку.

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

Спасибо за любой совет!


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 27 2016, 07:56
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(haker_fox @ Sep 27 2016, 10:15) *
Я смотрел на адреса в обработчике HardFault, но не могу понять, как возникает ошибка, т.к. эти адреса указывают то на файлы самой оси, то на мой код.

Помимо адреса у fault'а есть еще и причина, что с ней?

Касательно FreeRTOS, проверьте приоритеты прерываний, в которых используются системные вызовы.
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Sep 27 2016, 07:57
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Код
void HardFault_Handler(void)
{
    volatile bool is_break = false;
    while(!is_break)
    {
    }
}

А вот этот трюк (насколько помню предложен Сергеем Борщ), не помогает найти место откуда вылетело?
Но вообще похоже на проблемы со стеком/хипом. Хип используется, если да, то проверяли?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 27 2016, 08:23
Сообщение #4


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

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



Точно, Fault регистры посмотрите. В книжке Дж. Ю хорошо расписаны.
Простейший обработчик может быть таким:
Код
__asm void HardFault_Handler(void)
{
  B .            ; бесконечный цикл
  BX LR            ; установить программный счетчик сюда и шагнуть
}
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Sep 27 2016, 08:42
Сообщение #5


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(ViKo @ Sep 27 2016, 11:23) *
Точно, Fault регистры посмотрите. В книжке Дж. Ю хорошо расписаны.
Простейший обработчик может быть таким:


Отладчик типа J-Link перехватывает сам все исключения и делает останов. Никаких обработчиков не надо делать.
Лучше смотреть таймлайн и анализировать как с моментом вылета коррелируют события прерываний.
Я бы поставил на то, что проблема скрывается в прерываниях.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Sep 27 2016, 09:08
Сообщение #6


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (aaarrr @ Sep 27 2016, 15:56) *
Помимо адреса у fault'а есть еще и причина, что с ней?

Вот пример моего)
CODE
[HARD FAULT HANDLER]
R0 = 0x18400D4E
R1 = 0x2
R2 = 0x100046E0
R3 = 0x10000648
R12 = 0x21D8
LR [R14] = 0xA0BF  subroutine call return address
PC [R15] = 0xA0D4  program counter
PSR = 0x21000000
BFAR = 0x18400D56
CFSR = 0x8200
HFSR = 0x40000000
DFSR = 0x0
AFSR = 0x0


QUOTE (aaarrr @ Sep 27 2016, 15:56) *
Касательно FreeRTOS, проверьте приоритеты прерываний, в которых используются системные вызовы.

В ней (фриртос) есть фича, которая не позволяет поставить неправильные приоритеты (выдаёт ассерт), или вы о другом?


QUOTE (Kabdim @ Sep 27 2016, 15:57) *
CODE
void HardFault_Handler(void)
{
    volatile bool is_break = false;
    while(!is_break)
    {
    }
}

А вот этот трюк (насколько помню предложен Сергеем Борщ), не помогает найти место откуда вылетело?

Этот трюк вижу впервые.
QUOTE (Kabdim @ Sep 27 2016, 15:57) *
Но вообще похоже на проблемы со стеком/хипом. Хип используется, если да, то проверяли?

Хип-менеджер используют от уважаемого zltigo, выложенный лет пять назад. Вроде в нём все баги выловили...

QUOTE (AlexandrY @ Sep 27 2016, 16:42) *
Лучше смотреть таймлайн и анализировать как с моментом вылета коррелируют события прерываний.
Я бы поставил на то, что проблема скрывается в прерываниях.

С этой техникой не знаком, можно подробнее (ссылочку, например?)
Кстати, под отладчиком оно не возникает (исключение).


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
juvf
сообщение Sep 28 2016, 03:31
Сообщение #7


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

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



Возможно эта тема поможет.
Судя по всему при возникновении исключения выполнялся код в ОЗУ (0xA0D4). Посмотрите команду, которая находится перед 0xA0BF, возможно дело в ней.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Sep 28 2016, 05:37
Сообщение #8


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (juvf @ Sep 28 2016, 11:31) *
Возможно эта тема поможет.
Судя по всему при возникновении исключения выполнялся код в ОЗУ (0xA0D4). Посмотрите команду, которая находится перед 0xA0BF, возможно дело в ней.

Спасибо, погляжу! Но теперь, как на зло, не залетаю туда((( А ситуацию не сохранил, воспроизвести тоже не могу...


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Oct 15 2016, 12:18
Сообщение #9


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

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(haker_fox @ Sep 28 2016, 08:37) *
Спасибо, погляжу! Но теперь, как на зло, не залетаю туда((( А ситуацию не сохранил, воспроизвести тоже не могу...

Как вариант. Проверьте наличие работы по "забытым" указателям.
Это легко приводит к порче стека и чемуугодно, в том числе завесу.
Для отлова аналогичного глюка (с вставкой строк и тд в вышеописанном стиле) помогло
перенос динамически выделеных массивов под static.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 17 2016, 14:58
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (haker_fox @ Sep 27 2016, 12:08) *
Вот пример моего)

У меня еще сохраняется и распечатывается кусочек из 8 значений стека, дабы можно было видеть, как дошли до жизни такой. То что у Вас творится это наверняка порушенный стек с возвратом неведомо куда sad.gif.
Типа так:
Abort:[D] PC:0000BFD8 Op:E5315004 CPSR:00000092
LR:0000C564 SP:40001F88
SP[0]:00000000->00000000->00000000->0000C2E0->
SP[4]:00013413->00000000->E01FC0C4->0000BE58
R0:E59FF018 R1:259FF15C R2:E59FD1B8 R3:CB3FC1D0 R4:3967F46E R5:EFBFF1F0
R6:E0024000 R7:00000002 R8:4000006C R9:00000000 R10:00000001 R11:000007D7
R12:00002000

QUOTE (haker_fox @ Sep 27 2016, 10:15) *
Может быть есть какая-то проблема именно с Cortex-M3 и именно с этой версией, о которой все знают, а я не знаю?

Относительно версий и проблем что-то может быть только в части порта. сравните, что там в 9 версии относительно Вашей поменяли, хотя думаю, что ничего.
Могу свой вариант порта на M3 выложить, то там ничего, насколько я помню, уникального нет.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Nov 9 2016, 03:20
Сообщение #11


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (zltigo @ Oct 17 2016, 22:58) *
Abort:[D] PC:0000BFD8 Op:E5315004 CPSR:00000092
LR:0000C564 SP:40001F88
SP[0]:00000000->00000000->00000000->0000C2E0->
SP[4]:00013413->00000000->E01FC0C4->0000BE58
R0:E59FF018 R1:259FF15C R2:E59FD1B8 R3:CB3FC1D0 R4:3967F46E R5:EFBFF1F0
R6:E0024000 R7:00000002 R8:4000006C R9:00000000 R10:00000001 R11:000007D7
R12:00002000

Давно в эту ветку не заглядывал, а оказывается здесь появились ответы rolleyes.gif Вам не сложно выложить свой обработчик hard_fault'a?


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Nov 25 2016, 10:08
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(aaarrr @ Sep 27 2016, 10:56) *
Касательно FreeRTOS, проверьте приоритеты прерываний, в которых используются системные вызовы.

С FreeRTOS пока не знаком, но например в uCOS функции ОС из ISR-ов просто так вызывать нельзя. Надо такие вызовы обрамлять IsrEnter()/IsrExit().
Возможно в FreeRTOS сделано аналогично.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 25 2016, 13:18
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (haker_fox @ Nov 9 2016, 05:20) *
Давно в эту ветку не заглядывал, а оказывается здесь появились ответы rolleyes.gif Вам не сложно выложить свой обработчик hard_fault'a?

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


QUOTE (jcxz @ Nov 25 2016, 12:08) *
Возможно в FreeRTOS сделано аналогично.

Естественно, что некоторые функции нельзя вызывать из обработчиков, посему есть отдельная группа функций "FromISR". Но это не "универсальное обрамление", а именно специальные функции.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
jcxz
сообщение Nov 25 2016, 14:33
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(zltigo @ Nov 25 2016, 16:18) *
Естественно, что некоторые функции нельзя вызывать из обработчиков, посему есть отдельная группа функций "FromISR". Но это не "универсальное обрамление", а именно специальные функции.

Речь не о функциях, которые нельзя вызывать из ISR (их вызывать по-любому нельзя хоть с обрамлением хоть без, так как это например функции ожидания какого-то объекта синхронизации), а о функциях которые можно вызывать из ISR.
Но всё равно вызовы таких функций ОС должны быть обрамлены парой вызовов OSIntEnter()/OSIntExit(). Первая просто инкрементирует флаг, говорящий что находимся внутри как минимум одного ISR. Вторая - декрементирует этот флаг и если он стал ==0 вызывает функцию OS_SchedNew() - это решедулер просматривающий список задач, выбирающий из них наиболее приоритетную готовую к выполнению и подготавливает её к активации по PendSV.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 25 2016, 17:23
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (jcxz @ Nov 25 2016, 16:33) *
Речь не о функциях, которые нельзя вызывать из ISR....

Да, конечно. Я о том функционале, использование которого принципиально возможно. Тогда это ДРУГИЕ функции ОПТИМАЛЬНО делающие свое дело, а не обернутые универсальные, как в uCOS.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


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


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