IAR ISR - Header nötig?

Gast #2741895
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
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
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
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.