Programación de la transmisión de tramas CAN en un RTOS

1

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á.

    
pregunta fedi

1 respuesta

1
  • Use un solo temporizador.

  • Configure el temporizador durante 10 ms.

  • Defina el tiempo transcurrido como estático e inicialice a 0

  • Defina el selector de albtable como estático e inicialícelo en 0

  • En cada interrupción:

    • Incrementa el tiempo transcurrido en 10

    • Marque albtable [selector de albtable] para ver si el campo de tiempo coincide con el tiempo transcurrido

    • Si los tiempos coinciden,
    • entonces
      • Enviar marco usando albtable [albtable selector]
      • Selector acumulable de incremento
    • Endif

    • Selector de albtable > = número de entradas en albtable []:

      • apagar el temporizador
    • Volver de la interrupción

respondido por el user3629249

Lea otras preguntas en las etiquetas