Обмен технологиями

Устранение проблем, связанных со сбоем STM32

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Предисловие

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

1. Описание проблемы

Вставьте сюда описание изображения
Выше приведена информация о сбое печати. ​​После расследования было обнаружено, что глубина стека таймера FreeRTOS была установлена ​​слишком маленькой. В функции запуска таймера выполнялось слишком много содержимого, и каждая локальная переменная занимала слишком много памяти. не был выпущен вовремя, и в конечном итоге произошел сбой.

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

Поэтому размер памяти, используемой таймером, также необходимо настроить.

2. Регистры STM32 (ядро Cortex M4)

Вставьте сюда описание изображения
R0~R12 — регистры общего назначения.

R13 — это указатель стека, и физически существует два указателя стека:Указатель основного стека (MSP) — это указатель стека по умолчанию, который будет выбран для использования после сброса и когда процессор находится в режиме обработки. Другой указатель стека — это указатель стека процесса (PSP), который можно использовать только в потоке; режим (при наличии ОСРВ) )

R14 — это регистр связи (LR), используемый для сохранения адреса возврата при вызове функции или подпрограммы. В конце функции или подпрограммы управление программой может вернуться к вызывающей программе, загрузив значение LR в счетчик программ (ПК) и продолжить выполнение. Во время обработки исключения LR будет автоматически обновлен до специального EXC_RETURN (возврат исключения). ) ценить.

Например, a вызывает b. В это время адрес подфункции b помещается в указатель pc, а адрес a помещается в LR. После выполнения b адрес a помещается в указатель PC. из ЛР для исполнения.

3. Анализ проблем сбоев

3.1 Откуда берется информация о сбое?

Сбой в работе на самом деле является нештатным прерыванием. Когда происходит прерывание, процессор сохраняет текущий статус задачи в стек.

  • стек кадров
    Вставьте сюда описание изображения
    Кадр стека относится к области памяти, используемой для сохранения параметров функции, локальных переменных, адресов возврата и другой информации во время вызова функции.

    Когда вызывается функция, STM32 выделяет для нее кадр стека. Размер кадра стека зависит от таких факторов, как количество параметров, количество локальных переменных и настройки оптимизации компилятора.

    Объединив приведенную выше информацию, мы можем знать, что если мы хотим узнать, какая функция завершилась сбоем при сбое функции, нам нужно найти кадр стека, который был помещен в стек при срабатывании прерывания исключения, и этот кадр стека находится в R13. (Точка стека) Указатель стека Сохраняется.

    Мы находим способ получить содержимое, на которое указывает указатель регистра R13, в функции обработки сбоев HardFault_Handler(), а затем распечатать его.

3.2 Значение каждого ключевого слова в информации о сбое

Микроконтроллер STM32 использует ядро ​​ARM Cortex-M, которое имеет два указателя стека: один — указатель основного стека (MSP), а другой — указатель стека процесса (PSP).

MSP (указатель основного стека): указатель основного стека в основном используется для ядра операционной системы или процедуры обработки прерываний.

PSP (указатель стека процесса): указатель стека процесса в основном используется пользовательскими приложениями.

Когда ядро ​​Cortex-M возвращается в режим Thread, оно может переключиться обратно на указатель основного стека MSP или указатель стека процесса PSP в соответствии с настройкой регистра CONTROL.

PSP хранит контекст, связанный с запущенным пользовательским приложением. В частности, включите следующее:

一些或全部的通用寄存器的值,这些寄存器在用户程序运行时会使用。

Program Counter(PC):指向下一条将要执行的指令。

Processor Status Register(PSR)的值:包含标志位状态。

Указатель стека: сохраняет местоположение предыдущего кадра стека.

Обычно при переключении задач (или переключении контекста) эта информация сохраняется в стек. При запуске новой задачи ее контекстная информация восстанавливается из стека.

Следует отметить, что конкретный сохраняемый контент будет различаться в зависимости от конкретной стратегии планирования и конструкции операционной системы.

3.3 Используйте информацию о сбое, чтобы найти точку, вызвавшую сбой

Определите значение указателя LR/PC
Вставьте сюда описание изображения
Сначала нам нужно определить, используется ли RTOS. Если да, то наша информация о сбоях должна храниться в PSP.
Нам необходимо сначала считать эту информацию, а затем, зная значения LR и PC, мы сможем найти точку сбоя через Debug в keil5 или найти соответствующую точку сбоя через файл карты, сгенерированный в процессе компиляции.
Вставьте сюда описание изображения

3.4 Как найти проблемные точки по адресам в keil5

Щелкните правой кнопкой мыши в окне дизассемблирования: