mikrocontroller.net

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


Autor: R. S. (spautzi)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <stdint.h>
#include <avr/interrupt.h>

class System {
  public:
    typedef uint8_t state_t;
  private:
    state_t state;
  public:
    static const state_t
    SCHEDULE = 0x01;
    void schedule();
    void run();
};

extern System system;

System.cpp:
#include "System.hpp"

void System::schedule() {
  state |= SCHEDULE;
}

void System::run() {
  if (state & SCHEDULE) {
    state &= ~SCHEDULE;
    //do something..
  }
}

System system;

ISR(..) {
  system.schedule();
}

int main() {
  while (true)
    system.run();
}

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wuerde sagen: volatile vergessen.

Autor: R. S. (spautzi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm
volatile state_t state;
hat keine Auswirkung.

Im Falle von inline funktioniert es ja auch ohne volatile.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.