Tasa de datos Rx en el bus CAN más rápida que la tasa de sondeo

Estoy trabajando en un sistema SIL 4 crítico para la seguridad y, por lo tanto, las interrupciones deben reducirse al mínimo (por lo tanto, solo uso interrupciones de temporizador). CAN se utiliza en el modo de sondeo.

Supongamos que los datos llegan a un nodo CAN y no se leen del búfer antes de que otro nodo envíe sus datos, ¿se sobrescribirán o corromperán los datos o persistirán los datos del primer nodo y se perderán los datos del segundo nodo?

¿Está bien usar más de una interrupción en un sistema SIL 4 crítico para la seguridad porque la única forma de dar servicio a los datos a tiempo sin pérdida de datos será usando la interrupción Rx para CAN o cada nodo debe tener un intervalo de tiempo para comunicarse? el bus (no es un buen enfoque ya que CAN es un enfoque de protocolo de comunicación multimaestro)?

Nota: estoy usando un microcontrolador LPC1778 .

¿Está sondeando el CAN desde la interrupción del temporizador?
Dado que estoy usando la interrupción del temporizador de 1 ms por razones de tiempo, no puedo sondear desde ISR ... será muy lento
estoy sondeando desde main()
Sí, perderá los datos si otro nodo envía los datos antes de que los lea del búfer.
Entonces, un ISR es imprescindible, puedo inferir de su comentario. Pero, ¿alguna justificación para su uso en un sistema SIL 4?
Aunque tu dispositivo pueda funcionar al 100%, no puedes usarlo, ya que no tienes el certificado SIL.
@marko- ¿No te entendí?
¿Por qué no usar una de las MCU de seguridad más nuevas con lockstep, ECC, etc.? Freescale, Renesas, ST, TI, Infineon, etc., todos tienen algo de estos hoy en día.
@Lundin-Sí... lo usamos en un nivel más alto de función de seguridad del sistema (RM57)
@AkshayImmanuelD ¿Tiene un nivel más alto que SIL4 en otros lugares? :) O la MCU que está utilizando maneja funciones críticas para la seguridad o no. Solo puede establecer un nivel SIL para una función de seguridad, no existe tal cosa como "todo en el sistema debe ser SIL x", sino "todas las funciones de seguridad en el sistema deben ser SIL x". Dado que esta MCU en particular tiene periféricos Ethernet y LCD, me preguntaría si maneja o debería manejar alguna función de seguridad.
@Lundin: "Dado que esta MCU en particular tiene periféricos Ethernet y LCD, me preguntaría si maneja/debe manejar alguna función de seguridad". ¿Conseguí eso?
@AkshayImmanuelD Bueno, parece una MCU adecuada para la visualización de la interfaz de usuario. Por lo general, esos no son críticos para la seguridad. Ethernet en general es muy inadecuado para aplicaciones críticas para la seguridad.
@lundin -Pero, ¿y si usas la votación de los datos recibidos a través de ethernet entre 3 votantes?
@AkshayImmanuelD Creo que el principal argumento en contra de Ethernet no es la mala integridad de los datos, sino el bajo rendimiento en tiempo real y el comportamiento no determinista. El votante mayoritario no afectará ese comportamiento en absoluto, por lo que me parece un diseño muy cuestionable.
@lundin- Ethernet solo se debe usar para comunicarse con una PC para obtener información relacionada con el mantenimiento. ¿A qué te refieres con no determinista? Lo siento Lundin con mis preguntas. Por cierto, el blog de addedgurus.com que compartiste es simplemente brillante. Me encantó leer la información en ese sitio.
¿Me puede dar un enlace donde LPC1778 se puede usar como MCU de seguridad? ¿Entiende? No puede crear una aplicación usted mismo, necesita funciones integradas ya hechas en la plataforma diseñada para hacer un dispositivo de seguridad y herramientas de programación que certificarán el programa. Por lo tanto, sus esfuerzos son inútiles si desea hacer un dispositivo SIL4 con esa MCU.
Siempre que cumpla con todas las condiciones de seguridad en PHA y análisis de fallas, no creo que ningún procesador pueda usarse en un sistema SIL 4. Conozco sistemas que han utilizado PIC's y han logrado obtener una certificación del sistema SIL 4.
mcf5485 es otro uC no seguro que se usa en muchos sistemas de seguridad

Respuestas (1)

Debe evitar las interrupciones cuando sea posible. Asuntos:

  1. Confunden el comportamiento predecible en tiempo real.
  2. Numerosas interrupciones pueden dar lugar a un uso imprevisto de la pila.
  3. Es fácil escribir errores muy sutiles y muy graves al compartir datos entre un ISR y el programa en segundo plano.

Dicho esto, puede evitar estos problemas con un diseño cuidadoso del sistema.

1) es solo un problema para las interrupciones no cíclicas que pueden llegar en cualquier momento. Siempre que las interrupciones tengan un comportamiento determinista y se activen cíclicamente, puede utilizarlas. En ese caso, no son diferentes a un proceso de alta prioridad y aún puede predecir el comportamiento del sistema en tiempo real.

2) se puede evitar reduciendo el número de fuentes de interrupción en la medida de lo posible. Otras medidas de seguridad son asignar siempre una pila que sea más grande de lo necesario, y lo más importante: coloque la pila de modo que, al desbordarse, no falle en cascada en otros segmentos de memoria RAM como .bss o .data. Aquí hay un buen artículo sobre esto .

3) es el más difícil de protegerse. Cada variable compartida entre un ISR y el programa de fondo debe manejarse con mucho cuidado. Existen dos problemas: problemas de reingreso y optimizador del compilador.

El reingreso debe resolverse caso por caso con acceso atómico/semáforos/mutex o deshabilitando temporalmente las interrupciones. Esto siempre es complicado y debe asegurarse de haber considerado todos los escenarios y de que el código de máquina producido realmente haga lo que piensa.

El otro problema es que su compilador no se da cuenta de que la MCU llama a su ISR en lugar de su código y, por lo tanto, no comprende que todas las variables utilizadas por el ISR se pueden actualizar en cualquier momento. El compilador puede entonces optimizar el código de fondo incorrectamente, ya que asume que una determinada variable nunca se usa. Este error se puede evitar declarando siempre las variables compartidas con un ISR como volatile.

Ambos problemas son fuentes comunes de errores muy sutiles, pero a menudo graves. No hay una forma estándar de protegerse contra ellos, lo más parecido a una medida de seguridad es permitir que su veterano C más endurecido escriba todos los ISR. Los programadores con experiencia intermedia, sin mencionar los principiantes, siempre escriben estos errores, una y otra vez.

Debido a esto, es muy difícil justificar el uso de interrupciones en aplicaciones críticas para la seguridad. Tendría que dedicar mucho tiempo al diseño, las pruebas y la documentación para verificar que cada una de esas interrupciones no esté causando problemas. Por lo tanto, puedo entender por qué algunos estándares de seguridad prohíben por completo el uso de interrupciones.


En cuanto al problema específico de CAN, parece un poco que ha elegido la MCU incorrecta para la tarea o que no está utilizando el controlador CAN correctamente. Los controladores CAN más avanzados tienen búferes rx que puede configurar para mensajes dedicados y, además, un FIFO rx donde van el resto de los mensajes. Estoy bastante seguro de que NXP tiene tales controladores CAN para sus familias Cortex-M, al menos los tienen en LPC11C.

Con tal enfoque y un protocolo CAN de capa de aplicación cuidadosamente diseñado, no debería necesitar interrupciones rx. Todas las redes CAN críticas para la seguridad deben estar diseñadas para enviar mensajes una y otra vez periódicamente. Si sabe que un determinado mensaje solo llega una vez cada 5 ms, simplemente debe asegurarse de que su programa en segundo plano sea lo suficientemente rápido para manejarlo antes de que llegue el siguiente mensaje.

Para SIL4, probablemente tendría más de un bus CAN: dedicaría un bus para mensajes en tiempo real críticos para la seguridad y pondría todo lo demás en otro bus no crítico. A veces también se utilizan soluciones de redundancia con varios buses CAN que transmiten los mismos datos críticos.

Para los controladores CAN limitados que carecen de búferes dedicados, DMA junto con un software FIFO podría ser otra alternativa para evitar interrupciones.
Cierto, pero lamentablemente el LPC1778 no puede activar el DMA desde los controladores CAN :-( De lo contrario, sería fácil porque el DMA puede incluso reprogramarse.
Una mirada más cercana a esta MCU específica muestra que el controlador CAN es un estándar simple, no admite búferes de "buzón". Entonces, esta podría ser la MCU incorrecta para la tarea, o alternativamente, se podría usar un controlador CAN externo (que es un diseño mucho más doloroso, no lo recomendaría).
Sí, exactamente, RM57 tiene buzones... Por lo tanto, es muy simple. LPC1778 no tiene buzón ni DMA... Por lo tanto, me veo obligado a usar interrupciones.
@Lundin-Interrupts debe mantenerse como mínimo, de acuerdo. ¿Qué pasa con el uso de DMA? ¿No debería el DMA también mantenerse al mínimo?