Ich habe immer nur mit AVRs und MSP430s 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 ist hier eigentlich los?Warum ist die hochgeladene Binärdatei so viel kleiner als die tatsächliche Größe?
Antwort
mein letztes ELF-Binaries ist um 208KB
Ja, weil ELF-Code nicht roh Maschine 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 ungefähr 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.
Die ELF-Binärdatei könnte auch Symbole enthalten. –
@MichaelBurr Ja, das stimmt. –
Ehrfürchtig. Klingt gut für mich, danke! – Andrew
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, zuzüglich des Datensatz-Overheads, also immer etwas mehr als die doppelte Länge der Binärdatei.
Wie bereits gesagt über das HEX-Datei-Format ist ascii-printable, die es einfacher zu übertragen über Comms Links machen (zB einen 7-Bit-Modem/Terminal), sehr ähnlich wie Motorola .s19:
- 1. numpy.frombuffer ValueError: Puffer ist kleiner als die angeforderte Größe
- 2. Die mouseEvent.offsetX Ich erhalte viel größer als die tatsächliche Leinwandgröße
- 3. UIAlertController Textfeldbreite ist viel kleiner als üblich
- 4. Die Array-Größe ist kleiner als die des Datensatzes
- 5. Java HeapDumps zeigen an, dass die verwendete Heap-Größe nach OutOfMemory-Ausnahmen 30% kleiner als die tatsächliche Heap-Definition ist.
- 6. MDF-Dateigröße viel größer als tatsächliche Daten
- 7. Warum ist mein C++ Builder-Programm so viel kleiner als mein Delphi-Programm?
- 8. Installierte apk Größe mehr als die tatsächliche Größe von apk
- 9. Flex-Linking: Warum ist die Größe meiner swf-Datei kleiner als die Summe ihrer swcs?
- 10. Warum ist die Größe des Docker-Betriebssystems so klein?
- 11. Warum ist SQLAlchemy count() viel langsamer als die rohe Abfrage?
- 12. In welchem Fall ist die physische Größe einer Datei kleiner als die logische Größe?
- 13. Warum benötigt die Textdarstellung als Liste so viel Speicher?
- 14. Wieso ist die Methode means() so viel schneller als sum()?
- 15. Warum ist das PNG-Bild in der Größe so viel größer als das Originalbild?
- 16. Warum ist die Größe des .NET Framework 4.0-Installationsprogramms kleiner als 3.0/3.5?
- 17. Warum ist die Anzahl der "abgerechneten" Instanzen so viel größer als die Anzahl der "aktiven" Instanzen?
- 18. Array-Größe kleiner als die Nr. der darin gespeicherten Elemente
- 19. Backup-Repository Größe ist viel größer als Indizes Größe
- 20. Warum ist Integer.MAX_VALUE + 1 kleiner als Integer.MAX_VALUE?
- 21. Warum erhöhen C-Header-Dateien nicht die Größe der Binärdatei?
- 22. Warum ist SVG-Scroll-Leistung so viel schlechter als PNG?
- 23. Warum ist das C# CreateObject so viel ausführlicher als VB.NET?
- 24. Warum ist strcmp so viel schneller als meine Funktion?
- 25. Warum ist Batch-Modus so viel schneller als parfor?
- 26. Warum ist Solr so viel schneller als Postgres?
- 27. Warum ist openssl_pkey_new so viel schneller als gpg?
- 28. Warum ist node.js so viel langsamer als Apache 2.4
- 29. Warum ist plt.imshow so viel schneller als plt.pcolor?
- 30. App Store-Fehler: Die von Ihnen hochgeladene Binärdatei war ungültig
versuchen Sie, eine .bin-Datei zu erstellen ... die auch nicht die richtige Größe hat, aber ein besserer Indikator sein kann. Das .elf-Format hat viel mehr Zeug als nur die Bytes, die geladen werden. Die .hex-Datei hat einige Extras und ist in ASCII, so dass Sie doppelt so viele Bytes direkt aus dem Gate haben und dann das Extra hinzufügen. Diese Dateiformate sind alle in Wikipedia und anderen Orten dokumentiert –
ist es nicht, dass die Binärdatei kleiner als die Datei ist, dass die Dateien größer als die Binärdatei sind. –