www.mikrocontroller.net

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


Autor: greg (Gast)
Datum:
Angehängte Dateien:

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

Autor: Stefan (Gast)
Datum:

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

Autor: MNR (Gast)
Datum:

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

Autor: Tom (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da reichen "Angstklammern", um dem Compiler mitzuteilen, was man genau
will:

  lcd_data(*(str++));

Autor: MNR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich beziehe mich auf dieses Problem:

http://www.mail-archive.com/avr-gcc-list@nongnu.or...

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

Autor: greg (Gast)
Datum:

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

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.