Rx-Datenrate auf CAN-Bus schneller als Polling-Rate

Ich arbeite an einem sicherheitskritischen SIL 4-System und daher müssen Interrupts auf ein absolutes Minimum beschränkt werden (daher nur Timer-Interrupts verwenden). CAN wird im Polling-Modus verwendet.

Angenommen, Daten kommen an einem CAN-Knoten an und werden nicht aus dem Puffer gelesen, bevor ein anderer Knoten seine Daten sendet, werden die Daten überschrieben oder beschädigt oder bleiben die Daten des ersten Knotens bestehen und die Daten des zweiten Knotens gehen verloren?

Ist es in Ordnung, mehr als einen Interrupt in einem sicherheitskritischen SIL 4-System zu verwenden, da die einzige Möglichkeit, Daten rechtzeitig ohne Datenverlust zu bedienen, die Verwendung des Rx-Interrupts für CAN ist oder jedem Knoten ein Zeitfenster für die Kommunikation zugewiesen werden muss? den Bus (kein guter Ansatz, da CAN ein Multimaster-Kommunikationsprotokollansatz ist)?

Hinweis: Ich verwende einen LPC1778- Mikrocontroller.

Rufen Sie den CAN vom Timer-Interrupt ab?
Da ich aus Zeitgründen einen Timer-Interrupt von 1 ms verwende, kann ich ISR nicht abfragen ... es ist sehr langsam
im polling von main()
Ja, Sie verlieren die Daten, wenn ein anderer Knoten die Daten sendet, bevor Sie sie aus dem Puffer lesen.
Ein ISR ist also ein Muss, wie ich aus Ihrem Kommentar schließen kann. Aber gibt es Gründe für den Einsatz in einem SIL 4-System?
Auch wenn Ihr Gerät zu 100 % funktionieren kann, dürfen Sie es nicht verwenden, da Sie kein SIL-Zertifikat haben.
@marko- Ich habe dich nicht verstanden?
Warum nicht eine der neueren Sicherheits-MCUs mit Lockstep, ECC usw. verwenden? Freescale, Renesas, ST, TI, Infineon usw. haben heutzutage alle einen gewissen Geschmack davon.
@Lundin-Ja ... wir verwenden das auf einer höheren Ebene der Systemsicherheitsfunktion (RM57)
@AkshayImmanuelD Du hast woanders ein höheres Level als SIL4? :) Entweder übernimmt die von Ihnen verwendete MCU sicherheitskritische Funktionen oder nicht. Ein SIL-Level kann nur für eine Sicherheitsfunktion eingestellt werden, es gilt nicht „alles im System muss SIL x sein“, sondern „jede Sicherheitsfunktion im System muss SIL x sein“. Angesichts der Tatsache, dass diese spezielle MCU über Ethernet- und LCD-Peripheriegeräte verfügt, würde ich mich fragen, ob sie überhaupt Sicherheitsfunktionen übernimmt/sollte?
@Lundin - "Angesichts der Tatsache, dass diese spezielle MCU über Ethernet- und LCD-Peripheriegeräte verfügt, würde ich mich fragen, ob sie überhaupt Sicherheitsfunktionen übernimmt / ausführen sollte?" Ich habe das verstanden?
@AkshayImmanuelD Nun, es scheint eine MCU zu sein, die für die Anzeige der Benutzeroberfläche geeignet ist. Typischerweise sind diese nicht sicherheitskritisch. Ethernet ist generell für sicherheitskritische Anwendungen sehr ungeeignet.
@lundin - Aber was ist, wenn Sie unter 3 Wählern für die über Ethernet empfangenen Daten abstimmen?
@AkshayImmanuelD Ich glaube, das Hauptargument gegen Ethernet ist nicht die schlechte Datenintegrität, sondern die schlechte Echtzeitleistung und das nicht deterministische Verhalten. Die Mehrheit der Wähler wird dieses Verhalten überhaupt nicht beeinflussen, daher klingt es für mich nach einem sehr fragwürdigen Design.
@lundin- Ethernet darf nur zur Kommunikation mit einem PC für wartungsbezogene Informationen verwendet werden. Was meinst du mit nicht deterministisch? Es tut mir leid Lundin mit meinen Fragen. Übrigens ist der von Ihnen geteilte embeddedgurus.com-Blog einfach brillant. Liebte es, die Informationen auf dieser Seite zu lesen
Können Sie mir einen Link geben, wo LPC1778 als Sicherheits-MCU verwendet werden kann? Verstehen Sie, dass Sie keine Anwendung selbst erstellen können, Sie benötigen eingebettete Funktionen, die bereits auf einer Plattform erstellt wurden, um ein Sicherheitsgerät herzustellen, und Programmiertools, die das Programm zertifizieren. Daher sind Ihre Bemühungen nutzlos, wenn Sie mit dieser MCU ein SIL4-Gerät herstellen möchten.
Solange Sie alle Sicherheitsbedingungen in PHA und Fehleranalyse erfüllen, kann kein Prozessor in einem SIL 4-System verwendet werden. Ich kenne Systeme, die PICs verwendet haben und es geschafft haben, eine SIL 4-Systemzertifizierung zu erreichen.
mcf5485 ist ein weiterer nicht sicherheitsrelevanter uC, der in vielen Sicherheitssystemen verwendet wird

