中文页 | English
CmBacktrace (Cortex Microcontroller Backtrace) — это библиотека с открытым исходным кодом, которая автоматически отслеживает и определяет коды ошибок для микроконтроллеров серии ARM Cortex-M, а также автоматически анализирует причины ошибок. Основные функции включают:
Поддержка следующих типов ошибок:
Автоматическая диагностика причины сбоя: при возникновении сбоя можно автоматически проанализировать причину сбоя и определить местоположение кода сбоя без необходимости вручную анализировать сложные регистры неисправностей;
Вывод стека вызовов функций на сайте ошибки (необходимо сотрудничать с инструментом addr2line для точного позиционирования), восстановление информации о поле при возникновении ошибки, более быстрое и точное определение местоположения проблемного кода и логики. Вы также можете использовать библиотеку в обычных условиях для получения текущего стека вызовов функций;
Поддержка «голого металла» и следующих платформ операционных систем:
В зависимости от состояния сцены ошибки вывод соответствующего стека потоков или основного стека C;
Информация о диагностике неисправностей поддерживает несколько языков (в настоящее время: упрощённый китайский, английский);
Адаптируется к микроконтроллерам Cortex-M0/M3/M4/M7;
Поддерживает компиляторы IAR, KEIL, GCC.
Новичок: Для новичков, которые переходят от простых микроконтроллеров, таких как C51 и MSP430, к более сложным ARM, вероятность «hard falut» смерти время от времени может ошеломить новичков. Метод определения ошибок часто заключается в подключении к эмулятору, пошаговом выполнении F10/F11, определении конкретного кода ошибки, а затем предположении, устранении и обдумывании причины ошибки. Этот процесс очень болезненный.
Опытный ветеран: Постепенно все узнают, что причину неисправности и адрес кода неисправности можно определить по информации регистра неисправностей. Хотя это может решить небольшую часть проблемы, повторяющийся и утомительный процесс анализа также займёт много времени. Более того, для некоторых сложных проблем невозможно решить только по адресу кода, и необходимо восстановить логическую связь между вызовами функций в ошибочной сцене. Хотя стек вызовов функций можно просмотреть, подключившись к эмулятору, его нельзя отобразить в состоянии неисправности, поэтому необходимо пошагово выполнять F10/F11 для определения кода ошибки. Кроме того, есть два сценария:
Поэтому определить такие проблемы ещё сложнее.
Используйте эту библиотеку: Все вышеперечисленные проблемы можно легко решить. Сообщение об ошибке можно вывести на консоль, а сообщение об ошибке также можно сохранить с помощью функции Log EasyFlash во Flash, последнее сообщение об ошибке всё ещё можно прочитать после сбоя устройства и перезапуска. Информация, выводимая CmBacktrace, включает в себя стек вызовов функций, результаты диагностики неисправностей, стек, регистр неисправностей и информацию о прошивке продукта, что значительно повышает эффективность и точность определения местоположения ошибок.
Как говорится, работник должен сначала наточить свои инструменты, если он хочет хорошо выполнять свою работу. Поэтому иногда причина низкой эффективности может заключаться в том, что вы будете использовать слишком мало видов инструментов.
Сотрудничество, вклад: Разработка открытого исходного кода. Программное обеспечение неотделимо от поддержки каждого. Вы можете вносить больше предложений, и надеемся, что больше людей присоединится и будет улучшать проект вместе с вами.
Если вы считаете этот проект с открытым исходным кодом отличным, вы можете нажать Project Homepage (Github|OSChina|Coding) и поставить звёздочку в правом верхнем углу. Одновременно порекомендуйте его друзьям, которые в нём нуждаются.
Демонстрация разделена на следующие шаги:
Каталог | Платформа | Ссылка |
---|---|---|
\demos\non_os\stm32f10x |
bare metal STM32 Cortex-M3 | нажмите для просмотра |
\demos\os\rtthread\stm32f4xx |
RT-Thread STM32 Cortex-M4 | Нажмите для просмотра |
\demos\os\ucosii\stm32f10x |
UCOSII STM32 Cortex-M3 | Нажмите для просмотра |
\demos\os\freertos\stm32f10x |
FreeRTOS STM32 Cortex-M3 | Нажмите для просмотра |
\demos
, если есть похожая, рекомендуется модифицировать её на основе существующей.\src
в проект продукта и убедитесь, что каталог исходного кода добавлен в путь к файлу заголовка.HardFault_Handler
.HardFault_Handler
) для выполнения. Подробности см. в описании API ниже.Имя файла конфигурации: cmb_cfg.h
, пользователи должны настраивать его самостоятельно для разных платформ и сценариев. Общие конфигурации следующие:
Имя конфигурации | Функция | Примечания |
---|---|---|
cmb_println(...) | Вывод информации об ошибках и диагностике | Должна быть настроена |
CMB_USING_BARE_METAL_PLATFORM | Используется ли на платформе bare metal | Определите этот макрос, если он используется |
CMB_USING_OS_PLATFORM | Используется ли на платформе операционной системы | Операционная система и bare metal должны выбрать одну из двух |
CMB_OS_PLATFORM_TYPE | Платформа операционной системы | RTT/UCOSII/UCOSIII/FREERTOS |
CMB_CPU_PLATFORM_TYPE | Платформа процессора | M0/M3/M4/M7 |
CMB_USING_DUMP_STACK_INFO | Использовать ли функцию дампа стека | Используйте для определения этого макроса |
CMB_PRINT_LANGUAGE | Язык вывода информации | CHINESE/ENGLISH |
Примечание: Содержание вышеуказанной конфигурации можно выбрать в
cmb_def.h
, пожалуйста, прочитайте исходный код для более гибкой настройки.
void cm_backtrace_init(const char *firmware_name, const char *hardware_ver, const char *software_ver)
Параметр | Описание |
---|---|
firmware_name | Имя прошивки, которое должно соответствовать имени прошивки, сгенерированному компилятором |
hardware_ver | Номер версии оборудования, соответствующий прошивке |
software_ver | Версия программного обеспечения прошивки |
Примечание: указанные выше входные параметры будут выводиться в случае утверждения или сбоя, в основном для ретроспективных целей.
size_t cm_backtrace_call_stack(uint32_t *buffer, size_t size, uint32_t sp)
Параметр | Описание |
---|---|
buffer | Буфер для хранения стека вызовов функций |
size | Размер буфера |
sp | Указатель стека, который должен быть получен |
Пример:
/* Создаём буфер стека вызовов функций глубиной 16, глубина не должна превышать CMB_CALL_STACK_MAX_DEPTH (по умолчанию 16) */
uint32_t call_stack[16] = {0};
size_t i, depth = 0;
/* Получаем стек вызовов функций в текущей среде, каждый элемент будет сохранён как 32-битный адрес, а depth — фактическая глубина стека вызовов функций */
depth = cm_backtrace_call_stack(call_stack, sizeof(call_stack), cmb_get_sp());
/* Выводим текущую информацию о стеке вызовов функций
* Примечание: при просмотре имени функции и конкретной строки номера необходимо использовать инструмент addr2line для преобразования */
for (i = 0; i <depth; i++) {
printf("%08x ", call_stack[i]);
}
void cm_backtrace_assert(uint32_t sp)
Параметр | Описание |
---|---|
sp | Указатель стека при утверждении среды |
Примечание: входной параметр SP должен быть получен внутри функции утверждения как можно больше и как можно ближе к началу функции утверждения. При использовании во вложенной функции функции утверждения (например, в методе перехвата утверждения RT-Thread) из-за вложенности функции происходит регистрация стека, и в это время SP изменяется, требуется ручная настройка (добавление и вычитание фиксированного значения отклонения) в значение параметра, поэтому новичкам не рекомендуется использовать эту функцию во вложенной функции утверждения.
void cm_backtrace_fault(uint32_t fault_handler_lr, uint32_t fault_handler_sp)
Параметр | Описание |
---|---|
fault_handler_lr | Значение регистра LR в среде функции обработки ошибок |
fault_handler_sp | Значение указателя стека в среде функции обработки ошибок |
Эту функцию можно вызвать в функции обработки ошибок (например: HardFault_Handler
). Кроме того, сама библиотека предоставляет файлы сборки, обработанные HardFault
(нажмите, чтобы просмотреть, вам нужно выбрать в соответствии с вашим собственным компилятором), метод cm_backtrace_fault
автоматически вызывается в случае ошибки. Поэтому при переносе проще всего использовать файл сборки напрямую.
Нажмите, чтобы посмотреть учебник: Поддержка Open Keil/IAR/GCC C99 за один шаг
Когда используется предоставленный этой библиотекой файл сборки cmb_fault.s, поскольку HardFault_Handler уже определён в файле сборки, если эта функция определена где-либо ещё в проекте, будет выдана ошибка повторного определения HardFault_Handler. В настоящее время есть два решения:
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )