mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Statusregister & Interrupt


Autor: Rennreh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael H. (morph1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei DEM controller geht das sicher nicht

eventuell aber bei DEM anderen

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
man sollte annehmen, dass ein C-Compiler einem das abnimmt.

Autor: Rennreh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael H. (morph1)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Rennreh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: aha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Eckhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Diensthabender Troll (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: munsa (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kai G. (runtimeterror)
Datum:

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

Ist nicht dein Ernst, oder?

Autor: A. K. (prx)
Datum:

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

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.