Forum: Mikrocontroller und Digitale Elektronik newlib-nano snprintf mit float, welche Resourcen werden benötigt?


von Entwickler (Gast)


Lesenswert?

Hallo,

der Grund für den Beitrag
Beitrag "arm-none-eabi-gcc Linker Skript heap und stack Größe"

ist, dass die Wandlung mit snprintf bei float Zahlen sporadisch
Buchstaben enthält.

LDFLAGS = -specs=nano.specs
LDFLAGS += -u_printf_float -u_scanf_float

Jetzt ist die Frage, braucht snprintf heap (ruft es malloc?)
oder ist stackframe der Funktion groß und kollodiert mit anderen 
Variablen?

Habe schon eine Weile gesucht und man findet ähnliche Berichte
Allerdings ist mein Stack auf 8 aligned.

_estack = 0x2000A000;    /* end of RAM */

Bin etwas ratlos und schon am Überlegen eigene Routine für Wandlung zu 
schreiben.

von Bauform B. (bauformb)


Lesenswert?

Entwickler schrieb:
> oder ist stackframe der Funktion groß und kollodiert mit anderen
> Variablen?

Bevor du ein eigenes printf schreibst, solltest du dir die MPU 
anschauen. Die wurde genau dafür erfunden, um solche Fragen zu 
beantworten. Das Prinzip ist ganz einfach: ein Bereich zwischen Heap und 
Stack wird schreibgeschützt. Sobald dann jemand zu viel Speicher 
braucht, gibt es einen memory management fault und ein paar Register im 
SCB sagen dir genau wo, und wer der Schuldige ist.

Normalerweise legt man für Stack und den Rest vom RAM je eine eigene 
region an in der überhaupt RAM-Zugriffe erlaubt sind. In der Lücke 
dazwischen gibt es dann einen fault, auch beim Lesen. Auf die Art fängt 
man auch Null Pointer auf den Maschinenbefehl genau.

von Stefan F. (Gast)


Lesenswert?

Ich habe gemessen, wie viel Speicher die Funktionen puts() und printf() 
von der newlib-nano ohne Fließkomma-Unterstützung benötigen:
1
Funktion    Heap        Stack      Code STM32L0   Code STM32F1   Code STM32F3
2
puts()      1468 Bytes  16 Bytes   2700 Bytes     2528 Bytes     2532 Bytes
3
printf()    1468 Bytes  16 Bytes   4284 Bytes     3880 Bytes     4020 Bytes

Der Speicherbedarf von printf() ist unabhängig von der Anzahl der 
Argumente und Formatier-Optionen. Wenn weniger als 1468 Bytes Heap zur 
Verfügung stehen, belegt die Library stattdessen nur 436 Bytes und gibt 
dann jedes Zeichen einzeln mit _write() aus. Wenn weniger als 436 Bytes 
Heap zur Verfügung stehen, dann brechen die Funktionen mit einer 
HardFault Exception ab.

Die Float Unterstützung kostet einige Kilobytes zusätzlichen Flash 
Speicher. Wie viel genau hängt ganz stark davon ab, ob und welche 
Fließkomm-Funktionen man sonst noch im Programm verwendet. Die avr libc 
Bilbiotheken sind im Vergleich dazu erheblich kompakter.

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.