Hallo,
habe hier einen kleinen Scheduler als Klasse realisiert (abgespeckt).
In der main-Loop pollt die Methode run() auf die Flag SCHEDULE.
Die Flag kann von der Methode schedule() gesetzt werden.
Die Methode schedule() wird von einer ISR aufgerufen.
Mir ist aufgefallen, dass dies nur funktioniert, wenn die Methode
schedule() inline ist, d.h. wenn sie im Header implementiert wird (nicht
wie im Code unten). Denn wenn sie nicht inline ist, passiert
komischerweise gar nichts, also die Flag SCHEDULE wird nie gesetzt,
obwohl die Methode schedule() ja aufgerufen wird.
Warum ist das so? :)
Danke!
MFG Rouven
System.hpp:
1 | #include <stdint.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 | class System {
|
5 | public:
|
6 | typedef uint8_t state_t;
|
7 | private:
|
8 | state_t state;
|
9 | public:
|
10 | static const state_t
|
11 | SCHEDULE = 0x01;
|
12 | void schedule();
|
13 | void run();
|
14 | };
|
15 |
|
16 | extern System system;
|
System.cpp:
1 | #include "System.hpp"
|
2 |
|
3 | void System::schedule() {
|
4 | state |= SCHEDULE;
|
5 | }
|
6 |
|
7 | void System::run() {
|
8 | if (state & SCHEDULE) {
|
9 | state &= ~SCHEDULE;
|
10 | //do something..
|
11 | }
|
12 | }
|
13 |
|
14 | System system;
|
15 |
|
16 | ISR(..) {
|
17 | system.schedule();
|
18 | }
|
19 |
|
20 | int main() {
|
21 | while (true)
|
22 | system.run();
|
23 | }
|