mikrocontroller.net

Forum: Compiler & IDEs register nicht nutzen


Autor: Hans Müller (anno)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

geht es in C irgendwie, dass man ein bestimmtes register nicht nutzt 
bzw.
dem compiler mitteilt, dass z.b. R24 und R25 nicht genutzt werden 
sollen?


gruß anno

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht es um AVR-GCC?

Dann lies mal 
http://www.nongnu.org/avr-libc/user-manual/FAQ.htm...

Was willst du machen?

Du kannst wohl r24 und r25 bedenkenlos in eigenen ASM-Routinen benutzen, 
ohne die alten Inhalte zu retten. Eigene dauerhafte Werte in r24/r25 
müssen dann aber vor dem Rücksprung zu C gerettet werden.

Dem C-Compiler komplett r24/r25 wegzunehmen halte ich für nicht 
praktikabel. Dieser Extremweg würde, so wie ich es sehe, eine Änderung 
der Targetbeschreibungen und ein Neukompilieren aller Libraries 
voraussetzen.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hans Müller schrieb:
> Hallo zusammen,
>
> geht es in C irgendwie, dass man ein bestimmtes register nicht nutzt
> bzw.
> dem compiler mitteilt, dass z.b. R24 und R25 nicht genutzt werden
> sollen?

Is kommt darauf an, was du machen willst wie gesagt. Ausserdem ist das 
compilerabhängig. Ich vermute mal es geht um avr-gcc?

Register, die vom ABI (Application Binary Interface) verwendet werden, 
würde ich dafür nicht hernehmen. Diese GPRs (General Purpose Regs) 
werden zB für Parameterübergabe an Funktionen und Returnwert von 
Fnuktionen verwendet. Es ist zwar vorstellbar, avr-gcc so weit zu 
parametrisieren, daß er auch wenn diese Register fix sind, korrekten 
COde abliefert und nicht abschmiert, aber den Aufwand will und wird kein 
avr-gcc Entwickler treiben.

Globale Register können in wenigen, ausgezeichneten Fällen sinnvoll 
sein. Dazu definiert man die Variable des gewünschten Typs als globales 
Register, zB in R3:R2:
#include <stdint.h>

register uint16_t global_reg asm ("r2") = 0x1234;

Alle Module der Anwendung werden dann übersetzt mit
avr-gcc -ffixed-2 -ffixed-3
Evtl. kann diese Regel etwas laxer gefasst werden, wenn nur die 
Anwendung, nicht aber ISRs das Register verwenden.

Bei Verwendung von Bibliotheken (libc, libm, libgcc, ...) muss 
sichergestellt sein, daß keine zugelinkte Funktion die Regs verwendet 
bzw. nicht im Widerspruch zu dessen Verwendung in der Anwendung sind 
(Kann sein, wenn das globale GPR nur in einer ISR-lokal verwendet wird 
(dann also nicht zwischen ISRs, auch nicht bis zur nächsten) und keine 
der Lib-Funktionen in der ISR benutzt werden).

Beachte auch, daß die unteren Register nicht so effizient genutzt werden 
können wie die oberen. Um Flags zu speichern bist du besser bedient ein 
GPIORx zu nehmen falls verfügbar, denn ein Flag in zB R2 zu setzten geht 
nicht direkt: zuerst muss eine Maske in ein "d"-GPR gelaten werden.

Weiterhin ist zu beachten daß globale Variablen nicht volatile sind!
Einige gcc-Optimizer lassen zB zu daß auch fixe GPRs tot sein können und 
werfen den zugehörigen Code weg, weil das fixe Reg (scheinbar) nicht 
verwendet wird. Zu den Pappenheimern gehört zB CSE in GCC 4.

Ausserdem ist es zwecklos, eine globale GPR-Variable als volatile zu 
deklarieren. Selbst wenn gcc nicht meckert hat das keinen Effekt, denn 
gcc hat intern keine Möglichkeit, ein GPR als volatile zu taggen (Im 
Gegensatz zu mem-Objekten, für die es MEM_VOLATILE_P gibt).

Es ist also einiges zu bedenken. Trotzdem kann man globale GPR sehr 
gewinnbringend einsetzen um eine merkliche Leistungssteigerung zu 
erreichen sofern der Anwendungsfall passt. Ich werwende globale Regs zB 
auch in meiner Scope-Uhr.

Um zu klären, ob es in deinem Fall sonnvoll ist oder ob es adäquatere 
"design-Pattern" gibt, müsstest du mehr über deine Anwendung erzählen.

Johann

Autor: Hans Müller (anno)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei mir ist folgendes problem.

bei mir zerschießt es immer das register 24 auf meinem xmega.

genau mit diesem display wird ein kommando an mein display gesenet wird. 
wenn dieses eben nicht den richtigen wert aufweißt, zerschißt es mir die 
anzeige im display.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hans Müller schrieb:

> bei mir zerschießt es immer das register 24 auf meinem xmega.

Dann solltest du mal danach suchen warum es das zerschiesst, statt dich 
darum herum zu mogeln.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hans Müller schrieb:
> bei mir zerschießt es immer das register 24 auf meinem xmega.

Das R24 ist eines der Arbeitspferde (Scratchpadregister) des Compilers, 
das kannst Du ihm nicht klauen.

Wenn ich mich richtig erinnere, sind nur R2..R17 als Registervariablen 
zulässig. Die Definition von Registervariablen muß dann aber auch in 
jedem Objekt mit eingefügt werden, damit der Compiler weiß, daß er sie 
nicht mehr benutzen darf.

Wird R24 unmotiviert geändert, schau mal, ob alle Interrupthandler es 
sichern vor Verwendung.


Peter

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hans Müller schrieb:
> bei mir zerschießt es immer das register 24 auf meinem xmega.
>> ... dem compiler mitteilt, dass z.b. R24 nicht genutzt werden soll?
Hört irgendwie so an:
Ich fliege in dieser Kurve mit meinem Auto immer raus.
Wie kann ich die Leitplanken höher machen?

Autor: Hans Müller (anno)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Hans Müller schrieb:
>> bei mir zerschießt es immer das register 24 auf meinem xmega.
>>> ... dem compiler mitteilt, dass z.b. R24 nicht genutzt werden soll?
> Hört irgendwie so an:
> Ich fliege in dieser Kurve mit meinem Auto immer raus.
> Wie kann ich die Leitplanken höher machen?

mein erster gedanke war eben, das register zu sperren. Denn da wo nix 
gemacht werden kann, geht ja auch nix schief.

aber dann muss ich eben nochmal genauer draufschauen. ist jaa doch um 
einiges komplizierter als ich gedacht habe.

Autor: Urgs (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ist jaa doch um einiges komplizierter als ich gedacht habe.

So ein Dosenöffner is nun mal kein Jagdgewehr.

Ich weiss nicht ob ich hier lachen oder weinen soll.

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

Bewertung
0 lesenswert
nicht lesenswert
Hans Müller schrieb:
> Lothar Miller schrieb:
>> Hans Müller schrieb:
>>> bei mir zerschießt es immer das register 24 auf meinem xmega.
>>>> ... dem compiler mitteilt, dass z.b. R24 nicht genutzt werden soll?
>> Hört irgendwie so an:
>> Ich fliege in dieser Kurve mit meinem Auto immer raus.
>> Wie kann ich die Leitplanken höher machen?
>
> mein erster gedanke war eben, das register zu sperren. Denn da wo nix
> gemacht werden kann, geht ja auch nix schief.

LOL.

Das klingt zwar logisch aber von einem kannst du höchst wahrscheinlich 
ausgehen. Es ist kein Hardwaredefekt am Register R24. Sperrst du R24, 
dann muss der Compiler ein anderes Register benutzen um die notwendige 
Berechnung zu machen. Anstelle von R24 wird es dir dann eben dieses 
andere Register zerschiessen (oder irgend ein anderes Register an einer 
ganz anderen Stelle)

Du hast einen Fehler im Programm.
Anders als im realen Leben reicht es nicht, die Symptome zu bekämpfen. 
Du musst du Ursache suchen und beseitigen.

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.