Forum: Mikrocontroller und Digitale Elektronik LCD library extrem gross


von Florian S. (transistor24)


Lesenswert?

Hi

Ich möchte für mein aktuelles Projekt die Bibliothek zum Ansteuern eines 
HD44780 LC Displays aus dem Tutorial verwenden.
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
Wenn ich mir die beiden lcd-routines Dateien in ein Projekt einfüge und 
das ganze kompiliere (mit Code::Blocks und GCC 4.8.2) und mir die 
Erstellten Dateien anschaue erhalte ich dieses Ergebnis:
1
florian@florian-laptop ~/Programmieren/C/AVR/ATMega8/LCD_Test/bin/Debug $ ls -la
2
insgesamt 216
3
drwxr-xr-x 2 florian florian   4096 Jan 25 18:04 .
4
drwxr-xr-x 3 florian florian   4096 Jan 25 18:00 ..
5
-rw-r--r-- 1 florian florian     13 Jan 25 18:04 LCD_Test.eep
6
-rwxr-xr-x 1 florian florian  25355 Jan 25 18:04 LCD_Test.elf
7
-rw-r--r-- 1 florian florian     30 Jan 25 18:04 LCD_Test.fuse
8
-rw-r--r-- 1 florian florian  12057 Jan 25 18:04 LCD_Test.hex
9
-rw-r--r-- 1 florian florian     42 Jan 25 18:04 LCD_Test.hfs
10
-rw-r--r-- 1 florian florian     42 Jan 25 18:04 LCD_Test.lfs
11
-rw-r--r-- 1 florian florian     13 Jan 25 18:04 LCD_Test.lock
12
-rw-r--r-- 1 florian florian 107448 Jan 25 18:04 LCD_Test.lss
13
-rw-r--r-- 1 florian florian  34025 Jan 25 18:04 LCD_Test.map
14
-rw-r--r-- 1 florian florian     13 Jan 25 18:04 LCD_Test.sig

Die .elf Datei ist extrem gross. Der ATmega8 zum Beispiel hat 8 kB 
Flash. Ist das so das die Datei so gross ist oder stimmt da etwas nicht?

LGF

von spess53 (Gast)


Lesenswert?

Hi

>Die .elf Datei ist extrem gross. Der ATmega8 zum Beispiel hat 8 kB
>Flash. Ist das so das die Datei so gross ist oder stimmt da etwas nicht?

Warum nicht? Das ist eine HEX-Datei. Also etwa 2,5 mal größer als der 
binäre Inhalt. Außerdem enthält sie noch eine Reihe von 
Zusatzinformationen.

MfG Spess

von Florian S. (transistor24)


Lesenswert?

Hi

Danke für deine Antwort!
1
florian@florian-laptop ~/Programmieren/C/AVR/ATMega8/LCD_Test/bin/Debug $ ls -la
2
insgesamt 216
3
drwxr-xr-x 2 florian florian   4096 Jan 25 18:04 .
4
drwxr-xr-x 3 florian florian   4096 Jan 25 18:00 ..
5
-rw-r--r-- 1 florian florian     13 Jan 25 18:04 LCD_Test.eep
6
-rwxr-xr-x 1 florian florian  25355 Jan 25 18:04 LCD_Test.elf
7
-rw-r--r-- 1 florian florian     30 Jan 25 18:04 LCD_Test.fuse
8
-rw-r--r-- 1 florian florian  12057 Jan 25 18:04 LCD_Test.hex
9
-rw-r--r-- 1 florian florian     42 Jan 25 18:04 LCD_Test.hfs
10
-rw-r--r-- 1 florian florian     42 Jan 25 18:04 LCD_Test.lfs
11
-rw-r--r-- 1 florian florian     13 Jan 25 18:04 LCD_Test.lock
12
-rw-r--r-- 1 florian florian 107448 Jan 25 18:04 LCD_Test.lss
13
-rw-r--r-- 1 florian florian  34025 Jan 25 18:04 LCD_Test.map
14
-rw-r--r-- 1 florian florian     13 Jan 25 18:04 LCD_Test.sig

Auch die .hex Datei ist fast doppelt so gross wie der Flash des ATmega8. 
Ist das so möglich? Ich hatte das Gefühl, das es locker reicht.

LGF

: Bearbeitet durch User
von spess53 (Gast)


Lesenswert?

Hi

>Auch die .hex Datei ist fast doppelt so gross wie der Flash des ATmega8.
>Ist das so möglich? Ich hatte das Gefühl, das es locker reicht.

Das sind ASCII-Dateien. Jedes Byte entspricht zwei Zeichen. Außerdem 
enthält die Datei Startzeichen, Adresse, Recordtype und Checksumme.

MfG Spess

von Florian S. (transistor24)


Lesenswert?

Hi

spess53 schrieb:
> Das sind ASCII-Dateien. Jedes Byte entspricht zwei Zeichen. Außerdem
> enthält die Datei Startzeichen, Adresse, Recordtype und Checksumme.

Heisst das es benötigt weniger Speicherplatz auf dem AVR als hier 
angezeigt wird? (Eventuell werden ja einige deiner genannten Inhalte 
entfernt)

LGF

von Sascha W. (sascha-w)


Lesenswert?

Florian Schneeberger schrieb:
> Hi
>
> spess53 schrieb:
>> Das sind ASCII-Dateien. Jedes Byte entspricht zwei Zeichen. Außerdem
>> enthält die Datei Startzeichen, Adresse, Recordtype und Checksumme.
>
> Heisst das es benötigt weniger Speicherplatz auf dem AVR als hier
> angezeigt wird? (Eventuell werden ja einige deiner genannten Inhalte
> entfernt)
genau, die Adresse, Type und Checksumme landet nicht im AVR. Die Größe 
deines Programms wird bei 5-6kB liegen. In den Ausgaben des Compilers 
sollte die Codegröße irgendwo zu lesen sein.

