Forum: Mikrocontroller und Digitale Elektronik C++ Interrupt Klassen


von Michael M. (Gast)


Lesenswert?

Hallo,

könnte mir bitte jemand weiterhelfen. Ich bin noch neu auf dem Gebiet 
und versuch gerade einen Interrupt in eine Klasse zu packen.

Das ist mein Code:

// Interrupt fuer Empfang einer Nachricht
SIGNAL(SIG_CAN_INTERRUPT1)
{
  uint8_t save_canpage;
  uint8_t mob;
  uint8_t a=0;
  uint32_t idm;
  int8_t data;
  uint8_t length;
  static CANMessage msg;

  // Aktuelle CANPAGE sichern
  save_canpage = CANPAGE;
  data=CANMSG;
  // Index des MOB ermitteln, der den Interrupt ausgelöst hat
  mob = can_get_mob_interrupt();
  // Falls es kein gültiges MOB war abbrechen
  if(mob == NOMOB)
  return;
  // Objekt das den Interrupt ausgelöst hat holen
  can_get_mob(mob);
  // Daten des MOBs aus CANMSG auslesen
  can_get_data();
  // Id der Nachricht holen
  //   message.id    = can_get_id();
  //   message.idm = 0b01011001;
  can_receive();
  // RXOK-Flag löschen
  clearbit(CANSTMOB, RXOK);

  // MOB auf Empfang und CAN 2.0B Standard setzen
  can.can_set_mode(CAN_MODE_RECEIVE_DATA);

  // CANPAGE wiederherstellen
  CANPAGE = save_canpage;
}

Was muss ich beachten?

von Pandur S. (jetztnicht)


Lesenswert?

Interrupts in Klassen ? Vergiss das. Passt ueberhaupt nicht. Klassen 
verwendet man fuer mehrfache Instanzierung von gleichen oder aehnlichen 
Funktionalitaeten. Bei den Interrupts ist jeder fuer was anderes.

Was soll's denn Bringen ?

Funktionen, die irgendwas obskures machen wie "can_get_mob_interrupt()", 
"can_get_mob(mob)", "can_get_id()" gehoeren sowieso nicht in interrupts. 
Ein Interrupt muss maximal kurz zein. Da geht grad mal Register 
zugreifen, Wert zu Buffer, und umgekehrt.

von PittyJ (Gast)


Lesenswert?

Ein normaler CPU-Interrupt hat oft nur einen Ansprungspunkt, wie eine 
klassische C Funktion.
Für eine Klasse benötigt man aber noch den this-Pointer, der vom 
Interrupt aber nicht geliefert wird.
Man könnte auch statische Funktionen verwenden, dann wäre man aber 
zurück auf C Niveau.

Ich verstehe auch nicht, wo da jetzt C++ in Spiel kommt.

von Pandur S. (jetztnicht)


Lesenswert?

Ein Interrupt ist eine Resource, und den gibt's genau einmal. Statisch. 
Was man machen kann ist dynamische Meldungsbuffer, falls Meldungspackete 
verschieden verarbeitet, geroutet werden. Aber auch die wuerd ich nie 
dynamisch allozieren, sind statisch haben, und deren Nutzung per 
Arrayindex, dynamisch vergeben.

von Michael M. (Gast)


Lesenswert?

ok danke schonmal.

naja, ich dachte eben,weil meine methoden in dem interrupt eben auch in 
der klasse definiert sind, muss der interrupt auch mit rein, denn sonst 
kennt er sie ja nicht. das wollte ich umgehen und den interrupt auch in 
die klasse packen

von dasrotemopped (Gast)


Lesenswert?

wenn IRQ und Klassen, dann eine universelle Klasse schreiben und dann 
für jeden HW-IRQ instanziieren. Ist aber trotzdem nicht sinning.

Gruß,
dasrotemopped.

von Michael M. (Gast)


Lesenswert?

Wo pack ich mein signal interrupt dann rein?

von Mark B. (markbrandis)


Lesenswert?

Michael M. schrieb:
> Wo pack ich mein signal interrupt dann rein?

Einfach in eine Funktion, so wie man es in reinem C machen würde.

von Ralf G. (ralg)


Lesenswert?

Sieh' dir das mal an:
https://www.mikrocontroller.net/articles/AVR_Interrupt_Routinen_mit_C%2B%2B
Kostet allerdings Speicher und Laufzeit. Aber wo's nicht auf den letzten 
Takt ankommt...

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.