Forum: Mikrocontroller und Digitale Elektronik Statusregister & Interrupt


von Rennreh (Gast)


Lesenswert?

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

von Michael H. (morph1)


Lesenswert?

bei DEM controller geht das sicher nicht

eventuell aber bei DEM anderen

von Vlad T. (vlad_tepesch)


Lesenswert?

man sollte annehmen, dass ein C-Compiler einem das abnimmt.

von Rennreh (Gast)


Lesenswert?

@ 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

von Michael H. (morph1)


Lesenswert?

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 ;)

von Rennreh (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von aha (Gast)


Lesenswert?

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

von Eckhard (Gast)


Lesenswert?

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

von Diensthabender Troll (Gast)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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.

von Kai G. (runtimeterror)


Lesenswert?

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

von munsa (Gast)


Lesenswert?

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!

von (prx) A. K. (prx)


Lesenswert?

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.

von Kai G. (runtimeterror)


Lesenswert?

>solange keine aktionen durchgeführt werden die
>auf die statusregister zugreifen ist das egal ;-)

Ist nicht dein Ernst, oder?

von (prx) A. K. (prx)


Lesenswert?

Wenn der Handler nicht viel mehr tut als ein I/O-Bit zu setzen, warum 
nicht?

von Kai G. (runtimeterror)


Lesenswert?

>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
Noch kein Account? Hier anmelden.