Forum: Compiler & IDEs MSP430 und uprintf...


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


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


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.

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.