Wie viel ist 32 kB kompilierter code
Ich bin der Planung bis zur Nutzung einer Arduino-board programmierbar. Diese haben sehr begrenzte flash-Speicher bewegt sich zwischen 16 und 128 kB speichern, kompilierte C-oder C++ - code.
Möglichkeiten gibt es, zu schätzen wie viel (standard -) code darstellen ?
Ich nehme an, dies ist sehr vage, aber ich bin nur auf der Suche nach eine Größenordnung.
- 64 Kb sollten genug für jedermann!
- 16kB steht überall von "ein Zehntel der Größe erforderlich, nur für die automatisch verknüpft runtime" zu "über tausend statements", letzteres unter der Annahme, ein Durchschnitt von 16 bytes für eine kompilierte Anweisung.
- sicher sein, nicht statisch zu allozieren keine großen Puffer.
- Wie viel ist 32 Kb kompilierter code? $10.
- Ich dachte, es war $4096?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Ausgang des
size
Befehl ist ein guter Ausgangspunkt, aber nicht geben Ihnen alle Informationen, die Sie benötigen.Die Größe des Bildes ist in der Regel ein wenig mehr als die Summe von text und Daten-Abschnitten. Die bss-Abschnitt ist im wesentlichen komprimiert, weil es alle 0EN. Möglicherweise gibt es andere Abschnitte, die relevant sind, die nicht nach Größe aufgelistet.
Wenn Ihr build-system eingerichtet ist, wie diejenigen, die ich verwendet habe, bevor Sie für AVR-mikrocontroller dann werden Sie am Ende mit einem *.elf-Datei als auch eine *.bin-Datei, und eventuell ein *.hex-Datei. Die *.bin-Datei ist das eigentliche Bild, das gespeichert werden würde in den Programm-flash des Prozessors, so können Sie prüfen, Ihre Größe zu bestimmen, wie das Programm wächst, wie Sie änderungen, um es. Die *.bin-Datei ist ein Auszug aus der *.elf-Datei mit dem Befehl objdump und einige flags, die ich kann mich nicht erinnern jetzt.
Wenn Sie wissen wollen, wie zu erraten-timate, wie hoch Ihre C-oder C++ - code produzieren, wenn er kompiliert wird, ist dies sehr viel schwieriger. Ich habe beobachtet, 10x blowup in eine Funktion aus, wenn ich versuchte, verwenden Sie einen uint64_t eher als ein uint32_t als alle, die ich Tat, war Inkrementieren (dies wurde etwa 5 mal mehr code, als ich dachte, es wäre). Dies war vor allem zu tun mit gcc-avr Optimierungen nicht die beste, aber kleinere änderungen im code können die Größe schleichen sich aus scheinbar harmlosen code.
Dies wird wahrscheinlich verstärkt mit dem Einsatz von C++, die dazu neigt, sich zu verstecken, mehr Dinge, die wiederum in code als C ist. Chief unter den Dingen, die C++ versteckt sind Destruktor ruft und viele von Zeiger-Dereferenzierung, die zu tun hat mit der
this
Zeiger in Objekten, sowie einen geheimen Zeiger haben viele Objekte auf Ihre virtual-function-table und der Klasse auf statische Variablen.Auf dem AVR alle diese Zeiger Zeug ist wahrscheinlich wirklich addieren, da Zeiger sind doppelt so groß wie Register und nehmen Sie mehrere Anweisungen zu laden. Auch der AVR hat nur ein paar register paarweise verwendet werden kann als Zeiger, die Ergebnisse in der viele Dinge bewegen und aus in die Register.
Einige Tipps für kleine Programme auf dem AVR:
Verwenden
uint8_t
undint8_t
stattint
Wann immer Sie können. Sie können auchuint_fast8_t
undint_fast8_t
wenn Sie möchten, dass Ihr code portabel sein. Dies kann dazu führen, dass viele Operationen nehmen nur halb so viel code, weilint
ist zwei bytes.Sehr bewusst Dinge wie string und struct-Konstanten und Literale und wie/wo Sie gespeichert sind.
Wenn Sie nicht Angst, Lesen Sie die AVR-Montageanleitung. Sie können sich eine Vorstellung von den Arten von Anweisungen, und von der Art der C-code, der problemlos Karten an diese Anweisungen. Verwenden Sie diese Art von C-code.
Kann man nicht wirklich sagen, da. Die Länge der unkompilierte code hat wenig zu tun mit der Länge des kompilierten code. Zum Beispiel:
vs
Sind das beide genau die gleiche Anzahl von Zeilen und die gleiche Ausgabe erzeugen, aber das erste Beispiel beinhaltet eine Instanziierung von std::sort, das ist wahrscheinlich eine Größenordnung mehr code als der rest des Codes hier.
Wenn Sie unbedingt brauchen, um count Anzahl der bytes, die im Programm verwendet, assembler.
Laden Sie die arduino-IDE und 'verifizieren' einige der vorhandenen code, oder schau dir die Beispiel-Skizzen. Es wird Ihnen sagen, wie viele bytes, code, das wird Ihnen eine Idee geben, wie viel mehr Sie können passen in einem Gerät. Kommissionierung ein paar Beispiele nach dem Zufallsprinzip, die web-server Beispiel ist 5816 bytes, und die LCD " hello world ist 2616. Sowohl die Verwendung von externen Bibliotheken.
Versuchen Sie, erstellen Sie eine vereinfachte version Ihrer app, die sich auf die wichtigsten Funktionen zuerst und starten Sie dann das addieren der 'nette (und Coole) Zeug zu haben". Halten Sie ein Auge auf die byte-Verwendung gezeigt, in der Arduino IDE wenn Sie überprüfen, dass Ihr code.
Als einen groben Hinweis, meine erste app (LED-flasher gesteuert durch einen buttun drücken) erfordert 1092 bytes. Das ist in etwa 1K von 32k. Ziemlich kleine Stellfläche für C++ - code!
Was mich am meisten beunruhigt, ist die begrenzte Menge von RAM (1 Kb). Wenn der CPU-stack dauert etwas, dann gibt es nicht viel übrig für die Erstellung von beliebigen Datenstrukturen.
Hatte ich nur meinen Arduino für 48 Stunden, es ist also noch eine Menge, um es effektiv zu nutzen 😉 Aber es macht viel Spaß Sie zu benutzen :).
Es ist schon ein bisschen, für ein halbwegs Komplexes Stück software, aber Sie werden beginnen, stoßen an die Grenze, wenn Sie wollen, dass es eine Menge von verschiedenen Funktionen. Auch, wenn Sie speichern möchten, eine ganze Menge von statischen Zeichenfolgen und Daten, kann es ins Essen, das ganz schnell. Aber 32 KB ist, einen angemessenen Betrag für embedded-Anwendungen. Es neigt dazu, RAM, dass Sie Probleme mit dem ersten!
Auch, ziemlich oft in der C++ - Compiler für eingebettete Systeme sind noch viel schlimmer als der C Compiler.
Das heißt, Sie sind nirgendwo so gut wie C++ Compiler für die gängigen desktop OS ' s (in Bezug auf die Herstellung von effizienten Maschinencode für die Zielplattform).
Auf einem linux-system können Sie einige Experimente mit statisch kompilierten Beispiel-Programme. E. g.
Sind die Größen in bytes. Dieser Ausgang ist unabhängig von der ausführbaren Datei-format, da die Größen der verschiedenen Abschnitte im Datei-format. Der text-Abschnitt enthält den Maschinencode und const stufff. Der Daten-Abschnitt enthält Daten, die für die statische Initialisierung der Variablen. Die bss ist die Größe der initialisierten Daten - natürlich nicht initialisierte Daten müssen nicht gespeichert werden, die in der ausführbaren Datei.)
Gut, busybox enthält eine Menge von Funktionen (wie alle gängigen shell-Kommandos, shell etc.).
Wenn Sie einen link zu eigenen Beispiele mit gcc -static, beachten Sie, dass Ihre verwendete libc können drastisch erhöhen die Größe Programm und, dass die Verwendung eines embedded-libc kann man viel mehr Platz effiziente.
Testen, die Sie heraus überprüfen können die diet-libc oder uclibc und link gegen, die. Eigentlich busybox ist in der Regel verbunden gegen uclibc.
Beachten Sie, dass die Größen, die Sie auf diese Weise geben Sie nur eine Größenordnung. Zum Beispiel, Ihren Arbeitsplatz wahrscheinlich verwendet eine andere CPU-Architektur als das arduino-board und der Computer-code von verschiedenen Architektur unterscheiden können, mehr oder weniger, in Ihrer Größe (weil der Operanden-Größen, verfügbaren Anweisungen, opcode Codierung und so).
Gehen mit grobe Größenordnung Argumentation, busybox enthält etwa 309 Werkzeuge (einschließlich ftp daemon und solche Sachen), d.h. die Durchschnittliche code-Größe von ein busybox-tool ist etwa 5k.
size
Befehl (Schande über mich).which busybox
Drucke auf meinem system eine Datei-Größe von 1841392 bytes.