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.