Forum: Compiler & IDEs Member funktion innerhalb ISR nur inline?!


von R. S. (spautzi)


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
}

von P. S. (Gast)


Lesenswert?

Wuerde sagen: volatile vergessen.

von R. S. (spautzi)


Lesenswert?

Hm
1
volatile state_t state;
hat keine Auswirkung.

Im Falle von inline funktioniert es ja auch ohne volatile.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

"schadule" lässt vermuten, daß da kritische Sachen passieren 
(Task/Kontextumschaltung) ?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.