Hallo,
ich muss eine kleine API schreiben, die unsere hausintere API an das
RL-ARM Betriebssystem von KEIL anflanscht. Dabei ist es bei einigen
API-Funktionen notwendig, dass diese erkennen können, ob sie von einer
ISR heraus aufgerufen wurden oder nicht.
Beispiel:
Die nachfolgende Funktion löscht ein Event und darf nicht in einer ISR
aufgerufen werden. Wenn doch, gibt sie OS_ERROR_ISRLEVEL zurück. Im
OK-Fall ruft sie die os_evt_clr von RL-ARM auf.
1 | Status ClearEvent(EvtMask mask)
|
2 | {
|
3 | if(AusISRherausAufgerufen) // <-- gibt's da ein Makro / Intrinsic / ... ?
|
4 | {
|
5 | return OS_ERROR_ISRLEVEL;
|
6 | }
|
7 | else
|
8 | {
|
9 | os_evt_clr(event);
|
10 | return OS_OK;
|
11 | }
|
12 | }
|
Da ich noch nicht so vertraut bin mit der KEIL-Umgebung meine Frage an
euch, gibt's eine einfache Methode rauszufinden, ob die Funktion gerade
in einer ISR läuft oder nicht? Könnte ich dazu z.B. VICVectAddr auf 0
vergleichen?
Habe beim Debugging gesehen, dass der erkennt, ob ich im Mode "ISR" oder
"User" bin. Scheint also irgendwie möglich zu sein. Ich hab aber keine
Möglichkeit gefunden, an diese Aussage mit C-Code heranzukommen.
Vielen Dank vorab.