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?
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.
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.
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.
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
wenn IRQ und Klassen, dann eine universelle Klasse schreiben und dann für jeden HW-IRQ instanziieren. Ist aber trotzdem nicht sinning. Gruß, dasrotemopped.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.