Forum: Compiler & IDEs probleme mit GCC


von Markus (Gast)


Lesenswert?

Hallo,

ich habe ein verstaendnis problem:

ich schreibe eine library fuer das CAN interface des a90can128 in C.

Ich moechte ein register auf null zuruecksetzen, dabei ist mir 
aufgefallen, das die register nicht mit null beschrieben werden sondern 
mit einem anderen wert. Ich habe mir den assembler output angesehen, und 
festgestellt, dass der wert des registers R1 in das CANSTMOB register 
geschrieben wird. Dieser ist zu diesem zeitpunkt jedoch nicht 0x00 
sonder hat in meinem fall 0xDD. Also wird das CANSTMOB register ein 
nicht gewuenschter wert geschrieben. Ich hab die sourcen mal mit der
option -O0 und -Os compiliert. Beide mal wird jedoch der wert von R1 
genommen.

342:        CANSTMOB = 0;      // cancel pending operation
+000007F0:   EEEE        LDI     R30,0xEE         Load immediate
+000007F1:   E0F0        LDI     R31,0x00         Load immediate
+000007F2:   8210        STD     Z+0,R1           Store indirect with 
displacement

342:        CANSTMOB = 0;      // cancel pending operation
+00000446:   921000EE    STS     0x00EE,R1        Store direct to data 
space

so dann habe ich noch einwenig weiter probiert, wenn ich jedoch einen 
wert != 0 schreibe wird der wert in diesem fall in R24 geschrieben und 
danach nach CANSTMOB geschoben, was in meinen augen richtig ist. Im 
anschluss versuche ich dann ein anderes register mit 0 zu beschreiben, 
und wieder wird der inhalt von R1 verwendet.

342:        CANSTMOB = 0x01;      // cancel pending operation
+00000446:   E081        LDI     R24,0x01         Load immediate
+00000447:   938000EE    STS     0x00EE,R24       Store direct to data 
space

343:        CANCDMOB = 0x00;
+00000449:   921000EF    STS     0x00EF,R1        Store direct to data 
space

Ich habe das ganze in der simulation von AVRStudio laufen lassen, da es 
mir im moment an der HW mangelt.

Ist das jetzt ein fehler meinerseits oder macht gcc hier etwas falsch

gruesse

markus

von A.K. (Gast)


Lesenswert?

Im Registermodell von GCC/AVR enthält R1 stets den Wert 0. Daher 
solltest du herausfinden, warum das hier nicht der Fall ist.

von A.K. (Gast)


Lesenswert?

Sind irgendwelche in Assembler geschriebenen Routinen beteiligt? Oder 
Interrupt-Routinen? Èin RTOS?

von markus (Gast)


Lesenswert?

A.K.

danke fuer deine schnelle hilfe. Es war der richtige denkanstoss, bei 
einer initialisierung eines pointers auf eine structur habe ich einen 
boessen fehler gemacht! Das war der ausloeser des problems.

Ausserdem hatte ich nicht gewusst, dass das R1 register immer null ist 
im AVR... und wieder was gelernt!

gruss markus

von kosmonaut pirx (Gast)


Lesenswert?

'tschuldigung: OT

hallo markus, da ich ebenfalls für den gleichen controller mit CAN 
rumfrickel .. was kann deine lib oder was ist beabsichtigt, wenn ich mal 
so unverblümt fragen darf? hab nur keine lust, jeden tag das rad neu zu 
erfinden, vll kann man sich gedanklich einmal austauschen, wer weiß.
thx, bye kosmo


von Falk B. (falk)


Lesenswert?

@ markus

>Ausserdem hatte ich nicht gewusst, dass das R1 register immer null ist
>im AVR... und wieder was gelernt!

Das ist es nicht. Der GCC lädt es mit Null und verwendet es als 
Null-Register.
In Assembler ist es frei verwendbar wie jedes andere Register.

Wie programmierst du denn nun wirklich? In C oder ASM? Oder gemischt? 
Letzeres ist bisweilen problematisch.

MFG
Falk

von markus (Gast)


Lesenswert?

Falk,

danke fuer die antwort, im moment verwende ich nur C; Kann ich irgendwo 
nachlesen wie der gcc dir register verwendet bzw. welche besonderheiten 
es noch zu beachten gibt beim avr.

gruss markus

von Falk B. (falk)


Lesenswert?

@ markus

>danke fuer die antwort, im moment verwende ich nur C; Kann ich irgendwo
>nachlesen wie der gcc dir register verwendet bzw. welche besonderheiten
>es noch zu beachten gibt beim avr.

Wenn du nur in C programmierst dann sind dir die Register des Prozessors 
egal. Du "siehst" sie nicht. Du hast nur deine Variablen, welche ganz 
normal verwendet werden.
Mit den Registern musst du dich nur rumschlagen, wenn du innerhalb von C 
noch mit Inline Assembler arbeiten willst. Das ist aber nur was für 
Fortgeschrittene, die sowohl C als auch Assembler gut beherrschen. 
Details dazu stehen in der Doku der libc.

MFG
Falk

von Joerg X. (Gast)


Lesenswert?

im Manual?!
...von der avr-libc und dem GCC, natürlich, wenn du WinAVR nutzt hast du 
beides auf der Festplatte

von markus (Gast)


Lesenswert?

Kosmo,

die lib wird wohl so ein gemisch aus verschieden can libs die ich so im 
netz gefunden habe und die ideen bzw. umsetzung gut gefallen haben. Im 
moment bin ich noch am debuggen, aber ohne HW. Je nach freizeit und 
wetter hoffe ich bis ende des monats fertig zu werden. Sobald sie 
vorzeigbar ist werde ich sie natuerlich hier rein stellen.
Ansonsten kannst du hier mal suchen bzw. bei AVRFreaks oder auch bei 
Atmel selbst nach sehen. Dort gibt es einige brauchbare libs.


gruss markus

von kosmonaut pirx (Gast)


Lesenswert?

hallo markus,
ja, das von atmel kenne ich. alles ganz toll, wenn man polling will, 
aber hm, nicht mein anspruch, irq's sind schon was anders. avrfreaks 
habe ich noch nicht geschaut, werde ich mal machen, danke.

achja, register usage des avr-gcc
http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_reg_usage

bye kosmo

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.