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