Wie teile ich meiner lieben CubeIDE denn mit, dass der SPI Interrupt eine bestimmte Funktion einer Klasseninstanz aufrufen soll? Mein erfolgloser Versuch bisher: main.cpp
1 | |
2 | |
3 | |
4 | |
5 | |
system.cpp
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
stm32l4xx_it.c
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
|
Anzeige
|
STM32 Interrupt Handler in statischer KlasseWie teile ich meiner lieben CubeIDE denn mit, dass der SPI Interrupt eine bestimmte Funktion einer Klasseninstanz aufrufen soll? Mein erfolgloser Versuch bisher: main.cpp
system.cpp
stm32l4xx_it.c
Gast
#6347738
Wenn du eine Klasse innerhalb von main() instanzierst dann wird die wohl keine andere Funktion jemals zu sehen bekommen.
Gast
#6347739
Ich weiß nicht ob man eine in C definierte Funktion in einer C++ Klasse implementieren kann. Bzw. stelle es mir nicht gerade schön und ungeeignet vor. Ansonsten nimm doch Pointer. Damit müsste die Funktion über ihren Pointer global erreichbar sein.
Funktioniert aber nicht, da folgender Fehler auftritt: cannot convert 'void (System::*)()' to 'void (*)()' in assignment Der Fehlermeldung nach zu urteilen ist deine Funktion nicht statisch.
Gast
#6347814
Die Memberfunktion kann in der Klassendefinition als 'static' deklariert werden. Dann sind in der Funktion aber keine Zugriffe auf Membervariablen möglich weil der this pointer fehlt. Den kann die ISR auch nicht mitgeben, dafür ist dann eine Hilfsfunktion nötig. Johannes S. schrieb: > Die Memberfunktion kann in der Klassendefinition als 'static' deklariert > werden. Dann sind in der Funktion aber keine Zugriffe auf > Membervariablen möglich weil der this pointer fehlt. Den kann die ISR > auch nicht mitgeben, dafür ist dann eine Hilfsfunktion nötig. Ok, dass funktioniert jetzt. Also es wird fehlerfrei kompiliert. Hier der aktuelle Code: main.cpp
system.h
system.cpp
stm32l4xx_it.c
Eine Frage noch. Kann man das so machen. Oder gibt es da elegantere Möglichkeiten. Ich bin immer wieder am überlegen, ob nicht C doch sinnvoller wäre... Sehr unschlüssig... Anonymous U. schrieb: > Ich bin immer wieder am überlegen, ob nicht C doch > sinnvoller wäre... Sehr unschlüssig... Ich würde mal sagen wenn es schon an einem ISR scheitert, ist C vielleicht doch die bessere Lösung. Schlussendlich kannst du den Komfort von C++ eh nicht richtig genießen und musst dir wieder um jede Speicherallokation Gedanken machen. Das kannst du auch in C haben. Es gibt sicher Projekte, wo der zusätzliche Aufwand Sinn ergibt, aber oft ist es auch sinnvoll, einfach beim Bewährten zu bleiben.
Gast
#6347867
Anonymous U. schrieb: > Eine Frage noch. Kann man das so machen. Oder gibt es da elegantere > Möglichkeiten. Warum krampfhaft in der main() eine Klasseninstanz anlegen und einen globalen Pointer darauf? Gibt es dafür triftige Gründe?
Gast
#6347873
Wenn man system global anlegt sind Zugriffe aus C++ so möglich: https://isocpp.org/wiki/faq/mixing-c-and-cpp#call-cpp oooops schrieb: > Anonymous U. schrieb: >> Eine Frage noch. Kann man das so machen. Oder gibt es da elegantere >> Möglichkeiten. > > Warum krampfhaft in der main() eine Klasseninstanz anlegen und > einen globalen Pointer darauf? Gibt es dafür triftige Gründe? Meine Klassen benötigen eine bereits initialisierte HAL. Ich könnte zwar eine init()-Funktion in die Klasse integrieren, aber wenn dieser Code im Konstruktor steht, finde ich es schöner. Felix U. schrieb: > Es > gibt sicher Projekte, wo der zusätzliche Aufwand Sinn ergibt, aber oft > ist es auch sinnvoll, einfach beim Bewährten zu bleiben. Ich war lange am überlegen, ob ich C oder C++ verwenden sollte. Ich bin da eher erstmal zögerlich Neuem gegenüber. Aber dann dachte ich zurück an meine Anfänge mit ASM und wie ich mich erst gegen C gesträubt habe :-) So here we go..
Gast
#6348355
ich benutze mittlerweile auch viel C++ und sehe darin keinen Nachteil. Dazu Mbed-os, das ebenfalls sehr konsequent C++ nutzt und auch das API bietet alles in Klassen an. Die Interrupts kann man da auch bequem im Usercode abarbeiten: Im RAM ist ein Bereich für die Kopie der Interrupt Vektoren reserviert. Die ISR kann fest in die Tabelle wenn sie zur Kompilierzeit bekannt ist, kann aber zur Laufzeit einfach mit
umgebogen werden. Für den Fall das man eine Methode als ISR nutzen möchte gibt es einen Helfer names CThunk. Das ist eine Trampolin Funktion die sich einen Callback merkt und als ISR arbeitet. Kostet zusätzliche indirekte calls, aber die nehme ich für den Luxus in Kauf. Dafür spare ich mir die lange universelle Behandlung in der HAL ISR. Der Vorteil ist, das ich meine Komponente schön kapseln kann und die bei Bedarf den ISR Kram implizit behandelt. Es muss keine ISR im Core vorab reserviert werden (Arduino) oder eine unübersichtliche 'ich kann alle Ints' (HAL) implementiert werden. Benutzt habe ich das z.B. in einer Timerklasse. Der gebe ich den gewünschten Callback mit und intern wird die Interruptbehandlung gemacht. Auszugsweise sieht das so aus, Timerkram weggelassen:
Den CThunk könnte man auch aus dem OS rausoperieren, der setzt nichts OS spezifisches vorraus. Aber da habe ich keine Ambitionen, das OS hat ja noch mehr zu bieten das ich benutzen möchte. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|