Generlle Frage zu Interrupts und Codemenge in diesen

OP #2764731
Moin...

Wie oben schon geschrieben gehts mir um die Codemenge bzw. 
Abarbeitungszeit eines Interrupt. Man ließt zwar öfter, dass da so wenig 
wie möglich rein sollte - aber mir fällt aktuell zumindest kein 
konkreter Wert ein (in welcher Form auch immer).
Als Beispiel, ich hab bei nem kleinen Bastelprojekt u.A. nen Timer, der 
sich um n bissl Krams kümmert:
1
ISR(TIMER0_OVF_vect)
2
{
3
  cli();
4
  ++timerCounterDisplay;
5
  ++timerCounterJitter;
6
  if ((timerCounterDisplay>=timerOverFlowUpdateDisplay) && (lastState!=currentState))
7
  {
8
    displayErrorMessageOnLCD(currentState);
9
    lastState = currentState;
10
    timerCounterDisplay = 0;
11
  }
12
  if ((timerCounterJitter>=timerOverFlowJitter) && (jitter==1))
13
  {
14
    setJitter();
15
    ++jitterValueCounter;
16
    if (jitterValueCounter==4) 
17
      jitterValueCounter = 0;
18
    timerCounterJitter = 0;
19
  }  
20
  sei();
21
}
Das LCD verwendet die Routinen von Peter Fleury (das beste an meinem 
Bastelkrams) - hier wird ka u.A. drauf gewartet, ob das Display busy 
ist.
Das Jitter Zeugs ist nur ne PWM-Wert Veränderung, sollte zeitlich also 
keine Rolle spielen.
Aber wie siehts mit dem LCD aus - kann man sowas in nem Interrupt machen 
- oder dauert das eigentlich schon zu lange und sollte deswegen in 
main???

Randbemerkung: Da oben fliegen ne Menge Variablen durch die Gegend - das 
ist der erste Wurf und nicht sonderlich drüber nachgedacht. Ich finds 
aber auch nicht gut. Bevor sich einer darüber wundert.

Danke schonmal
Nico
#2764734
> Aber wie siehts mit dem LCD aus - kann man sowas in nem
> Interrupt machen - oder dauert das eigentlich schon zu lange
> und sollte deswegen in main???

Der übliche Konsensus ist, dass LCD (oder auch UART) Ausgaben nicht in 
Interrupts gehandhabt werden sollen. Zumindest nicht dann, wenn diese 
direkt aufs LCD gehen. Zeitmässig betrachtet, liegen hier einige 
Größenordnungen zwischen dem Zeitbedarf der Ausgabe und dem Zeitbedarf 
der Berechnungen.

Zumal da ja noch ein 2. Problem auftaucht. Ein LCD ist in der 
überwiegenden Mehrzahl der Fälle eine 'shared Resource'. D.h. die 
Ausgabe im Interrupt wird nicht die einzige Ausgabe aufs LCD sein. Was 
dann spezielle Probleme erzeugt, wenn der Interrupt ausgerechnet dann 
kommt, wenn bereits eine andere LCD-AUsgabe läuft. Du magst dir ja mal 
überlegen, was dir in deinen LCD-Ausgabe Routinen alles passieren kann, 
je nachdem an welchen Stellen genau die Ausgabe durch einen Interrupt 
unterbrochen wird und in diesem Interrupt ein erneuter Aufruf der 
Ausgabefunktion erfolgt. Das da dann ein Text mitten in einem anderen 
Text auftaucht, ist meistens noch das kleinere Übel.

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.