www.mikrocontroller.net

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


Autor: m_bedded (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/2...)

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

#include <avr/io.h>
#include <avr/pgmspace.h>
#include <stdio.h>

char PrnBuf[256];
char FMT_TABLEHEADER[] PROGMEM ="*********\r\n";
char FMT_NAMEVALUE  [] PROGMEM =" PARAM1=%d\r\n";
uint8_t value = 42;

int main(void)
{
   // sprintf(&PrnBuf[0], "dummy");
   // sprintf_P(&PrnBuf[0], FMT_TABLEHEADER);
   // sprintf(&PrnBuf[0], "%d", value);
   sprintf_P(&PrnBuf[0], FMT_NAMEVALUE, value); /* name=%d */
   while(1);
}


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.

Autor: m_bedded (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.