beginner_de
beginner_de
beginner_de
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Avr-Asm-Tutorial S. 72<br />
Salat. Das passiert vielleicht nur alle paar Minuten mal, ein schwer zu diagnostizieren<strong>de</strong>r Fehler.<br />
Wir müssten dann schon vor <strong>de</strong>r Ablage auf <strong>de</strong>m Stapel alle Interrupts mit CLI abschalten und nach<br />
<strong>de</strong>r Verwendung und Wie<strong>de</strong>rherstellung <strong>de</strong>s Registers die Interrupts wie<strong>de</strong>r mit SEI zulassen. Liegen<br />
zwischen Ab- und Anschalten <strong>de</strong>r Interrupts viele Hun<strong>de</strong>rt Instruktionen, dann stauen sich die<br />
zwischenzeitlich aufgelaufenen Interrupts und können verhungern. Wenn zwischendurch <strong>de</strong>r Zähler<br />
zwei mal übergelaufen ist, dann geht unsere Uhr danach etwas verkehrt, weil aus <strong>de</strong>n zwei Ereignissen<br />
nur ein Interrupt gewor<strong>de</strong>n ist.<br />
Innerhalb einer an<strong>de</strong>ren Interrupt-Service-Routine können wir rCnt auf diese Weise (also mit PUSH<br />
und POP) verwen<strong>de</strong>n, weil diese nicht durch an<strong>de</strong>re Interrupts unterbrochen wer<strong>de</strong>n kann. Allerdings<br />
sollte man sich bewusst sein, dass je<strong>de</strong>s PUSH- und POP-Pärchen vier weitere Taktimpulse<br />
verschwen<strong>de</strong>t. Wer also satt Zeit hat, hat auch Register en masse. Wer keine Register übrig hat,<br />
kommt um so was vielleicht nicht herum.<br />
Manchmal MUSS auf ein Register o<strong>de</strong>r auf einen Teil eines Registers (z.B. ein Bit) sowohl von innerhalb<br />
als auch von außerhalb einer Interrupt-Service-Routine zugegriffen wer<strong>de</strong>n, z.B. weil die<br />
ISR <strong>de</strong>m Hauptprogramm-Loop etwas mitzuteilen hat. In diesen Fällen muss man sich ein klares<br />
Bild vom Ablauf verschaffen. Es muss klar sein, dass Schreibzugriffe sich nicht gegenseitig stören<br />
o<strong>de</strong>r blockieren.<br />
Es muss dann auch klar sein, dass dasselbe Register bei zwei nachein<strong>de</strong>r folgen<strong>de</strong>n Lesevorgängen<br />
bereits von einem weiteren Interrupt verän<strong>de</strong>rt wor<strong>de</strong>n sein kann. Liegen die zwei Zeitpunkte längere<br />
Zeit auseinan<strong>de</strong>r, dann ist es je nach <strong>de</strong>m Timing <strong>de</strong>s Gesamtablaufes fast zwingend, dass irgendwann<br />
ein Konflikt auftritt.<br />
An einem Beispiel: sowohl <strong>de</strong>r Timer als auch <strong>de</strong>r ADC haben <strong>de</strong>m Hauptprogramm etwas mitzuteilen<br />
und setzen jeweils ein Bit eines Flaggenregisters rFlag. Also etwa so:<br />
Isr1:<br />
Isr2:<br />
[...]<br />
sbr rFlag,1