Hallo, Versuche einen Software Interrupt mit dem STM32L432KC zu realisieren. Möchte, wenn ich an einer bestimmten Stelle im Code bin einen Interrupt auslösen. Habe leider kein Beispiel gefunden bzw. habe ich derzeit vermehr nur mit den HAL-Funktionen gearbeitet. Ich habe mal versucht das Bit37 im IMR2-Register zu setzen SET_BIT(EXTI->IMR2 , EXTI_IMR2_IM37_Msk); und nehme an, dass man mit beim setzen des namentlich selben Bits im SWIER-Register den Interrupt auslöst? SET_BIT(EXTI->SWIER2 , EXTI_SWIER2_SWI37_Msk); aber es wird nicht in die Funktion void SVC_Handler(void) gesprungen. Vl. kann mich wer aufklären wie das geht!?
Roman R. schrieb: > und nehme an, dass man mit beim setzen des namentlich selben Bits im > SWIER-Register den Interrupt auslöst? Warum nimmst du das an. Steht das irgendwo in der Beschreibung des Registers? Nein. > aber es wird nicht in die Funktion > void SVC_Handler(void) Rufe die Funktion doch einfach auf! Ansonsten könnte NVIC_SetPendingIRQ(Peripherial_IRQn) für dich interessant sein.
Roman R. schrieb: > Habe leider kein Beispiel gefunden bzw. habe ich derzeit vermehr nur mit > den HAL-Funktionen gearbeitet. Tja, da hast du dich bislang schlichtweg im dafür falschen Gefilde umgetan. Wie man mit Supervisor-Calls umgehen kann, hatte ich vor vielen Jahren schon in der Lernbetty vorgeturnt. Von hause aus kann das der Keil, der GCC ist dafür zu doof, da muß man in Assembler mit einem Wrapper nachhelfen. Hier nur mal als Beispiel:
1 | __swi(38) void V24_StrOut (char* P); /* String auf UART ausgeben */ |
Das geht beim Keil. Beim GCC braucht es etwa sowas:
1 | .thumb_func |
2 | .global V24_StrOut |
3 | V24_StrOut: PUSH {LR} |
4 | SVC 38 |
5 | POP {PC} |
Na denne, vielleicht hat's was geholfen. Sind Teile aus der Lernbetty, also rund 10 Jahre alt. W.S.
Beitrag #6922423 wurde vom Autor gelöscht.
W.S. schrieb: > Na denne, vielleicht hat's was geholfen. Das funktioniert aber nur im timeslot 42. Ansonsten gilt: Stefan ⛄ F. schrieb: > Rufe die Funktion doch einfach auf!
Vielleicht nützt das was, wenn du den SVC-Handler aufrufen willst:
1 | #define SVC(n) asm volatile ("svc $0" :: "n"(n))
|
2 | |
3 | ...
|
4 | SVC(0); |
5 | ...
|
:
Bearbeitet durch User
m.n. schrieb: > Das funktioniert aber nur im timeslot 42. Ansonsten gilt: > > Stefan ⛄ F. schrieb: >> Rufe die Funktion doch einfach auf! Wenn du schon vom GCC vorgeprägt bist, dann halte dich doch lieber etwas zurück und poste nicht so etwas. Und der Stefan weiß auch nicht, wovon hier die Rede ist. Ich sag's hier lieber nochmal, um die Sache klarer zu machen: Der SVC, also der Supervisor-Call ist eine Möglichkeit, ein API zu machen. Es gibt eine Art Betriebssystem (oder Basissystem, je nach Gusto), das seine Leistungen über SVC-Calls bereitstellt. Die darauf laufenden Applikationen können diese Leistungen in Anspruch nehmen, OHNE wissen zu können, wo nun genau sich die zugehörige Funktionalität im Betriebssystem befindet. Stefan meint, daß man eine Funktion aufrufen kann, die in dem Zeugs bekannt ist was man gerade übesetzt. Das stimmt, aber die Funktionen im Betriebssystem sind der Applikation eben NICHT soweit bekannt, daß man sie vom Linker einbinden lassen könnte. Obendrein laufen diese Funktionen im Supervisor-Modus (so man den auch eingerichtet hat) und benutzen auch nicht den User-Stack, sondern den Supervisor-Stack. Kurzum, der SVC ist ein Interface zwischen zwei Programmen, die ansonsten voneinander unabhängig sind. Ein direktes Aufrufen der betreffenden Prozeduren oder Funktionen ist per se unmöglich. W.S.
Stefan ⛄ F. schrieb: > Rufe die Funktion doch einfach auf! Aha, eine ISR aus dem User/System Context raus aufrufen. Ganz tolle Idee, vor allem wenn die ISR nicht reentrant ist wird das dann besonders lustig. Stefan ⛄ F. schrieb: > Ansonsten könnte NVIC_SetPendingIRQ(Peripherial_IRQn) für dich > interessant sein. Das wäre das richtige um Perippherieinterrupte per software auszulösen, aber der TO will Roman R. schrieb: > void SVC_Handler(void) Und das ist was völlig anderes. Hier wird Ihnen geholfen: https://developer.arm.com/documentation/dui0471/m/handling-processor-exceptions/svc-handlers-in-c-and-assembly-language SVC dann per Inline assembly "SVC <xx>" auslösen. Fertig
Andreas M. schrieb: > SVC dann per Inline assembly "SVC <xx>" auslösen. Fertig Ähem... nö, nicht fertig, sondern eher geschafft, in die Startlöcher zu kommen. Wie schon gesagt, der GCC kann es nicht. Also für alle GCC-Nutzer ist hier erstmal Assembler angesagt. Sozusagen klientseitig bzw. aufruferseitig. Und von der Handlerseite her haben wir das Ganze noch gar nicht beleuchtet. Da ist wieder ein Stück Assembler angesagt, um aus dem SVC-Befehl der zum Interrupt geführt hat, die SVC-Nummer herauszuholen und diese zum Verzweigen auf die gewünschte Funktionalität zu benutzen. Es ist für den TO wohl am besten, die entsprechende Dokumentation bei ARM nachzulesen und ggf. dann bei den Quellen der Lernbetty nachzuschauen, wie man das Ganze als API konkret benutzen kann. Aber Vorsicht: Die Lernbetty war noch ein ARM7TDMI Projekt und wie es mit den Cortexen ganz genau geht, muß man bei ARM nachlesen. W.S.
W.S. schrieb: > Ähem... nö, nicht fertig, sondern eher geschafft, in die Startlöcher zu > kommen. Wie schon gesagt, der GCC kann es nicht. Also für alle > GCC-Nutzer ist hier erstmal Assembler angesagt. Sozusagen klientseitig > bzw. aufruferseitig. Ja, nichts anderes habe ich doch geschrieben oder? W.S. schrieb: > Es ist für den TO wohl am besten, die entsprechende Dokumentation bei > ARM nachzulesen und ggf. dann bei den Quellen der Lernbetty Den Link von mir hast Du absichtlich übersehen?
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.