mikrocontroller.net

Forum: Compiler & IDEs Codegrösse?


Autor: Torsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich bin gerad dabei einen Atmega16 zu programmieren (avr-gcc). Leider
hab ich echte Probleme mit den Dateigrössen. Ich habe zuerst stdio
stdlib und string.h eingebunden. Damit wurde das Programm (.hex) 13500
Byte gross ?!

Der Mega hat nun ja 16 Kb. Da ist nicht mehr so viel Platz, also hab
ich die wichtigsten Funktionen (atoi, strcmp, und sscanf) selber
programmiert und die Header rausgeworfen. Der Code ist immer noch fast
genau so gross!

Kann man da Abhilfe schaffen? Oder hab ich nur einen Denkfehler?

Danke
MfG Torsten

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich habe zuerst stdio stdlib und string.h eingebunden. Damit wurde
> das Programm (.hex) 13500 Byte gross ?!

Von den Header-Dateien wird es weder groß noch klein: die enthalten
nur die Deklarationen.  Entscheidend ist, was Du alles linkst.  stdio
ist allerdings schon ein mächtiger Klopper, völlig klar, für einen
ATmega16 kann das je nach Aufgabe aber durchaus benutzbar sein.

> ... also hab ich die wichtigsten Funktionen (atoi, strcmp, und
> sscanf) selber programmiert und die Header rausgeworfen.

Es wäre besser gewesen, stattdessen die Ursache zu analysieren. ;-)

Meine Vermutung ist, daß Du nach wie vor die floating point Variante
von printf() drin hast, aber ohne Deine Linker-Kommandozeile ist das
schwer zu sagen.  Du kannst Dir die Ausgabe-Symboltabelle mal ansehen,
dort siehst Du, welche Funktion auf welche Adresse gelinkt ist.  Mit
Tools wie avr-sizex bekommst Du wohl sogar gesagt, welche Funktion wie
groß ist (disclaimer: habe ich selbst noch nie benutzt).

Im Übrigen bezweifle ich, daß Dein rewrite von strcmp() kleiner
geworden ist als die Bibliotheksfunktion. ;-)  Auch bei scanf() bin
ich dran interessiert zu sehen, ob Du das kleiner bekommen hast als
ich...

Autor: Martin Jansen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry, passt net so ganz zu dem problem:

ich habe nur mal so ne frage, was bewirkt printf() beim avr??
schickt der dann den string übers uart oder wie?

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kurze Antwort: RTFM.

Lange Antwort: Du kannst das völlig frei festlegen, wohin das geht.

Autor: Hans Hildenbrand (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aus der Groesse des *.hex Files kann man nicht direkt auf die
Code-groesse schliessen. Das *.hex Fileformat hat sehr viel Overhead
(Adressen , Zeilenlaengen, Pruefsummen) der nur zur Datenuebetragung
(PC <-> Programmiergerät) benoetigt werden. In den Controller wird nur
die reine Binaerinformation programmiert die wesentlich weniger Platz
beansprucht.
Ich würde einfach mal das File in den Controller programmieren!

Hans

Autor: Torsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hui, ich dachte das Hex File enthält die Daten so wie sie in den mC
kommen?! Naja, wieder was gelernt.

@Jörg: Naja, die nachprogrammierten Sachen, sind nur so gemacht das es
funktioniert.
Es ist natürlich so, das der header nur Referenzen bereitstellt. Da war
ich auf dem Holzweg...

Wo könnte man denn (ausser im Programmer) sehen wie gross die
Binärdaten des Programms sind?

Danke

MfG Torsten

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Wo könnte man denn (ausser im Programmer) sehen wie gross die
Binärdaten des Programms sind?"


Faustregel: hex / 2,8

D.h. in den M16 passen etwa 44kB Hex rein.


Peter

Autor: Torsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kleiner Nachtrag: Wenn ich die hex Datei mit PonyProg öffne, ist die
letzte Adresse irgendwo bei 4000 Bytes !

-> Avr-gcc rulez :-)

MfG Torsten

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

avr.size main.elf

text sollte dann in etwa die benutzte Menge Flash angeben. Allerdings
sind 13k Hex-File immer noch ~4,5k belegtes Flash. Wie Jörg schon
vermutet wirst du irgendwas unnötiges dazulinken. Schieb doch mal deine
Linkerkommandos hier rein.

Matthias

Autor: Martin Jansen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ jörg:
wie lege ich denn fest, wohin die daten gehen?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

RTFM. Das steht in der AVRLibc-Doku.

Matthias

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, 4,5 KB Flash sind für eine Applikation, die scanf() benutzt,
nicht zu schlimm.

Autor: Alex1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo...
man kann die Codegroesse auch direkt sehen (ausgabe).
Das sieht dan ~ so aus:

Size after:
expose.elf  :
section    size      addr
.text      1002         0
.data        12   8388704
.bss         16   8388716
.noinit       0   8388732
.eeprom       0   8454144
.stab      3636         0
.stabstr   2524         0
Total      7190

Die Section .text ist die Codegroesse.

Alex

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die Section .text ist die Codegroesse.

Im Prinzip ja, allerdings mußt Du .data noch mit addieren, da ja die
Initialisierungswerte für den RAM auch erstmal durch den ROM müssen.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

@Jörg

Ich nutze zum Teil das EEPROM um dort irgendwelche Daten oder
Grafiken/Texte) abzulegen (Flash wird knapp). In dem Fall enthält .data
auch diese Daten die aber nicht im Flash landen. Deshalb schrieb ich
oben auch

"text sollte dann in etwa die benutzte Menge Flash angeben"

Wenn man also das EEPROM als Datenspeicher verwendet muß man .data
nicht komplett zu .text dazurechnen.

Matthias

Autor: Torsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
[NEWBIE MODE]
Hmm, das ist eine gute Idee mit dem EEPROM, aber wie bekomme ich die
Daten aus dem Programm in den EEPROM?
[/NEWBIE]

MfG Torsten

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.