wann schlägt der Interrupt zu

OP #1156526
Hallo!
Ich habe da ein paar Verständissfragen zu Interrupts.

1. kann innerhalb einer ISR ein Interrupt in eine weitere ISR führen 
(also eine verschachtelung statt finden)?

2. folgender pseudo code liegt vor.
1
cli();
2
read_adc();   //hier soll noch kein sprung in die ISR erfolgen
3
sei();        //aber hier  <-- würde der Sprung in die ISR erfolgen 
4

5
// ISR(USART_RXC_vect)

Gruß Sticky
Hallo,

ich gehe mal davon aus, das es ein AVR-µC ist und der Code mit GCC 
übersetzt wird (wenn man sowas dazuschreibt, kann man auch gezielter 
abtworten...).

Innerhalb einer ISR sind die Interrupts gesperrt und werden erst durch 
RETI wieder freigegeben.
Wenn also
1
cli();
2
read_adc();   //hier soll noch kein sprung in die ISR erfolgen
3
sei();        //aber hier  <-- würde der Sprung in die ISR erfolgen

innerhalb einer ISR steht, ist cli/sei überflüssig.

Nach dem Ende einer ISR wird noch ein Befehl des Hauptprogramms 
ausgeführt, bevor ein anstehender Interrupt bearbeitet wird.

Gruß aus Berlin
Michael
Hallo Sticky,

>kann innerhalb einer ISR ein Interrupt in eine weitere ISR führen

Ja, das ist möglich, aber nur wenn man in der ISR die Interrupts manuell 
aktiviert. Ansonsten sind sie, wie Michael geschrieben hat, in der ISR 
gesperrt und werden erst nach ihrer Abarbeitung wieder freigegeben.

MfG Mark
OP
Danke erstmal für die Antworten.

@Michael
Ja AVR µC. ja GCC (sorry hab ich vergessen)

@oliver
Ich will eine LIN UART Kommunikation herstellen und überlege, ob ich die 
Kommunikation mit interrupts oder durch Polling realisiere. bei der 
LIN-Kommunikation zeigt das "Framing Error" - FLAG an, dass ein Header 
zur initialsierung der Kommunikation anliegt.

werde es wohl mit interrupts machen und innerhalb der ISR abfragen ob 
das Flag gestz ist.

@allgemein
nochmal vertändlicher.
1
main(){
2
cli();
3
read_adc();   //hier soll noch kein sprung in die ISR erfolgen.  
4
sei();        //aber hier  <-- würde der Sprung in die ISR erfolgen? 
5
}
6

7
 ISR(USART_RXC_vect){
8
  do-Stuff;
9
}

der grund meiner fragen zielt auf folgendes ab. ich will ADC-werte über 
LIN versenden. wie bereits erwähnt initialisiert die Kommunikation ein 
Master mit seinem Header (was zu einem intterupt führt).

meine Bedenken sind nun:
während der aufnahme und verarbeitung der daten soll kein interrupt 
ausgelöst werden dürfen. würde ich den Interrupt verpassen können oder 
liegt er noch an? (siehe code in main)

gibt es ein gcc pendant zu reti? also reti() oder so

danke nochmal

Gruß Sticky
@  Amir B-a (sticky)

>Ich will eine LIN UART Kommunikation herstellen und überlege, ob ich die
>Kommunikation mit interrupts oder durch Polling realisiere.

Geht beides.

>main(){
>cli();
>read_adc();   //hier soll noch kein sprung in die ISR erfolgen.
>sei();        //aber hier  <-- würde der Sprung in die ISR erfolgen?
>}

Du hast ein komisches Kopnzept bzw. Vorstellungen von einem 
Interrupt.

>während der aufnahme und verarbeitung der daten soll kein interrupt
>ausgelöst werden dürfen. würde ich den Interrupt verpassen können oder
>liegt er noch an? (siehe code in main)

Kommt auf die Zeitdauer der Sperrung an, siehe Artikel oben. Prinzipiell 
solle man Interrupts nur GANZ KURZ sperren.

>gibt es ein gcc pendant zu reti? also reti() oder so

Nein, das brauchst du auch nicht. Das macht der GCC allein.

MFG
Falk
Amir B-a wrote:

> gibt es ein gcc pendant zu reti? also reti() oder so

Ein RETI darf man niemals nicht in C aufrufen!!!

Der Effekt ist, daß Du irgendwo hin springst, wo zufällig die Variablen 
stehen, die in der Funktion gepusht wurden.

Ein RETI ist also unter C eine völlig unsinnige Operation.

In C benutzt man "return".
Das räumt erstmal den Stack auf und macht dann RET bzw. RETI.


Peter

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 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.