mikrocontroller.net

Forum: Compiler & IDEs probleme mit GCC


Autor: Markus (Gast)
Datum:

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

Autor: A.K. (Gast)
Datum:

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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sind irgendwelche in Assembler geschriebenen Routinen beteiligt? Oder 
Interrupt-Routinen? Èin RTOS?

Autor: markus (Gast)
Datum:

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

Autor: kosmonaut pirx (Gast)
Datum:

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


Autor: Falk Brunner (falk)
Datum:

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

Autor: markus (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

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

Autor: Joerg X. (Gast)
Datum:

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

Autor: markus (Gast)
Datum:

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

Autor: kosmonaut pirx (Gast)
Datum:

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

bye kosmo

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.