Ich habe bisher nur mit AVRs und MSP430 gearbeitet, aber das gilt für beide. Nach dem Kompilieren und dem statischen Verknüpfen ist meine endgültige ELF-Binärdatei etwa 208kB und die Intel-Hex-Binärdatei ist etwa 41kB. AVRDUDE sagt mir, dass es ungefähr 18kB hochlädt. Was geht hier eigentlich vor?
Meine endgültige ELF-Binärdatei ist etwa 208kB
Ja, weil ELF kein roher Maschinencode ist. Es ist ein universelles ausführbares Format, das Verschiebungsinformationen, dynamische Ladeinformationen, verschiedene Abschnitte für Nur-Lese-Daten, beschreibbare Daten und Code usw. aufweist. Die meisten davon sind auf einem Mikrocontroller irrelevant, da es kein OS, keine dynamischen Ladeeinrichtungen, hat Die meisten zusätzlichen Informationen können entfernt werden.
Die Intel Hex-Binärdatei ist etwa 41kB. AVRDUDE sagt mir, dass es etwa 18kB hochlädt.
Zwei Gründe. Eine, eine Intel-Hex-Datei enthält Prüfsummen am Ende jeder Zeile. Wenn Sie diese mit einer angemessenen durchschnittlichen Zeilenlänge schneiden, können Sie erwarten, dass die Datei um einige Prozente schrumpft, zum Beispiel auf 36kB. Dann gibt es einen Grund, warum Intel Hex-Dateien "Hex" -Dateien heißen. Sie enthalten keine rohen Binärdaten, sondern rohe Binärdaten in hexadezimaler Form - i. e. Ein reelles Byte wird mit zwei Bytes codiert. Wenn AVRdude also den Code hochlädt, konvertiert er ihn in eine rohe Binärdatei (das kann der AVR-Prozessor ausführen), und dann wird die Datengröße erneut um 50% verringert.
Der Objektcode enthält zusätzliche Metadaten, einschließlich der Symboltabelle und Debuggerinformationen. Die meisten dieser Daten können normalerweise durch Compiler und / oder Linker-Option oder durch das strip Dienstprogramm entfernt werden, wenn Sie eine GNU-Toolchain verwenden.
Eine hexadezimale Datei verwendet 2 hexadezimale Zeichen, um ein einzelnes Byte darzustellen, plus den Datensatz-Overhead, der also immer etwas mehr als doppelt so lang ist wie die Binärzahl.