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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.