Hallo,
Wenn ich den Kontroller mittels C programmiere, ist es dann eigentlich
noch notwendig bei Interrrupt Routinen den Statusregister zu sichern um
unkontrolliertes Programmverhalten zu vermeiden oder behinheltet
"Signal" schon das sichern und zurückschreiben des Statusregisters ?
mfg
@ Michael H.
Was meinst du mit bei "DEM" Kontroller ?
Gibt es denn Kontroller bei denen es nicht notwendig ist, selbst in
Assembler, den Statusregister zu sichern wenn man mit Interruptroutinen
herumpfuscht ?
mfg
es gibt einen haufen controller und einen haufen compiler
interruptroutinen werden in zig versionen ausgeführt, die für dich
passende entnimmst du dem handbuch deines compilers.
in den meisten fällen gibt es entsprechende code-konstrukte die dir das
retten der register übernehmen. aber wie gesagt, das hängt von
controller und compiler ab.
meine aussage war ein wink mit dem zaunpfahl das du vl mit etwas mehr
informationen rausrückst ;)
Ich hab meine Frage mit absicht allgemein gehalten da ich hoffte auf
eine Allgemein gültige Antwort zu bekommen. Aber klar du hast recht, ich
sollte nicht davon ausgehen das der Compiler des sichern des
Statusregisters macht. Lieber sollte ich einfach die beiden Zeilen mit
einbauen.
mfg
Rennreh schrieb:
> Lieber sollte ich einfach die beiden Zeilen mit> einbauen.
Das ist Quatsch mit Soße.
Du solltest einfach nur in die Doku zu Deinem konkreten Compiler schauen
oder in das Interrupt-Beispiel im Example-Verzeichnis Deiner
Compilerinstallation.
Peter
Es gibt in C keine festgelegte Regel, wie der Compiler mit
Interrupt-Handlern zu verfahren hat, ob damit überhaupt welche
realisierbar sind. Insofern ist das stets eine Einzelfallentscheidung,
abhängig von konkreten Compiler.
Praktisch ist es aber so, dass bei einem explizit als solchem
deklarierte Interrupt-Handler die wichtigsten(!) Prozessor-Resourcen von
Compiler oder Laufzeitumgebung selbst gesichert werden. Dazu gehört
regelmässig das Statusregister, wenn es denn eines gibt, über das der
Programmierer im Regelfall keine explizite Kontrolle hat (AVR ist da
eine Ausnahme). Zumal es zu dem Zeitpunkt, zu dem er das Statusregister
selbst sichern könnte, oft schon zu spät wäre.
Es gibt aber durchaus Prozessor-Resourcen, die nicht automatisch
gesichert werden, bei denen der Programmierer das mit dem Compiler
explizit aushandeln oder selbst Hand anlegen muss. Die Register der
DSP-Funktion der dsPICs könnten beispielsweise dazu gehören, wenn sie
vom Compiler nicht implizit verwendet werden und eine automatische
Sicherung zu deutlich verschlechterter Performance führen könnte.
Rennreh schrieb:
> Ich hab meine Frage mit absicht allgemein gehalten da ich hoffte auf> eine Allgemein gültige Antwort zu bekommen.
Es gibt keine.
C hat kein Konzept eines Interrupts.
> Aber klar du hast recht, ich> sollte nicht davon ausgehen das der Compiler des sichern des> Statusregisters macht.
Doch das solltest du. Solange deine Compiler-Doku nichts anderes sagt,
solltest du davon ausgehen, dass der Compiler die komplette Kontrolle
über die CPU hat. Jegliche Einmischung von Seiten des Programmierers ist
zwar gut gemeint aber oft kontraproduktiv.
> Lieber sollte ich einfach die beiden Zeilen mit> einbauen.
Das solltest du eben nicht.
Du solltest in der Doku nachsehen. Steht dort nichts zu dem Thema,
kannst du davon ausgehen, dass sich der Compiler selbst um solche
'Nebensächlichkeiten' kümmert und eine Einmischung vom Programmierer
nicht erwünscht ist. Genau das ist ja der Sinn einer Hochsprache: Den
Programmierer von solchem Kleinkram zu befreien und deren Einarbeitung
in den Maschinencode zu automatisieren.
>Das solltest du eben nicht. Du solltest in der Doku nachsehen. Steht dort nichts
zu dem Thema, kannst du davon ausgehen, dass sich der Compiler selbst um solche
'Nebensächlichkeiten' kümmert und eine Einmischung vom Programmierer nicht
erwünscht ist.
Da es kein allgemeingueltiges Konzept eines Interrupts gibt, noch
weniger von einem modernen Event, muss in der Doku was stehen. Wenn
nicht - in die Tonne damit. Alternativ kann man sich auch den Code
anschauen.
Hallo,
einige Controller machen das sichern des Statusregisters sogar direkt
beim Interrupt eintritt quasi in Hardware. Da ist das völlig unabhängig
von der Entwicklungsumgebung
Eckhard
> einige Controller machen das sichern des Statusregisters sogar direkt> beim Interrupt eintritt quasi in Hardware.
Welche?
(Soll keine Provokation sein, interessiert mich zwar, aber nicht so
sehr, dass ich deswegen die Datenblätter aller MC-Familien danach
durchsuche.)
Tatsächlich verhalten sich sehr viele so. 65xx, 68xx, 68xxx, x86, ARM,
usw. Das ist eher die Regel als die Ausnahme.
Wohl alle Architekturen mit Exceptions müssen zumindest bei Exceptions
automatisch das Statusregister sichern, jedenfalls dann wenn sie wie
ziemlich üblich im Exception-Handler keine Interrupts zulassen wollen
und die Interrupt-Freischaltung Bestandteil des Statusregisters ist.
Dann muss nämlich die Exception automatisch die Interrupts abschalten
und irgendwo muss der vorherige Stand gesichert werden. Und wenn man das
schon mal macht, kann man es bei Interrupts auch so halten.
Wenn dann auch noch ein User/System State hinzu kommt, dann gilt das
analog auch dafür, und diesmal auch bei Interrupts.
>> einige Controller machen das sichern des Statusregisters sogar direkt>> beim Interrupt eintritt quasi in Hardware.> Welche?
Bei den 80x68er CPUs wird zumindest das Flag-Register weggesichert.
Andere CPUs schalten auf einen komplett anderen Registersatz
(Context-Switch).
man kann seine Interrupts auch so gestalten dass man das Statusregister
gar nicht sichern muss. solange keine aktionen durchgeführt werden die
auf die statusregister zugreifen ist das egal ;-)
interruptroutinen sollten ja eh kurz sein!
Hier war von C-Programmen die Rede. Sowas geht nur in Assembler.
Ansonsten wäre das eine Entscheidung des Compilers, festzustellen ob das
Statusregister verwendet wird.
>Wenn der Handler nicht viel mehr tut als ein I/O-Bit zu setzen, warum>nicht?
Es gibt halt so gut wie keinen Befehl den man benutzen könnte, aber das
mit dem I/O wäre tatsächlich noch eine sinnvolle Aktion - hatte ich
nicht dran gedacht.