Forum: Mikrocontroller und Digitale Elektronik Pointer kaputt mit avr-gcc?


von greg (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich habe einige Funktionen zur Ansteuerung eines HD4470-kompatiblen
(KS0070B) Displays geschrieben. Soweit funktioniert auch erstmal alles
in der Hinsicht, Initialisierung, Screen löschen, Cursorposition setzen
etc. Dazu habe ich jetzt eine Funktion lcd_print(), die einen
nullterminierten String byteweise an das LCD schicken soll. Diese
funktioniert allerdings nicht wie gewünscht, nach der Diskussion im IRC
scheint alles darauf hinauszulaufen, dass der Pointer zum String auf
irgendeine Weise "kaputtgeht". Auf dem LCD sehe ich statt der
Zeichenkette nur Datenmüll, da der Pointer anscheinend nicht auf den
String zeigt klappt's mit der Nullterminierung natürlich auch nur
irgendwann zufallsweise. Kann jemand dazu was sagen?

Es handelt sich hier um avr-gcc 3.4.3 mit AT Tiny 2313 bzw. dem älteren
AT90S2313 (kein Unterschied festzustellen bei diesem Problem).

Die Sourcen habe ich inkl. Makefile angehängt. Zusätzlich stehen sie
noch online unter http://rafb.net/paste/results/URBZ2673.html .

von Stefan (Gast)


Lesenswert?

Mit dem AVR-GCC habe ich (noch) keine Erfahrung, also nicht böse sein,
wenn ich dummschwafele.

Reduziert aufs wesentliche...
-------
void lcd_print(char *str);

void lcd_print(char *str) {
    while(*str)
        lcd_data(*str++);
}

void main(void) {
    lcd_print("Hello World!");
}
-------
1/ Sollte der Prototyp nicht
void lcd_print(const char *str);
sein, weil die Zeichenkette "Hello World!" read-only ist?

2/ Hast du schon probiert ein Assemblerfile zu erstellen? Dort sollte
man genau sehen, was passiert. Mit dem normalen GCC geht das mit der
Kommandooption -s (statt -o für Objektfile bzw. fertigem Programm).

3/ Hast du vielleicht ein Stackproblem (Größe?) bei der Übergabe als
Funktionsargument? Probiere es mal ohne Stackübergabe...
static char *s = "Hello World!";
void main(void) {
    lcd_print(s);
}

von MNR (Gast)


Lesenswert?

Ja, so einen Fehler soll es geben. Probiere mal, das

lcd_data(*str++)

in 2 Zeilen (also str++ und lcd_data(*str)) zu schreiben.

Gruß,
Matthias

von Tom (Gast)


Lesenswert?

Ich würde mich MNR anschließen.
Ne Anweisung wie lcd_data(*str++) ist gefährlich. Weisst du sicher,
welcher Operator da Vorrang hat, der * oder das ++ ? Wird der Pointer
inkrementiert oder der Inhalt der Speicherstelle?
Es ist wesentlich sicherer, das in zwei Befehle zu zerlegen. Ausserdem
machts den Code übersichtlicher.

Tom

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Da reichen "Angstklammern", um dem Compiler mitzuteilen, was man genau
will:

  lcd_data(*(str++));

von MNR (Gast)


Lesenswert?

Ich beziehe mich auf dieses Problem:

http://www.mail-archive.com/avr-gcc-list@nongnu.org/msg02248.html

Das *str++  per se ok ist, ist schon klar. Allerdings bezieht sich
obiges auf 3.4.5, es war auch nur eine Idee, was man probieren könnte.

Gruß,
Matthias

von greg (Gast)


Lesenswert?

Jetzt gibt's was zu lachen. Das Problem hat sich nämlich erledigt, aber
auf eine ziemlich lustige Weise. :-)

Nichts mit GCC-Bugs, etc. Ich hatte nur vergessen, per objcopy die
.data-section in mein .bin zu kopieren! Das erkennt man auch schön am
Makefile - nur .text wird dort kopiert.

Danke für den Hilfeversuch trotzdem an alle!

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.