funktionen in interrupts (msp430 + C)

Gast #3747637
Lesenswert?
• ▲
▼
Hallo,

ich hätte eine Frage zu interrupts beim msp430. Ich programmiere den uC 
in C und benutze CCS.

Ich schicke über UART Befehle an den uC und greife diese über den RX 
interrupt ab. Über Kontrollstrukturen kann ich dann z.B. bei Empfang 
eines 'A' Port 1.0 auf high legen.

Da ich es gewohnt bin meinen Code in Funktionen aufzuteilen und das für 
die Übersicht und sich wiederholende Aufgaben auch angenehmer ist, 
wollte ich das hier auch machen.
Aber anscheinend gibt es Probleme aus interrupts Funktionen aufzurufen.

Diesen Hinweis bekomme ich:
"ISR USCI0RX_ISR_HOOK calls function tx. Recommend moving function call 
away from ISR, or inlining the function, or using pragmas"

Inlining bringt auch nichts.

Gibt es eine Möglichkeit oder muss man den kompletten Code in den 
interrupt stopfen?
#3747655
Lesenswert?
• ▲
▼
Am besten ist es, in der ISR so wenig wie möglich zu machen, da in 
dieser Zeit keine weiteren Interrupts ausgelöst werden können und du 
somit ein Ereignis verpassen könntest. Wenn du umfangreicheren Code bei 
einem Ereignis ausführen möchtest, definiere am besten eine globale 
Variable als Flag, die du dann in der ISR setzt. Damit bist du dann 
schnell aus der ISR wieder raus. In der Hauptschleife pollst du dann 
diese Variable und wenn die Flag gesetzt ist, rufst du die entsprechende 
Funktion auf und löscht die Flag wieder.
Wenn in der Funktion aber nur wenig Code ausgeführt wird und du dir 
sicher bist, kein Interrupt zu verpassen, kannst du die Compilerwarnung 
auch ignorieren.
Gast #3747738
Lesenswert?
• ▲
▼
Natürlich kann man in einer ISR auch mit Funktionen arbeiten.
Sollten halt hinreichend kurz sein.
Wie inline bei deinem Compiler funktioniert, verrät das manual.

Vielleicht schon so:
1
static inline foo(void)
2
{
3
/* so something */
4
}
#3747789
Lesenswert?
• ▲
▼
Funktionsaufrufe in einer ISR sollte man vermeiden, weil der Compiler 
dann realtiv viele Register retten muss, einfach schon um die standard 
Aufrufkonvention einzuhalten. Da bei einer allgemeinen Funktion auch 
erst der Linker den Code zusammensetzt muss der Compiler da viele ggf. 
gar nicht benötigte Register retten. Das kostet Laufzeit und Speicher 
auf dem Stack


Der einfache Weg is es einfach kein Funktionsaufrufe zu verwenden. Die 
Vermeidung von Funktionsaufrufen vermeidet nebenbei auch das Problem mit 
ggf. nicht reentranten Funktionen.
Ersatzweise kann man ggf. #Define nutzen um Teile optisch aufzuteilen - 
das hat aber auch nachteile bei der Lesbarkeit und Fehlersuche.
Es kann helfen, wenn man die Funktionen static inline definiert. Der 
Compiler kann dann den Code einfach direkt einfügen, ohne den Overhead 
für den Aufruf - ob der Compiler die Möglichkeit nutzt ist von der 
Optimierungseinstellung und dem Compiler abhängig.

So sehr viel Code hat man inder Regel nicht in der ISR - es gibt aber 
natürlich auch Ausnahmen.
Gast #3747806
Lesenswert?
• ▲
▼
>"ISR USCI0RX_ISR_HOOK calls function tx. Recommend moving function call
>away from ISR, or inlining the function, or using pragmas"

Ich kann dem Compiler nur zustimmen.

Natürlich kannst Du die, von den Meisten akzeptierte (auch vom Compiler) 
Meinung, "Fasse Dich kurz" ignorieren.

Sogar hierzu gibt Dir der Compiler hinweise...

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.