Forum: Compiler & IDEs MSP430 und uprintf...


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von OldBug (Gast)


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...

von Joerg Wunsch (Gast)


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?).

von Andreas S. (andreas) (Admin) Benutzerseite Flattr this


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.

von OldBug (Gast)


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...

von Andreas S. (andreas) (Admin) Benutzerseite Flattr this


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]
  • [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.