Embedded Systems und Firmware
Das Hauptprogramm manipuliert ein Registerbit mit „reg |= mask;“ (Lesen, Ändern, Schreiben), während ein Interrupt-Handler ein anderes Bit desselben Registers ändert. Welche Kombination aus möglichem Problem und Gegenmaßnahme ist korrekt?
- ADie Änderung durch den Interrupt geht durch das Zurückschreiben des Hauptprogramms verloren. Interrupts während der Operation sperren oder Register nur zum Setzen bzw. Löschen einzelner Bits verwenden
- BDas Register wird zerstört und ist nicht mehr nutzbar. Der Mikrocontroller wird ausgetauscht
- CEs passiert nichts. Eine Gegenmaßnahme ist nicht nötig
Antwort und Erläuterung anzeigen
Antwort: A. Die Änderung durch den Interrupt geht durch das Zurückschreiben des Hauptprogramms verloren. Interrupts während der Operation sperren oder Register nur zum Setzen bzw. Löschen einzelner Bits verwenden
„reg |= mask“ besteht aus drei Operationen: das Register lesen, ODER bilden und zurückschreiben. Tritt direkt nach dem Lesen ein Interrupt auf und ändert der Handler ein anderes Bit, schreibt das Hauptprogramm auf Basis des vor dem Interrupt gelesenen alten Werts zurück, und die Änderung des Handlers geht verloren. Wenn Interrupts nur während der Operation gesperrt werden oder Set- bzw. Clear-Register verwendet werden, bei denen nur die mit 1 beschriebenen Bits geändert werden, genügt ein einziger Schreibzugriff, und das Problem tritt nicht auf.