Mi informacion de contacto
Correo[email protected]
2024-07-08
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Recientemente, descubrí que después de fusionar algunos códigos de otras plataformas en STM32, se produjo un problema de falla, por lo que quería aclarar en general los principios para solucionar problemas de falla en STM32.
Lo anterior es información sobre la impresión de fallos. Después de la investigación, se descubrió que la profundidad de la pila del temporizador de FreeRTOS era demasiado pequeña. Había demasiado contenido ejecutándose en la función de ejecución del temporizador y la memoria solicitada por cada variable local era. no se liberó a tiempo y finalmente se produjo un accidente.
Hablemos del temporizador en FreeRTOS. En realidad, puede entenderse como una tarea, que equivale a crear un hilo para mantener el tiempo y luego sondear y consultar la lista de temporizadores actuales para averiguar qué temporizador ha expirado. él.
Por lo tanto, también es necesario configurar el tamaño de la memoria utilizada por el temporizador.
R0~R12 son registros de propósito general
R13 es el puntero de pila y físicamente hay dos punteros de pila:El puntero de pila principal (MSP) es el puntero de pila predeterminado, que se seleccionará para su uso después del reinicio y cuando el procesador esté en modo de procesamiento. El otro puntero de pila es el puntero de pila de proceso (PSP), que solo se puede usar en subprocesos; modo (cuando hay un RTOS))
R14 es el registro de enlace (LR), que se utiliza para guardar la dirección de retorno cuando se llama a una función o subrutina. Al final de la función o subrutina, el control del programa puede regresar al programa que lo llama cargando el valor de LR en el contador del programa (PC) y continuar con la ejecución. Durante el manejo de excepciones, LR se actualizará automáticamente a un EXC_RETURN especial (retorno de excepción). ) valor.
Por ejemplo, a llama a b. En este momento, la dirección de la subfunción b se coloca en el puntero de la PC y la dirección de a se coloca en el LR. Después de ejecutar b, la dirección de a se coloca en el puntero de la PC. desde el LR para su ejecución.
Una falla en el brazo es en realidad una interrupción anormal. Cuando llega la interrupción, el procesador guardará el estado de la tarea actual en la pila.
marco de pila
Stack Frame se refiere a un área de memoria utilizada para guardar parámetros de función, variables locales, direcciones de retorno y otra información durante una llamada de función.
Cuando se llama a una función, STM32 le asignará un marco de pila. El tamaño del marco de pila depende de factores como la cantidad de parámetros, la cantidad de variables locales y la configuración de optimización del compilador.
Combinando la información anterior, podemos saber que si queremos saber qué función falló cuando la función falló, necesitamos encontrar el marco de la pila que se insertó en la pila cuando se activó la interrupción de excepción, y este marco de la pila está en el R13. (Punto de pila) Puntero de pila Almacenado.
Encontramos una manera de obtener el contenido al que apunta el puntero del registro R13 en la función de manejo de fallas HardFault_Handler () y luego imprimirlo.
El microcontrolador STM32 utiliza el núcleo ARM Cortex-M, que tiene dos punteros de pila, uno es el puntero de pila principal (MSP) y el otro es el puntero de pila de proceso (PSP).
MSP (Puntero de pila principal): El puntero de la pila principal se utiliza principalmente para el kernel del sistema operativo o la rutina del servicio de interrupción.
PSP (Puntero de pila de proceso): El puntero de la pila de procesos lo utilizan principalmente las aplicaciones de usuario.
Cuando el núcleo Cortex-M regresa al modo Thread, puede volver al puntero de la pila principal MSP o al puntero de la pila de proceso PSP de acuerdo con la configuración del registro CONTROL.
PSP almacena el contexto relacionado con la aplicación del usuario en ejecución. Incluya específicamente lo siguiente:
一些或全部的通用寄存器的值,这些寄存器在用户程序运行时会使用。
Program Counter(PC):指向下一条将要执行的指令。
Processor Status Register(PSR)的值:包含标志位状态。
Puntero de pila: guarda la ubicación del marco de pila anterior.
Por lo general, al cambiar de tarea (o cambiar de contexto), esta información se guardará en la pila. Cuando se inicia una nueva tarea, su información de contexto se restaurará desde la pila.
Cabe señalar que el contenido específico guardado variará según la estrategia de programación específica y el diseño del sistema operativo.
Determinar el valor del puntero LR/PC
Primero debemos determinar si se utiliza RTOS. Si es así, entonces nuestra información sobre fallas debe almacenarse en la PSP.
Primero debemos leer esta información y luego, después de conocer los valores de LR y PC, podemos encontrar el punto de falla a través de Debug en keil5 o encontrar el punto de falla correspondiente a través del archivo de mapa generado durante el proceso de compilación.
Haga clic derecho en la ventana Desmontaje—