Reihenfolge von Befehlen



  • Es geht um Folgendes: Ich habe einen Ring-Speicher (FIFO). Der wird regelmäßig mit einem Interrupt mit Daten befüllt. Der Ring-Speicher wird ab und zu vom Hauptprogramm geleert.

    void daten_verarbeiten() {
    	interrupts_off();
    	while(!ring_buffer.is_empty()) {
    		uint8_t byte = ring_buffer.pop_front();
    		// byte verarbeiten.
    	}
    	interrupts_on();
    }
    

    Kann ich davon ausgehen, dass die Interrupts auch wirklich abgeschaltet werden, bevor ich die Daten verarbeite, oder ist es möglich, dass der Compiler ein wenig optimier-Magie betreibt und plötzlich Daten verarbeitet werden, bevor die Interrupts aus sind?



  • Wenn interrupts_off und interrupts_on passend implementiert sind, dann ist garantiert dass das funktioniert wie gewünscht.

    Natürlich nur unter der Voraussetzung dass es nur einen Core gibt. Wenn es >= zwei Cores gibt, dann könnte u.U. dein Code auf einen Core laufen, und der Interrupt auf einem anderen. Und dann wäre es möglich dass der Interrupt noch läuft während dein Code auf die FIFO zugreift. Nämlich wenn der Interrupt kurz vor der Ausführung von interrupts_off zu laufen begonnen hat.



  • Es handelt sich nur um einen Core (Cortex M4). Danke sehr!


Anmelden zum Antworten