Forum: Mikrocontroller und Digitale Elektronik Generlle Frage zu Interrupts und Codemenge in diesen


von Nico B. (vegetico)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

> 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.

von Purzel H. (hacky)


Lesenswert?

In der interrupt routine hat es nie ein cli & sei. Ich wuerd alles main 
machen, hier nur eine boolean setzen

von Nico B. (vegetico)


Lesenswert?

OK, Danke,
vor allem für die Erklärung. Dann pack ichs raus.

Gruß
Nico

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.