Ulrich P. wrote:
>
> Da die Interrupt Routine sehr klein ist, ist die Wahrscheinlichkeit sehr
> hoch, dass der Compiler sie vollständig in Registern abhandelt, denn er
> ändert seine Strategie nicht Code zu optimieren. Er weiß nix von einer
> Spezialbehandlung für Interrupts.
Das Problem ist nicht die Interrupt Routine.
Am Ende einer Funktion müssen sowieso alle in Register gehaltenen
Variablen ins RAM zurückübertragen werden.
Das Problem ist vielmehr die abfragende Schleife. Wenn der Compiler
sich hier dafür entscheidet, die Variable ständig im RAM zu behalten,
dann kriegt die abfragende Schleife eine Änderung des Variablen-
Wertes überhaupt nicht mit.
Das kann dann auch soweit gehen, dass die Datenfluss-Analyse
ergibt, dass diese konkrete Schleife überhaupt nie betreten
oder verlassen werden kann und wahlweise die Schleife
komplett entfernt oder gegen eine Endlosschleife ohne irgend
welche Abfragen ersetzt.
> Das Gegenstück ist übrigens 'register', was den Compiler zwingt eine
> Variable zwingend in einem Register zu führen.
'register' zwingt den Compiler zu überhaupt nichts.
'register' ist für den Compiler maximal ein Vorschlag, was man
denn machen könnte. Bei den meisten Compilern ist es eher so,
dass man froh sein kann, wenn der Compiler ein 'register' ganz
einfach ignoriert und lieber seiner Datenflussanalyse vertraut.