Forum: Mikrocontroller und Digitale Elektronik IAR ISR - Header nötig?


von IAR (Gast)


Lesenswert?

ich habe in der IAR die folgende ISR definiert:


#pragma vector = TIMER1_A0_VECTOR
__interrupt void Timer1_A0_ISR(void)
{
  // To Do!
}



muss ich nun noch etwas im Header definieren, damit insbesondere auch 
meine main-funktion mitbekommt, dass es eine ISR gibt?
Die main ist in einem anderen Ordner.

mfg

von Stefan W. (dl6dx)


Lesenswert?

IAR schrieb:
> muss ich nun noch etwas im Header definieren, damit insbesondere auch
> meine main-funktion mitbekommt, dass es eine ISR gibt?

Genau so wie main() ausschließlich vom Reset-Vektor (über den 
Reset-init-Code) aufgerufen wird, wird eine ISR ausschließlich über den 
ihr zugeordneten Interruptvektor (und dessen ISR-init-Code) aufgerufen. 
Das ist reine Hardware, der Aufruf erfolgt gänzlich asynchron zum Ablauf 
des Hauptprogramms.

Im Normalfall (den IAR-Compiler für MSP430 kenne ich nicht) sollte 
entsprechend kein Import der Definition der ISR in andere Modulen 
notwendig sein. Der Eintrag der Einsprungadresse auf dem Interruptvektor 
(macht der Compiler) reicht.

Das führt andersherum aber auch dazu, dass man

a) globale Variable, die sowohl in der ISR als auch im Hauptprogramm 
verwendet werden, als "volatile" deklarieren muss, da der Compiler sonst 
keinen Hinweis hat, dass sie sich zwischenzeitlich ändern können. Und

b) alle Zugriffe im Hauptprogramm auf solche Variable atomar gestalten 
muss, damit die ISR nicht "dazwischenfährt".

Ok?

Grüße

Stefan

von Peter D. (peda)


Lesenswert?

IAR schrieb:
> meine main-funktion mitbekommt, dass es eine ISR gibt?

Die Main-Funktion interessiert das schlichtweg nicht. Wozu sollte sie es 
wissen müssen?

Wenn Du einen Interrupt freigibst, ohne einen Handler zu definieren, 
stürzt Deine Applikation ab.
Der Compiler kann das nicht überprüfen und gibt Dir auch keine Warnung.


Peter

von Stefan W. (dl6dx)


Lesenswert?

Stefan Wagner schrieb:
> da der Compiler sonst keinen Hinweis hat, dass sie sich
> zwischenzeitlich ändern können

Der Hintergrund dazu: Aktuelle Compiler analysieren den Codefluss und 
halten, wenn möglich, Variablen in den Prozessorregistern. Da der 
Compiler von der (asynchronen) Möglichkeit der Änderung durch die ISR 
aus dem Codefluss nichts weiß, werden zwischenzeitliche Änderungen der 
Variable durch die ISR nicht erkannt und die Variable nicht erneut 
gelesen.

Das Attribut "volatile" führt dazu, dass so deklarierten Variable bei 
jedem Lese- oder Schreibzugriff immer (auch bei eingeschalteter 
Optimierung) aus dem Speicherplatz im RAM gelesen bzw. dorthin 
geschrieben werden.

Grüße

Stefan

von Das_Warzenschwein (Gast)


Lesenswert?

kurz:

main:

#include "intrinsics.h"
enableInterrupts();

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.