www.mikrocontroller.net

Forum: Compiler & IDEs MSP430 und uprintf...


Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!

Ich habe mir mithilfe von uprintf eine "VT100" Schnittstelle an den
ersten UART-Port eines MSP430F149 gebastelt.
Leider funktionieren sämtliche Formatstrings nicht so, wie sie
sollten!
Bei %s beispielsweise kommt völliger unsinn, %d scheint wohl die
Adresse des ints auszugeben.

Hier mal ein Beispiel:

Codezeile:
printf0("STATECHANGE! State = %d; NextState = %d\r\n", State,
NextState);

Ausgabezeile:
STATECHANGE! State = 6908; NextState = 6576

Bei %s ähnliches:

Codezeile:
printf0("Date of compilation: %s\r\n", _DATE_);

...ergibt völligen blödsinn, wobei
printf0("Date of compilation: ");
printf0(_DATE_);
printf0("\r\n");

das gewünschte Ergebnis liefert...

grübel

Gruß,
Patrick...

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zu %d kann ich nix sagen, aber zu den Strings.  msp430-gcc legt meiner
Erinnerung nach alle string literals im Flash ab.  Damit funktionieren
sie natürlich nicht mit %s.  Guck mal nach, ob Du irgendein Format
findest, mit dem Du einen String aus dem Flash ausgeben kannst (%S
vielleicht?).

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum funktionieren sie dann natürlich nicht mit %s? Beim MSP430 liegen
RAM und ROM im gleichen Speicherbereich, sollte alsokeinen Unterschied
machen. Ich bin mir ziemlich sicher dass das Problem in der Funktion
printf0 liegt.

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, ok...

Hätte ich vielleicht gleich posten sollen, also hier:

void
printf0(const char *fmt, ...)
{
  uprintf(putchar0, fmt);
}

und putchar0, damit es vollständig ist:

void
putchar0(char c)
{
  TXBUF0 = c;
  while ((IFG1 & UTXIFG0) == 0);
}

...jetzt bin ich gespannt g

Danke schon mal,
Gruß,
Patrick...

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie soll das denn funktionieren, wenn du dem uprintf die restlichen
Argumente vorenthältst? Du übergibst hier nur den Formatstring und den
Funktionspointer.

Da es in C leider nicht möglich ist variable Agumentlisten an eine
Unterfunktion weiterzugeben, müsstest du aus uprintf eine Funktion
vuprintf(void (*func)(char c), const char *format, va_list ap)
erstellen, analog zu vsprintf, vprintf usw.

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.