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:). 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. |