gcc-avr: sprintf_P nutzt keine malloc(), richtig?

Gast #722618
Lesenswert?

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)
Persönliche Seite #722709
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren