Forum: Compiler & IDEs gcc-avr: sprintf_P nutzt keine malloc(), richtig?


von m_bedded (Gast)


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)

von Stefan B. (stefan) Benutzerseite


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.

von m_bedded (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.