Problem:
Bei einem Programmabsturz wird eine zuvor geschriebene Variable nicht persistent abgelegt.
Beschreibung:
Ich bin gerade dabei eine Checkpoint-Variable zu implementieren. Diese soll beim Programmabsturz widerspiegeln welcher Checkpoint/Codeabschnitt als letzter erreicht wurde. Damit möchte ich mögliche Code-Fehler (die zum Absturz führen) eingrenzen.
Die Variable ist angelegt, global als retain persistent (wurde auch als nur retain getestet). Wenn das Programm gestartet wird, dann wird diese als aller erstes einmalig ausgewertet und via CAN übertragen.
Ich habe nun auch eine Methode in der ich einen gezielten Programmabsturz verursachen kann. Mit dieser Methode habe ich nun getestet, ob das Programm nach einem Resetten auch wirklich den richtigen Wert eingetragen hat.
Dies ist leider nicht der Fall. Der letzte via CAN übertragene Wert ist ca. 5 Abschnitte alt. Die Variable wird also mehrfach in anderen Programmabschnitt geschrieben, dann wird sie ein letztes Mal gesetzt und gleich darauf wird das Programm gezielt festgefahren.
Wenn ich an C/C++ denke, dann kommt mir das Schlüsselwort volatile in den Sinn.
Ich habe auch nur einen Task, also Multiprocessing wird (vermutlich) nicht die Quelle des Problems sein.
Ich habe außerdem testweise zwischen der letzten Zuweisung und dem Absturz eine Schleife mit 1000 Durchläufen. Daher vermute ich, es liegt nicht an irgendwie Code-Sortierungs-Optimierung. (Zu betonen wäre hier außerdem, dieser Code soll auf einer operativen Anlage für Diagnosezwecke laufen. Nach jedem Schreiben einer Checkpoint Variable für 5 ms zu warten wäre nicht rechtfertigbar.)
Fragen:
Kann es sein, die Variable wird erst in einem Cache geschrieben, der nicht rechtzeitig durchgeschrieben wird?
Gibt es in Codesys eine Möglichkeit eine Variable als volatile zu deklarieren? ( Volatile nicht im Sinne von flüchtig/nicht flüchtig, sondern wie in C, also immer hart auf den Speicher durchschreiben ohne Caching)
Gibt es eine andere mögliche Ursache für den Fehler?
Gibt es eine Art Flush-Methode zum aktiven Durchschreiben, über den Cache hinweg?
Gibt es eine Möglichkeit in einen anderes Bread Crumb Register zu schreiben, welches vielleicht besser geeignet ist für diese Anforderung?
Ich bitte um Hilfe.
Viele Grüße und Danke im Voraus
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Ich habe mein Problem mal versucht mit Memcpy zu lösen, aber irgendwie hat das auch nicht funktioniert.
Ich konnte keine weiteren nicht begründbare Abstürze nachverfolgen. Deshalb werde ich das Thema auch erst mal etwas ruhen lassen.
Jedoch, wenn die Abstürze wieder Thema werden, dann werde ich den Check Funktionen nachgehen.
Viele Grüße
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo Zusammen,
Problem:
Bei einem Programmabsturz wird eine zuvor geschriebene Variable nicht persistent abgelegt.
Beschreibung:
Ich bin gerade dabei eine Checkpoint-Variable zu implementieren. Diese soll beim Programmabsturz widerspiegeln welcher Checkpoint/Codeabschnitt als letzter erreicht wurde. Damit möchte ich mögliche Code-Fehler (die zum Absturz führen) eingrenzen.
Die Variable ist angelegt, global als retain persistent (wurde auch als nur retain getestet). Wenn das Programm gestartet wird, dann wird diese als aller erstes einmalig ausgewertet und via CAN übertragen.
Ich habe nun auch eine Methode in der ich einen gezielten Programmabsturz verursachen kann. Mit dieser Methode habe ich nun getestet, ob das Programm nach einem Resetten auch wirklich den richtigen Wert eingetragen hat.
Dies ist leider nicht der Fall. Der letzte via CAN übertragene Wert ist ca. 5 Abschnitte alt. Die Variable wird also mehrfach in anderen Programmabschnitt geschrieben, dann wird sie ein letztes Mal gesetzt und gleich darauf wird das Programm gezielt festgefahren.
Wenn ich an C/C++ denke, dann kommt mir das Schlüsselwort volatile in den Sinn.
Ich habe auch nur einen Task, also Multiprocessing wird (vermutlich) nicht die Quelle des Problems sein.
Ich habe außerdem testweise zwischen der letzten Zuweisung und dem Absturz eine Schleife mit 1000 Durchläufen. Daher vermute ich, es liegt nicht an irgendwie Code-Sortierungs-Optimierung. (Zu betonen wäre hier außerdem, dieser Code soll auf einer operativen Anlage für Diagnosezwecke laufen. Nach jedem Schreiben einer Checkpoint Variable für 5 ms zu warten wäre nicht rechtfertigbar.)
Fragen:
Kann es sein, die Variable wird erst in einem Cache geschrieben, der nicht rechtzeitig durchgeschrieben wird?
Gibt es in Codesys eine Möglichkeit eine Variable als volatile zu deklarieren? ( Volatile nicht im Sinne von flüchtig/nicht flüchtig, sondern wie in C, also immer hart auf den Speicher durchschreiben ohne Caching)
Gibt es eine andere mögliche Ursache für den Fehler?
Gibt es eine Art Flush-Methode zum aktiven Durchschreiben, über den Cache hinweg?
Gibt es eine Möglichkeit in einen anderes Bread Crumb Register zu schreiben, welches vielleicht besser geeignet ist für diese Anforderung?
Ich bitte um Hilfe.
Viele Grüße und Danke im Voraus
Moin
Fundierte Antworten auf deine Fragen habe ich leider nicht.
Wenn ich müsste würde ich alle mit NEIN beantworten.
Aber hast du dir schon mal die Check Funktionen angeschaut ?
CheckBounds / CheckPointer / CheckPointerAligned
Gruß Erik
Hallo Erik,
Danke für die Antwort.
Ich habe mein Problem mal versucht mit Memcpy zu lösen, aber irgendwie hat das auch nicht funktioniert.
Ich konnte keine weiteren nicht begründbare Abstürze nachverfolgen. Deshalb werde ich das Thema auch erst mal etwas ruhen lassen.
Jedoch, wenn die Abstürze wieder Thema werden, dann werde ich den Check Funktionen nachgehen.
Viele Grüße