nehme ich an einen Mikrocontroller mit einer Hauptschleife und 1 Millisekunde Alarm haben (wenn Sie nicht wissen, was das ist es nur eine Aufgabe, die die Hauptschleife der Ausführung unterbricht, während es etwas tut ..... und es ist ein 1 Millisekunde Interrupt, weil es jede Millisekunde passiert).Teilweise volatile Variable?
Ich habe eine Variable, die I zwischen der Hauptschleife und Millisekunden- Unterbrechungs verwenden, um zu kommunizieren:
volatile status_t Status;
Augenblick habe ich einen Abschnitt des Codes in der Hauptschleife, die die Status
Variable aktualisiert, die eine tut Tonne Transformationen darauf:
cli(); // This temporarily turns off interrupts, so we don't
// modify the variable unsafely
Status.UpdateStuff();
Status.UpdateOtherStuff();
//etc.
sei(); // Turn interrupts back on
das Problem ist, dass jede dieser Funktion Status
Status
umschreibt nennt ...... der Compiler nicht die Werte der Stellung im lokalen Speicher zwischengespeichert werden kann.
Eine mögliche Lösung für dieses Problem ist folgendes:
cli();
status_t* localStatus = (status_t*)&Status;
localStatus->UpdateStuff();
localStatus->UpdateOtherStuff();
//etc.
Status = *localStatus;
sei();
Die eigentliche Frage hier ist diese:
Ist das tun würde, was ich hoffe, es wird tun, oder gibt es einen besseren Weg, um um das Problem des konstanten Auffrischens der Variablen, anstatt es dem Optimierer zu erlauben, die Variable zwischenzuspeichern?
Im zweiten Ausschnitt meinen Sie wohl & Status. Übrigens, ich glaube nicht, dass es viel bessere Alternativen gibt. –
Lassen Sie den Timer Jobs in eine Warteschlange einfügen, und der Hauptthread liest die Warteschlange und verarbeitet die Jobs. Sie brauchen nur einen Mutex in den Warteschlangenoperationen. –
@MatteoItalia Yup, das ist, was ich meinte ... – DarthRubik