Conmutación de contexto y manejo de systick en la serie STM32F

0

Estoy usando una placa STM32F407 para crear mi propio RTOS pequeño y tengo algunas preguntas.

  1. ¿Cómo puedo definir mi propia pila en una ubicación de memoria diferente, para poder tener una pila para cada cola de tareas?

  2. ¿Cómo puedo empujar y hacer estallar en esas pilas en mi controlador de systick, qué registros?

  3. El controlador Systick funciona bien para mí, pero cuando coloco una función en un bucle infinito, deja de funcionar, ¿por qué?

El código de ejemplo para 1 y 2 sería muy apreciado.

Mi código actual está abajo:

#ifdef __cplusplus
extern "C" {
#endif
void SysTick_Handler(void) {
    /*1-Mask all interrupts except for E programs dependency*/
    OSD_maskUnE_Interuppts();
    OSD_SystimerISR();
}
#ifdef __cplusplus
}
#endif

int main(void) {
    SystemCoreClockUpdate();
    SysTick_Config(SystemCoreClock / 100);

    while (1) {}

    return 0;
}
    
pregunta sedfy Elkebear

1 respuesta

1
  

1: ¿cómo definir mi propia pila en una ubicación de memoria diferente una para cada cola de tareas? necesito ejemplo

No necesita hacer nada especial para asignar memoria.

Puede hacerlo de forma estática o dinámica, depende de usted.

Primero decide la cantidad de memoria que deseas para una pila, luego crea una variable de ese tamaño. Por ejemplo, una pila de 1KB podría crearse como:

uint32_t stack[256];

(256 es 1024/4. 32 bis es 4 bytes). Es sólo la memoria. Nada especial.

Lo único especial que debe hacer es establecer el puntero de pila para una tarea o cola cuando cree esa tarea o cola por primera vez. Si tiene una pila descendente, debe establecerla en la dirección de stack más 1kB, de modo que el extremo superior de la pila.

  

2-cómo empujar y hacer estallar en esas pilas en Systic Handler, lo que se registra, necesito un ejemplo

Solo necesitas almacenar el registro de puntero de pila en algún lugar. Donde depende totalmente de ti Si ya tiene una estructura con información de cola, añada un entero de 32 bits (uint32_t) a eso y almacene el puntero de la pila en él.

  

el manejador de 3 systick funciona bien para mí, cuando para probar pongo una función en un bucle infinito, deja de funcionar, ¿por qué?

Muéstrenos su código y podremos descubrir qué hay de malo en él. Tal como está, solo dices "Mi auto está roto. ¿Por qué?".

El método que utilizo para crear tareas es llenar primero el TCB con todos los datos correctos, incluido el valor correcto para el puntero de pila. La tarea se marca como inactiva. Cuando el programador selecciona la tarea, carga el puntero de pila que ya ha elegido en el registro SP y luego ejecuta la tarea. Cuando sale de esa tarea, el SP actual se almacena nuevamente en el TCB para la tarea lista para la próxima vez que sea seleccionado por el programador.

    
respondido por el Majenko

Lea otras preguntas en las etiquetas