C++ Interrupt Klassen

Gast #4503260
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?
#4503269
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.
Gast #4503276
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.
#4503289
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.
Gast #4503305
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

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