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.