Antworten (1)

Sie sollten Unterbrechungen nach Möglichkeit vermeiden. Themen:

  1. Sie bringen vorhersagbares Echtzeitverhalten durcheinander.
  2. Zahlreiche Interrupts können zu einer unvorhergesehenen Stack-Nutzung führen.
  3. Es ist einfach, sehr subtile und sehr schwerwiegende Fehler zu schreiben, wenn Daten zwischen einem ISR und dem Hintergrundprogramm ausgetauscht werden.

Davon abgesehen können Sie diese Probleme durch sorgfältiges Systemdesign vermeiden.

1) ist nur ein Problem für nicht zyklische Interrupts, die zu einem beliebigen Zeitpunkt eintreffen können. Solange sich die Interrupts deterministisch verhalten und zyklisch ausgelöst werden, können Sie sie verwenden. In diesem Fall unterscheiden sie sich nicht von einem Prozess mit hoher Priorität, und Sie können immer noch das Echtzeitverhalten des Systems vorhersagen.

2) kann vermieden werden, indem die Anzahl der Interruptquellen so weit wie möglich reduziert wird. Andere Sicherheitsmaßnahmen bestehen darin, immer einen Stack zuzuweisen, der größer als nötig ist, und am wichtigsten: Platzieren Sie den Stack so, dass er bei einem Überlauf nicht in andere RAM-Speichersegmente wie .bss oder .data kaskadiert! Hier ist ein guter Artikel dazu .

3) Es ist am schwierigsten, sich davor zu schützen. Jede Variable, die zwischen einem ISR und dem Hintergrundprogramm geteilt wird, muss mit großer Sorgfalt behandelt werden. Es gibt zwei Probleme: Re-Entrancy- und Compiler-Optimierer-Probleme.

Der Wiedereintritt muss von Fall zu Fall mit atomarem Zugriff/Semaphoren/Mutex oder durch vorübergehendes Deaktivieren von Interrupts gelöst werden. Das ist immer knifflig und Sie müssen sicherstellen, dass Sie jedes Szenario berücksichtigt haben und dass der produzierte Maschinencode tatsächlich das tut, was Sie denken.

Das andere Problem ist, dass Ihr Compiler nicht erkennt, dass Ihre ISR von der MCU und nicht von Ihrem Code aufgerufen wird, und daher nicht versteht, dass alle von der ISR verwendeten Variablen jederzeit aktualisiert werden können. Der Compiler kann dann den Hintergrundcode falsch optimieren, da er davon ausgeht, dass eine bestimmte Variable nie verwendet wird. Dieser Fehler kann vermieden werden, indem Variablen, die mit einem ISR geteilt werden, immer als volatile.

