Hallo Freunde, wenn ich die avr-libc-Doku richtig verstehe, nutzen die Funktionen der sprintf-Familie keine malloc(), also ich muss mich um den Heap nicht kümmern. Stimmt es? (ich suche immer noch, warum mein sprintf_P-Aufruf ohne Werte funktioniert und mit Werten Promleme macht - Beitrag "gcc-avr: sprintf_P kracht (mit 3 oder mehr Parameter)" Es ist fast wie hier: http://www.egnite.de/pipermail/en-nut-discussion/2005-March/004156.html)
m_bedded wrote: > Hallo Freunde, > > wenn ich die avr-libc-Doku richtig verstehe, nutzen die Funktionen der > sprintf-Familie keine malloc(), Korrekt. Die Argumente werden letztlich zur Arbeitsfunktion vfprintf durchgereicht. > also ich muss mich um den Heap nicht > kümmern. Stimmt es? Weiss ich bei deinem Vorhaben (uCOS-II auf mega128) nicht. Du musst aber auf jeden Fall schauen, dass du genug Stack hast. vfprintf legt einiges auf dem Stack ab und zwar besonders viel, wenn PRINTF_LEVEL >= PRINTF_FLT gilt. Hast du schon probiert dein Programm mit der Einstellung PRINTF_MIN zu linken, um den Stackverbrauch zu senken? Bekommst du auch Crashes bei Minimalprogrammen wie
1 | #include <avr/io.h> |
2 | #include <avr/pgmspace.h> |
3 | #include <stdio.h> |
4 | |
5 | char PrnBuf[256]; |
6 | char FMT_TABLEHEADER[] PROGMEM ="*********\r\n"; |
7 | char FMT_NAMEVALUE [] PROGMEM =" PARAM1=%d\r\n"; |
8 | uint8_t value = 42; |
9 | |
10 | int main(void) |
11 | {
|
12 | // sprintf(&PrnBuf[0], "dummy");
|
13 | // sprintf_P(&PrnBuf[0], FMT_TABLEHEADER);
|
14 | // sprintf(&PrnBuf[0], "%d", value);
|
15 | sprintf_P(&PrnBuf[0], FMT_NAMEVALUE, value); /* name=%d */ |
16 | while(1); |
17 | }
|
Wieviel Stack hast du im Programm noch übrig? Den Platzbedarf kannst du ausrechnen wie unter WinAVR unter Tipps+Tricks beim Tool avr-size beschrieben. Mit dem Tool avr-nm kannst du auch alle Symbole deines Programms listen und so selbst ermitteln, ob malloc eingebunden wird oder nicht.
Danke für die Antwort, Stefan! Endlich habe ich es. Natürlich waren gcc und sprintf unschuldig. Ich habe OSUnmapTbl des uCOS (os_core.c) ins Flash verschoben (Beitrag "uCOS mit gcc-avr: OSUnmapTbl[] ins Flash"), scheinbar doch unsauber. Mit OSUnmapTbl in RAM funktioniert der Aufruf von sprintf_P() auch mit den Werten.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.