Программирование ARM nRF5x: устройство BLE зависает и перезапускается Tue, January 25 2022  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

nRF5x: устройство BLE зависает и перезапускается Печать
Добавил(а) microsin   

В примерах SDK коды возврата из функций, которые могут соответствовать сообщениям об ошибках, обычно проверяются макросом APP_ERROR_CHECK. В случае ошибки произойдет вызов функции app_error_handler, которая находится в модуле app_error.c. Вот её код:

#ifndef DEBUG
   NVIC_SystemReset();
#else

Такое поведение задано по умолчанию, когда в проекте не назначено макроопределение DEBUG. Это означает, что в ответ на любой код, который не равен NRF_SUCCESS, будет произведен системный сброс (system reset).

Если в проекте определить DEBUG, то вместо этого действия препроцессором будет подставлен другой код, наподобие следующего (он может меняться в зависимости от версии SDK):

m_error_code = error_code;
m_line_num = line_num;
m_p_file_name = p_file_name;
UNUSED_VARIABLE(m_error_code);
UNUSED_VARIABLE(m_line_num);
UNUSED_VARIABLE(m_p_file_name);
__disable_irq();
while(loop);

В этом коде запрещаются прерывания, и программа уходит в бесконечный цикл while. В этом случае мы можем либо вывести на печать (printf через RTT [2]), либо прочитать (в отладчике) код ошибки, номер строки и имя файла, где был возвращен код ошибки.

Чтобы разрешить эту отладочную обработку ошибок, нужно добавить в проект макроопределение DEBUG. В среде разработки Keil IDE это делается через настройку свойств проекта, и установкой breakpoint в сессии отладки. Как это сделать, по шагам:

1. Установите уровень оптимизации Level 0 (-O0) на закладке C/C++, и добавьте DEBUG в строку определений препроцессора (Preprocessor Symbols -> Define:).

Keil add DEBUG feature

2. Установите breakpoint на строку, следующую за while(loop); (правый клик -> Insert breakpoint).

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

4. Проанализируйте значения переменных, где находится код ошибки, номер строки и имя файла, где эта ошибка произошла.

Обратите внимание на предупреждение в документации про app_error_handler:

@warning Этот обработчик предоставлен только в качестве примера,
и он не должен быть перенесен в конечный продукт. Необходимо
тщательно проанализировать, как устройство должно реагировать
на подобные случаи ошибок в программе.

Если вы посмотрите на стек вызовов (меню View -> Call Stack Window), вы увидите, из какого вызова функции возникла ошибка, и тогда вам придется обратиться к документации этой функции в Infocenter. Коды ошибок, возвращаемые драйверами/библиотеками SDK, обычно являются глобальными кодами ошибок.

[Ссылки]

1. Device is freezing and restarting site:nordicsemi.com.
2. nRF5x: отладка с помощью RTT.

 

Комментарии  

 
0 #1 Andrey 20.09.2021 11:18
Я делаю так в обработчике HardFault:
....всякое....
__BKPT(0);
NVIC_SystemRese t();

И таким образом если проект выполняется под отладкой (jlink, stlink, etc), то отладчик сработает на точке останова, а если без отладки - проект уйдет на перезагрузку. Это под GCC, думаю, что под Keil тоже можно такое провернуть.
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Top of Page