Beide Probleme sind häufige Ursachen für sehr subtile, aber oft schwerwiegende Fehler. Es gibt keine Standardmethode, um sich davor zu schützen. Eine Sicherheitsmaßnahme kommt am nächsten, wenn Sie nur Ihrem hartgesottensten C-Veteranen erlauben, alle ISRs zu schreiben. Programmierer mit mittlerer Erfahrung, ganz zu schweigen von Anfängern, schreiben diese Fehler immer und immer wieder .

Aus diesem Grund ist es sehr schwierig, die Verwendung von Interrupts in sicherheitskritischen Anwendungen zu rechtfertigen. Sie müssten viel Zeit für Design, Tests und Dokumentation aufwenden, um sicherzustellen, dass nicht jeder dieser Interrupts Probleme verursacht. Daher kann ich verstehen, warum einige Sicherheitsstandards die Verwendung von Interrupts vollständig verbieten.


Was das spezifische Problem von CAN betrifft, so klingt es ein bisschen so, als hätten Sie entweder die falsche MCU für die Aufgabe ausgewählt oder den CAN-Controller nicht richtig verwendet. Fortgeschrittenere CAN-Controller haben Empfangspuffer, die Sie für dedizierte Nachrichten einrichten können, und zusätzlich einen Empfangs-FIFO, in den die restlichen Nachrichten gehen. Ich bin mir ziemlich sicher, dass NXP solche CAN-Controller für seine Cortex-M-Familien hat, zumindest auf dem LPC11C.

Mit einem solchen Ansatz und einem sorgfältig entworfenen CAN-Protokoll auf Anwendungsebene sollten Sie keine RX-Interrupts benötigen. Alle sicherheitskritischen CAN-Netzwerke müssen darauf ausgelegt sein, Nachrichten periodisch immer wieder zu senden. Wenn Sie wissen, dass eine bestimmte Nachricht nur alle 5 ms eintrifft, müssen Sie lediglich sicherstellen, dass Ihr Hintergrundprogramm schnell genug ist, um sie zu verarbeiten, bevor die nächste Nachricht eintrifft.

Für SIL4 hätten Sie wahrscheinlich mehr als einen CAN-Bus: Sie würden einen Bus für sicherheitskritische Echtzeitnachrichten reservieren und alles andere auf einen anderen, nicht kritischen Bus legen. Manchmal werden auch Redundanzlösungen mit mehreren CAN-Bussen verwendet, die dieselben kritischen Daten übertragen.

Für begrenzte CAN-Controller ohne dedizierte Puffer könnte DMA zusammen mit einem Software-FIFO eine weitere Alternative zur Vermeidung von Interrupts sein.
Stimmt, aber leider kann der LPC1778 den DMA nicht von den CAN-Controllern triggern :-( Sonst wäre es einfach, da sich der DMA sogar selbst umprogrammieren kann.
Ein genauerer Blick auf diese spezielle MCU zeigt, dass der CAN-Controller ein einfacher Standardcontroller ist und keine "Mailbox" -Puffer unterstützt. Dies könnte also die falsche MCU für die Aufgabe sein, oder alternativ könnte ein externer CAN-Controller verwendet werden (was ein viel schmerzhafteres Design ist, ich würde es nicht empfehlen).
Ja genau, RM57 hat Postfächer.. Daher sehr einfach. LPC1778 hat keine Mailbox oder DMA ... Daher bin ich gezwungen, Interrupts zu verwenden.
@Lundin-Interrupts sollten auf ein Minimum beschränkt werden. Vereinbart. Was ist mit der Verwendung von DMA? Sollte DMA nicht auch minimal gehalten werden?