hex-File Größe bei Windows größer als bei Linux?

OP #4639426
Lesenswert?
• ▲
▼
Hallo,

da ich die Hardware für das Projekt noch nicht gebaut habe wollte ich 
fragen, ob mir jemand sagen kann, ob es normal ist, dass identischer 
C-Sourcecode bei Windows (AVR Studio 4) ein hex-file mit 32.663 Bytes 
erzeugt, während dies unter Linux lediglich 21.949 Bytes werden?

Der Output von make unter Linux zeigt lediglich eine warnung:

make
avr-gcc  -mmcu=atmega168 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char 
-funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT clock.o -MF 
dep/clock.o.d  -c  ../clock.c
avr-gcc  -mmcu=atmega168 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char 
-funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT 
Heliostep_15.o -MF dep/Heliostep_15.o.d  -c  ../Heliostep_15.c
avr-gcc  -mmcu=atmega168 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char 
-funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT 
lcd-routines.o -MF dep/lcd-routines.o.d  -c  ../lcd-routines.c
avr-gcc -mmcu=atmega168 -Wl,-Map=Heliostep_15.map clock.o Heliostep_15.o 
lcd-routines.o     -o Heliostep_15.elf
/usr/bin/avr-ld: warning: -z relro ignored.
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature 
Heliostep_15.elf Heliostep_15.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" 
--change-section-lma .eeprom=0 --no-change-warnings -O ihex 
Heliostep_15.elf Heliostep_15.eep || exit 0
avr-objdump -h -S Heliostep_15.elf > Heliostep_15.lss

AVR Memory Usage
----------------
Device: atmega168

Program:    7820 bytes (47.7% Full)
(.text + .data + .bootloader)

Data:        111 bytes (10.8% Full)
(.data + .bss + .noinit)



Das hex-file wird ja erzeugt, so dass ich denke, dass alles i. O. ist. 
Oder trügt der Schein? Was kann man machen, um das festzustellen ohne 
die Hardware zu bemühen?

Danke für Eure Tips.

Gruß Michael
Gast #4639475
Lesenswert?
• ▲
▼
Alleine die Compiler Option -Os kann schon solche Unterschiede
bewirken. Ansonsten kann man bei HEX Dateien nicht unbedingt
anhand ihrer Größe sagen dass der erzeugte Code größer oder
kleiner ist. Es gibt da Möglichkeiten unbenutzte Zellen
nicht in die HEX Datei zu übernehmen. Da müsste man entweder
einen HEX zu BIN Konverter bemühen oder den Inhalt der
HEX Dateien selber mal analysieren wenn man es kann.
OP #4639511
Lesenswert?
• ▲
▼
Hallo und danke für die zahlreichen Anregungen.

Die avr-gcc Version unter Linux ist 4.8.3-1.1

Bei Windows weiß ich nicht, wie ich die herausbekommen kann. In dem 
Verzeichnis, in dem sich avr-gcc.exe befindet (erstellt am 19.01.2010) 
befindet sich auch avr-gcc4.3.3.exe. Vielleicht hilft das.

Und hier noch der Output unter Windows:


rm -rf clock.o Heliostep_15.o lcd-routines.o  Heliostep_15.elf dep/* 
Heliostep_15.hex Heliostep_15.eep Heliostep_15.lss Heliostep_15.map
Build succeeded with 0 Warnings...
avr-gcc  -mmcu=atmega168 -Wall -gdwarf-2 -std=gnu99   -DF_CPU=8000000UL 
-Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD 
-MP -MT clock.o -MF dep/clock.o.d  -c  ../clock.c
avr-gcc  -mmcu=atmega168 -Wall -gdwarf-2 -std=gnu99   -DF_CPU=8000000UL 
-Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD 
-MP -MT Heliostep_15.o -MF dep/Heliostep_15.o.d  -c  ../Heliostep_15.c
In file included from ../Heliostep_15.c:78:
../lcd-routines.h:54:1: warning: "F_CPU" redefined
<command-line>: warning: this is the location of the previous definition
avr-gcc  -mmcu=atmega168 -Wall -gdwarf-2 -std=gnu99   -DF_CPU=8000000UL 
-Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD 
-MP -MT lcd-routines.o -MF dep/lcd-routines.o.d  -c  ../lcd-routines.c
In file included from ../lcd-routines.c:16:
../lcd-routines.h:54:1: warning: "F_CPU" redefined
<command-line>: warning: this is the location of the previous definition
avr-gcc -mmcu=atmega168 -Wl,-Map=Heliostep_15.map clock.o Heliostep_15.o 
lcd-routines.o     -o Heliostep_15.elf
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature 
Heliostep_15.elf Heliostep_15.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" 
--change-section-lma .eeprom=0 --no-change-warnings -O ihex 
Heliostep_15.elf Heliostep_15.eep || exit 0
avr-objdump -h -S Heliostep_15.elf > Heliostep_15.lss
Build succeeded with 4 Warnings...


Prinzipiell höre ich aber raus, dass es Differenzen geben kann.

Michael
#4639533
Lesenswert?
• ▲
▼
Michael P. schrieb:
> Hallo,
>
> da ich die Hardware für das Projekt noch nicht gebaut habe wollte ich
> fragen, ob mir jemand sagen kann, ob es normal ist, dass identischer
> C-Sourcecode bei Windows (AVR Studio 4) ein hex-file mit 32.663 Bytes
> erzeugt, während dies unter Linux lediglich 21.949 Bytes werden?

Liegt das möglicherweise an den Zeilenumbrüchen? UNIX und Linux benutzen 
da nur ein Linefeed ("\n"), während Windows die Kombination aus 
Carriage-Return und Linefeed ("\r\n") verwendet.
OP #4639536
Lesenswert?
• ▲
▼
Bin kein Windows-Mensch daher funktionierte gcc --version in CMD erstmal 
nicht. Gut, hab's noch hinbekommen:

C:\Users\mp>avr-gcc --version
avr-gcc (WinAVR 20100110) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is 
NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR 
PURPOSE.

Also tatsächlich 4.3.3

Ich gehe davon aus, dass die Lösung damit klar ist. Danke für die Infos.

Michael
Persönliche Seite #4639757
Lesenswert?
• ▲
▼
Sheeva P. schrieb:
> Liegt das möglicherweise an den Zeilenumbrüchen?

Läge es an den Zeilenumbrüchen, würde pro Zeile im Hex-File ein Byte 
dazukommen. Damit hätte die Datei bei 11 kByte Zuwachs also 11000 
Zeilen.

Das wiederum würde bedeuten, daß nur ein Nutzbyte pro Zeile vorhanden 
sein kann (die kleinere Datei ist ja nur ca 21 kByte groß).

Manchmal hilft so eine simple Betrachtung, um herauszufinden, ob etwas 
wahrscheinlich ist ...
#4640705
Lesenswert?
• ▲
▼
Beim intel hex Format ist die Länge der Datenzeilen nicht festgelegt, 
sondern flexibel. Und wenn bei Windows-GCC z.B. 8 Byte pro Zeile 
übertragen werden, dann erzeugt das mehr Overhead, als wenn 16 Bytes in 
einer Zeile stehen.

Könnnnnnnte auch eine Möglichkeit sein. Die Länge eines HEX-Files sagt 
nichts über die Länge des Inhalts aus.


Michael P. schrieb:
> Program:    7820 bytes (47.7% Full)

Was sagt denn der Windows-Compiler?



Gruß

Jobst

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren