Forum: Mikrocontroller und Digitale Elektronik Software Interrupt mit STM32


von Roman R. (reiter86)


Lesenswert?

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!?

von Stefan F. (Gast)


Lesenswert?

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.

von W.S. (Gast)


Lesenswert?

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.
von m.n. (Gast)


Lesenswert?

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!

von (prx) A. K. (prx)


Lesenswert?

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
von W.S. (Gast)


Lesenswert?

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.

von Andreas M. (amesser)


Lesenswert?

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

von W.S. (Gast)


Lesenswert?

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.

von Andreas M. (amesser)


Lesenswert?

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
Noch kein Account? Hier anmelden.