Estoy luchando con el concepto de cómo programar mis tareas.
Mi configuración: STM32F103 conectado a CAN. Tomando medidas con un módulo Lidar V3 de comunicaciones a través de I2C, luego distribuyendo esa medida en el 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 asegurarme de que la medición haya finalizado 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 debe tomar mi programa se muestra a continuación:
Mis principales preocupaciones son:
¿El flujo parece una forma lógica de abordar esto?
Si doy prioridad a la interrupción del temporizador (en lugar de RX int) para la transmisión CAN, ¿afectará esto negativamente a la red CAN, es decir, no tratará los mensajes CAN recibidos con la suficiente rapidez?
Si cualquiera de las interrupciones está activa durante las comunicaciones I2C, ¿provocará que las comunicaciones I2C se "caigan"?
¿Es aceptable sentarse en un ciclo while esperando que el estado de Checklidar regrese como no ocupado, o hay una mejor manera de hacerlo?
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, podría perder una oportunidad de transmisión. Tal vez el caso ocupado debería simplemente omitir la lectura de datos en lugar de volver a sondear el estado.
Sí, el controlador de interrupciones de menor prioridad se mantendrá desactivado mientras se ejecuta el controlador de interrupciones de mayor prioridad. Si el controlador de interrupción del temporizador de mayor prioridad se ejecuta más de lo que tarda el periférico CAN en recibir suficientes mensajes para desbordarse, perdería mensajes. Es por eso que es una buena regla general mantener breves los controladores de interrupciones. Y si todo lo que hace la interrupción del temporizador es establecer una bandera, entonces dudo que vaya a tener un problema.
Otra forma de considerar esto es cuál es la penalización cuando cualquiera de los controladores de interrupción es retrasado por el otro. Cuando la interrupción de CAN se retrasa por la interrupción del temporizador, agregaría un retraso a la respuesta de CAN o, en el peor de los casos, soltaría un mensaje. Cuando la interrupción del temporizador se retrasa por la interrupción CAN, entonces agregaría fluctuación a la interrupción del temporizador. En el peor de los casos, se caería un milisegundo, pero la interrupción de CAN tendría que ejecutarse durante 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 nerviosismo?
Es dudoso que cualquiera de las interrupciones rompa las comunicaciones I2C. Probablemente esté utilizando un periférico de controlador I2C 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 estuviera golpeando cada bit, habría un mayor impacto porque los relojes individuales podrían estirarse por una interrupción no relacionada. Pero incluso eso no es necesariamente un problema debido a la naturaleza síncrona de I2C. El dispositivo esclavo no debería ' No importa si los pulsos del reloj I2C se estiran).
Puede ser aceptable sondear el estado LIDAR. Si no tiene nada más que hacer para la CPU, ¿cuál es el daño? Pero si el periférico lidar tiene una interrupción de "datos listos" de algún tipo, entonces podría habilitar esa interrupción y esperar la interrupción en lugar de sondear el estado.
Es la naturaleza de CAN que cuando intenta enviar un mensaje, puede experimentar colisiones con mensajes de mayor prioridad que necesita recibir y procesar.
Su propuesta muestra ISR extremadamente simples que simplemente establecen indicadores, y todo el trabajo real se realiza en un solo subproceso de fondo (no ISR).
No estoy familiarizado con los detalles del controlador CAN del STM32 y específicamente qué tan autónomo podría ser, pero su propuesta parece inadecuada con respecto a este problema.
Jeroen3
pop24
Jeroen3
pop24
Lundin
Jeroen3