Programación integrada de tareas del sistema para la adquisición de datos en una red CAN

1

Estoy teniendo problemas con el concepto de cómo programar mis tareas.

Mi configuración: STM32F103 conectado a CAN. Tomar medidas con un módulo Lidar V3 se comunica a través de I2C y luego distribuir esa medida en la CAN

La interrupción 1 es una interrupción del temporizador de 1 ms para iniciar el envío de mensajes en CAN

la interrupción 2 está activa al recibir el mensaje CAN

También tengo que sondear un registro a través de I2C en la unidad LIDAR para asegurar que la medición haya terminado antes de poder usar I2C para leer el registro de distancia, fragmento de código que se muestra a continuación

        status = CheckLidarStatus();

        while ((status & LIDAR_BUSY) == LIDAR_BUSY)
        {
            status = CheckLidarStatus();
        }

Lo que creo que es el flujo correcto que debería tomar mi programa se muestra a continuación:

Misprincipalespreocupacionesson:

  1. ¿Elflujopareceunaformalógicadeabordaresto?

  2. Sidoyprioridadalainterrupcióndeltemporizador(enlugardeRXint)paralatransmisiónCAN,¿estoafectaránegativamentealaredCAN,esdecir,nosetratadelosmensajesCANrecibidosconlasuficienterapidez?

  3. SialgunadelasinterrupcionesestáactivadurantelascomunicacionesI2C,¿causaráquelascomunicacionesI2Cse"caigan"?

  4. ¿Es aceptable sentarse en un bucle mientras espera que el estado de Checklidar vuelva como no ocupado, o hay una mejor manera de hacerlo?

pregunta Pop24

2 respuestas

3
  1. Sí, me parece lógico. Aunque, ¿cuál es la cantidad máxima de tiempo que el periférico LIDAR podría estar ocupado? Si eso es más de 1 milisegundo, entonces podría perder una oportunidad de transmisión. Tal vez el caso ocupado debería simplemente saltarse los datos leídos en lugar de regresar para sondear el estado.

  2. Sí, el controlador de interrupción de menor prioridad se mantendrá apagado mientras se ejecuta el controlador de interrupción de mayor prioridad. Si el controlador de interrupción del temporizador de mayor prioridad se ejecuta más tiempo del necesario para que el periférico CAN reciba suficientes mensajes para desbordar, perdería los mensajes. Es por eso que es una buena regla general mantener cortos los manejadores de interrupciones. Y si toda la interrupción del temporizador es establecer una marca, entonces dudo que tengas un problema.

    Otra forma de considerar esto es cuál es la penalización cuando uno de los controladores de interrupciones se retrasa por el otro. Cuando la interrupción de CAN se retrasa por la interrupción del temporizador, agregará un retraso a la respuesta de CAN o, en el peor de los casos, enviará un mensaje. Cuando la interrupción del temporizador es retrasada por la interrupción CAN, entonces usted agregaría jitter a la interrupción del temporizador. El peor de los casos sería perder un milisegundo, pero la interrupción CAN tendría que durar más de un milisegundo para que eso suceda. Entonces, ¿qué es menos deseable para su aplicación, un poco de retraso o un poco de jitter?

  3. Es dudoso que alguna interrupción interrumpa las comunicaciones I2C. Probablemente esté usando un controlador I2C periférico que transmite / recibe bits, en su mayoría independientemente de la CPU. El controlador I2C continuará registrando bits de entrada y salida, según sea necesario, sin el efecto de las interrupciones. (Si golpeara cada bit, entonces habría más impacto porque los relojes individuales podrían alargarse por una interrupción no relacionada. Pero incluso eso no es necesariamente un problema debido a la naturaleza sincrónica de I2C. El dispositivo esclavo no debería ». No importa si los pulsos del reloj I2C se alargan.)

  4. Puede ser aceptable sondear el estado lidar. Si no tienes nada más que hacer para la CPU, ¿cuál es el problema? Pero si el periférico LIDAR tiene una interrupción de "datos preparados" de algún tipo, entonces podría habilitar esa interrupción y esperar la interrupción en lugar de sondear el estado.

respondido por el kkrambo
2

Es la naturaleza de CAN que cuando intenta enviar un mensaje, puede experimentar colisiones con los mensajes de prioridad más alta que necesita recibir y procesar.

Su propuesta muestra ISR extremadamente simples que simplemente establecen indicadores, con todo el trabajo real realizado en un solo hilo de fondo (sin ISR).

No estoy familiarizado con los detalles del controlador CAN del STM32 y específicamente con cuán autónomo podría ser, pero su propuesta parece inadecuada con respecto a este problema.

    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas