ARM/KEIL: Wie kann eine C-Funktion erkennen ob sie aus ISR heraus aufgerufen wurde?

OP #1673626
Lesenswert?

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.
#1673631
Lesenswert?

Klassische ARMs: Im Statusregister steht drin, in welchem 
Registerkontext er grad läuft (das wird das sein, was du im Debugger 
siehst). Das funktioniert aber nur, wenn man keine verschachtelten 
Interrupts zulässt, weil er sonst im Handler sofort vom 
Interrupt-Context wegschaltet. Ansonsten kann es sein, dass der 
Interrupt-Controller diese Information vermittelt, aber da gibt's mehr 
als einen Typ von.

Cortex-Cores: Aktuelle Priorität.
Gast #1673636
Lesenswert?

Hallo!

Das hört sich nach einer ARM-CPU. Eine genauere Angabe wäre hilfreich. 
Die ARMs haben ein Feld im PS-Register das den Modus bestimmt. Je nach 
ARM sieht es unterschiedlich aus.. Eines der Modi signalisiert die 
Ausführung eines Interrupts. Google mal nach ARM processor modes.. 
Ausserdem: das CPU Manual ist dein Freund! :)

Gruss
thomas

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren