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
bei DEM controller geht das sicher nicht eventuell aber bei DEM anderen
@ 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.
>solange keine aktionen durchgeführt werden die >auf die statusregister zugreifen ist das egal ;-) Ist nicht dein Ernst, oder?
Wenn der Handler nicht viel mehr tut als ein I/O-Bit zu setzen, warum nicht?
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.