Estoy planeando utilizar mi tablero STM32 para enviar marcos CAN. Implementé un planificador simple que contiene 10 tareas; Una de las tareas será la responsable del envío de marcos. Para hacer el trabajo declaré una estructura para el marco CAN:
typedef struct
{
unsigned int id;
unsigned char data[];
unsigned char dlc;
unsigned int timeOfSend //This is the time in ms in which a frame should be sent
} tFrame;
Y luego declaré una tabla de los marcos para enviar:
aubFrames[MAX_FRAMES] = {
{0x12, 0xAABBCC, 4, 100},
{0x12, 0xAABBCC, 4, 1000},
{0x12, 0xAABBCC, 4, 2000},
{0x12, 0xAABBCC, 4, 2010}
};
Esto le dice a la placa que envíe el primer cuadro después de 100 ms, el segundo después de 1000 ms, etc.
Lo que realmente hago:
Agregué una nueva tarea en el programador con un período de 10 ms. Esta tarea verificará la tabla aubFrames, y si es el momento de enviar un marco, envía el marco correspondiente. Si no, no hay nada que hacer. El problema con esta solución es que hay una gran pérdida de tiempo. Por ejemplo, para enviar el primer fotograma, el programador accede a esta tarea nueve veces, pero sin nada que hacer.
¿Hay otra solución para que la programación sea más efectiva?
Pensé en usar una interrupción de temporizador, pero no creo que esa sea la buena solución ya que solo hay cuatro temporizadores en la placa y el número de cuadros es más de cuatro, así que en mi opinión, configurar los temporizadores para generar interrupciones para diferentes períodos de tiempo no funcionará.