Sascha

von spess53 (Gast)


Lesenswert?

Hi

>Heisst das es benötigt weniger Speicherplatz auf dem AVR als hier
>angezeigt wird?

Ja. Etwa Dateigröße/2,5. Außerdem zeigt dein Compiler die wirkliche 
Dateigröße des Binärfiles an.

>(Eventuell werden ja einige deiner genannten Inhalte entfernt)

Ja.

Such einfach mal nach Intel-Hex.

MfG Spess

von Florian S. (transistor24)


Lesenswert?

Hi

Vielen Dank für die schnellen Antworten!
Ich werde mich nun etwas mit Intel Hex beschäftigen und versuchen das 
geschriebene zu nachvollziehen.

Sascha Weber schrieb:
> In den Ausgaben des Compilers
> sollte die Codegröße irgendwo zu lesen sein.

Leider finde ich nur die Grösse der .elf Datei in diesen Ausgaben.
1
-------------- Build: Debug in LCD_Quarzuhr (compiler: GNU GCC Compiler for AVR)---------------
2
3
avr-gcc -Wall -mmcu=atmega8 -DF_CPU=8000000UL -g -I/usr/include -c fuse.c -o obj/Debug/fuse.o
4
avr-gcc -Wall -mmcu=atmega8 -DF_CPU=8000000UL -g -I/usr/include -c main.c -o obj/Debug/main.o
5
main.c: In function ‘zeit_ausgeben’:
6
main.c:70:5: warning: implicit declaration of function ‘utoa’ [-Wimplicit-function-declaration]
7
     utoa(stunden, buffer, 10); // Stunden Variable in String konvertieren
8
     ^
9
avr-g++ -L/usr/lib -o bin/Debug/LCD_Quarzuhr.elf obj/Debug/fuse.o obj/Debug/lcd-routines.o obj/Debug/main.o  -mmcu=atmega8 -Wl,-Map=bin/Debug/LCD_Quarzuhr.map,--cref  
10
Output file is bin/Debug/LCD_Quarzuhr.elf with size 28.36 KB
11
Running project post-build steps
12
avr-objdump -h -S bin/Debug/LCD_Quarzuhr.elf > bin/Debug/LCD_Quarzuhr.lss
13
avr-objcopy -R .eeprom -R .fuse -R .lock -R .signature -O ihex bin/Debug/LCD_Quarzuhr.elf bin/Debug/LCD_Quarzuhr.hex
14
avr-objcopy --no-change-warnings -j .eeprom --change-section-lma .eeprom=0 -O ihex bin/Debug/LCD_Quarzuhr.elf bin/Debug/LCD_Quarzuhr.eep
15
avr-objcopy --no-change-warnings -j .lock --change-section-lma .lock=0 -O ihex bin/Debug/LCD_Quarzuhr.elf bin/Debug/LCD_Quarzuhr.lock
16
avr-objcopy --no-change-warnings -j .signature --change-section-lma .signature=0 -O ihex bin/Debug/LCD_Quarzuhr.elf bin/Debug/LCD_Quarzuhr.sig
17
avr-objcopy --no-change-warnings -j .fuse --change-section-lma .fuse=0 -O ihex bin/Debug/LCD_Quarzuhr.elf bin/Debug/LCD_Quarzuhr.fuse
18
srec_cat bin/Debug/LCD_Quarzuhr.fuse -Intel -crop 0x00 0x01 -offset  0x00 -O bin/Debug/LCD_Quarzuhr.lfs -Intel 
19
srec_cat bin/Debug/LCD_Quarzuhr.fuse -Intel -crop 0x01 0x02 -offset -0x01 -O bin/Debug/LCD_Quarzuhr.hfs -Intel 
20
Process terminated with status 0 (0 minute(s), 0 second(s))
21
0 error(s), 1 warning(s) (0 minute(s), 0 second(s))
Übersehe ich es?

LGF

: Bearbeitet durch User
von Jojo S. (Gast)


Lesenswert?

mit dem Hilfsprogramm 'avr-size' bekommst du die Codegrösse in Bytes 
angezeigt, aufrufen mit dem .elf als Argument. Kannst du auch in das 
Makefile einbauen.
Aber die Compiler Warning die da angezeigt wird solltest du auch ernst 
nehmen. Die fehlende Deklaration der Funktion 'utoa()' führt 
normalerweise zu üblen Laufzeitfehlern weil der Stack durcheinander 
gerät. Da fehlt vermutlich ein include.

von Florian S. (transistor24)


Lesenswert?

Hi

Danke für deine Antwort!
Ich habe ein paar Informationen zu avr-size eingeholt und habe auch die 
Ausgabe in Prozent hinbekommen.
Die Fehlermeldung bekomme ich nicht weg. Ich habe schon vorher im 
Internet recharchiert und habe die <stdlib.h> und <stdio.h> eingebunden. 
Allerdings hat das nichts gebracht. Weiss vielleicht einer von euch wie 
ich das Problem lösen kann?

LGF

von Karl H. (kbuchegg)


Lesenswert?

utoa sollte eigentlich in der stdlib.h drinnen sein.

stdlib.h ist eine normale Textdatei, die du dir in deinen 
System-Include-Verzeichnissen suchen kannst und mal reinschauen kannst, 
ob die drinnen ist.

Da die Funktion eine Nicht-Standard Funktion ist, sollte sie eigentlich 
_utoa heissen, aber aus historischen Gründen wird das nicht mehr 
geändert.

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