Hallo oberallgeier,
danke für die Teil-Infos. Hilft schon mal etwas weiter.
Das habe ich hier gefunden:
Wenn die Variable Iz_diff0 nicht eine char-Variable, sondern ein längerer Datentyp wie z.B. int ist, dann kann es vorkommen, dass in rgl_mo_xx() der Zugriff auf diese Variable durch einen Interrupt unterbrochen wird.
Es kann dann sporadisch passieren, dass du beim Zugriff einen Teil der Bytes aus dem Speicher VOR der Int-Änderung holst, und das andere Byte NACH der INT-Änderung.
Sicherer ist folgendes in rgl_mo_xx():
Das gilt grundsätzlich für alle Variablen die in Interruptfunktionen geändert werden können.Code:int Iz_diff0_lokal; interrupt_sperren(); -- dieses sei() und oder das andere Dingsda. Iz_diff0_lokal = Iz_diff0; -- und alle weiteren Variablen, die in Interrupts 'angefasst' werden. interrupt_wieder_zulassen(); -- das andere Dingsda oder halt sei(). weiter mit deiner Funktion
Bei char-Variablen sollte man mal genauer auf den Output vom Compiler schauen, ob ein Zugriff komplett in einem Assembler-Befehl abgearbeitet wird. Dann, und nur dann, kann das sei() oder nicht sei() weg gelassen werden.
Gruß Sternthaler
P.S.: Ja, ich fahre jetzt nach meinem ersten Nach-Urlaubs-Arbeitstag auch wieder nach Hause.
Lesezeichen