Member funktion innerhalb ISR nur inline?!

OP #1175497
Lesenswert?

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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren