Forum: Compiler & IDEs register nicht nutzen


von Hans M. (anno)


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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Geht es um AVR-GCC?

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

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.

von Johann L. (gjlayde) Benutzerseite


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:
1
#include <stdint.h>
2
3
register uint16_t global_reg asm ("r2") = 0x1234;

Alle Module der Anwendung werden dann übersetzt mit
1
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

von Hans M. (anno)


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.

von (prx) A. K. (prx)


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.

von Peter D. (peda)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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?

von Hans M. (anno)


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.

von Urgs (Gast)


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.

von Karl H. (kbuchegg)


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.

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.