моя контактная информация
Почтамезофия@protonmail.com
2024-07-08
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Недавно я обнаружил, что после слияния некоторых кодов на других платформах в STM32 возникла проблема с вылетом, поэтому мне захотелось в целом разобраться в принципах устранения проблем с вылетом на STM32.
Выше приведена информация о сбое печати. После расследования было обнаружено, что глубина стека таймера FreeRTOS была установлена слишком маленькой. В функции запуска таймера выполнялось слишком много содержимого, и каждая локальная переменная занимала слишком много памяти. не был выпущен вовремя, и в конечном итоге произошел сбой.
Давайте поговорим о таймере в FreeRTOS. На самом деле его можно понимать как задачу, которая эквивалентна созданию потока для отслеживания времени, а затем опросу и запросу текущего списка таймеров, чтобы выяснить, время работы какого таймера истекло. это.
Поэтому размер памяти, используемой таймером, также необходимо настроить.
R0~R12 — регистры общего назначения.
R13 — это указатель стека, и физически существует два указателя стека:Указатель основного стека (MSP) — это указатель стека по умолчанию, который будет выбран для использования после сброса и когда процессор находится в режиме обработки. Другой указатель стека — это указатель стека процесса (PSP), который можно использовать только в потоке; режим (при наличии ОСРВ) )
R14 — это регистр связи (LR), используемый для сохранения адреса возврата при вызове функции или подпрограммы. В конце функции или подпрограммы управление программой может вернуться к вызывающей программе, загрузив значение LR в счетчик программ (ПК) и продолжить выполнение. Во время обработки исключения LR будет автоматически обновлен до специального EXC_RETURN (возврат исключения). ) ценить.
Например, a вызывает b. В это время адрес подфункции b помещается в указатель pc, а адрес a помещается в LR. После выполнения b адрес a помещается в указатель PC. из ЛР для исполнения.
Сбой в работе на самом деле является нештатным прерыванием. Когда происходит прерывание, процессор сохраняет текущий статус задачи в стек.
стек кадров
Кадр стека относится к области памяти, используемой для сохранения параметров функции, локальных переменных, адресов возврата и другой информации во время вызова функции.
Когда вызывается функция, STM32 выделяет для нее кадр стека. Размер кадра стека зависит от таких факторов, как количество параметров, количество локальных переменных и настройки оптимизации компилятора.
Объединив приведенную выше информацию, мы можем знать, что если мы хотим узнать, какая функция завершилась сбоем при сбое функции, нам нужно найти кадр стека, который был помещен в стек при срабатывании прерывания исключения, и этот кадр стека находится в R13. (Точка стека) Указатель стека Сохраняется.
Мы находим способ получить содержимое, на которое указывает указатель регистра R13, в функции обработки сбоев HardFault_Handler(), а затем распечатать его.
Микроконтроллер STM32 использует ядро ARM Cortex-M, которое имеет два указателя стека: один — указатель основного стека (MSP), а другой — указатель стека процесса (PSP).
MSP (указатель основного стека): указатель основного стека в основном используется для ядра операционной системы или процедуры обработки прерываний.
PSP (указатель стека процесса): указатель стека процесса в основном используется пользовательскими приложениями.
Когда ядро Cortex-M возвращается в режим Thread, оно может переключиться обратно на указатель основного стека MSP или указатель стека процесса PSP в соответствии с настройкой регистра CONTROL.
PSP хранит контекст, связанный с запущенным пользовательским приложением. В частности, включите следующее:
一些或全部的通用寄存器的值,这些寄存器在用户程序运行时会使用。
Program Counter(PC):指向下一条将要执行的指令。
Processor Status Register(PSR)的值:包含标志位状态。
Указатель стека: сохраняет местоположение предыдущего кадра стека.
Обычно при переключении задач (или переключении контекста) эта информация сохраняется в стек. При запуске новой задачи ее контекстная информация восстанавливается из стека.
Следует отметить, что конкретный сохраняемый контент будет различаться в зависимости от конкретной стратегии планирования и конструкции операционной системы.
Определите значение указателя LR/PC
Сначала нам нужно определить, используется ли RTOS. Если да, то наша информация о сбоях должна храниться в PSP.
Нам необходимо сначала считать эту информацию, а затем, зная значения LR и PC, мы сможем найти точку сбоя через Debug в keil5 или найти соответствующую точку сбоя через файл карты, сгенерированный в процессе компиляции.
Щелкните правой кнопкой мыши в окне дизассемблирования: