De alguna manera, tienes razón en la corteza m (que es tu stm32, aunque no puedo decir qué variante a menos que especifiques una parte) hay un puntero de pila activo r13
, sin embargo, esto puede ser MSP
o PSP
.
El motivo de dos es permitir al usuario implementar fácilmente un 'sistema operativo' multitarea.
La idea es que las tareas individuales utilicen el puntero de pila de proceso o PSP
, y el núcleo use el MSP
.
Cuando ocurre una excepción, un marco de pila se empuja al puntero de pila actualmente activo, y luego cambia para usar el MSP
para el controlador de excepciones. En un sistema multitarea, si el programador causó la excepción, es en este punto que cambia donde PSP
apunta a ser el puntero de pila para la siguiente tarea, y regresa de la excepción. El desapilado del nuevo puntero de pila luego vuelve a la ejecución para la siguiente tarea.
Si desea ver un ejemplo de código usando ambos, un programador que escribí para Cortex M4f está disponible en BitBucket , No está documentado, pero es bastante sencillo. Se utiliza una instrucción svc
para iniciar el programador, y luego las excepciones pendsv
manejan el cambio de tarea, la función Tick
debe llamarse desde un temporizador para asegurar el cambio de tarea.