mikrocontroller.net

Forum: Compiler & IDEs Codegröße begrenzen?


Autor: R. Grasbon (grasbon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich habe einen ATmega8 mit Bootloader (2K). Übersetzte ich nun ein
Programm ("ganz normal") für den diesen µC, kann es natürlich passieren,
dass es mehr Flash-Speicher benötigen, als noch (abzüglich des 
Bootloaders)
übrig ist (also in meinem Fall 6K (8K - 2K)).

Nun meine Frage: Hat jemand einen Tipp, wie man beim avrgcc
die Größe des entstehenden Codes (Flash) begrenzen kann? Also in
meinem Fall wär's toll, wenn der Compiler (bzw. Linker) einen Fehler
oder eine Warnung rausgibt, wenn die Größe des entstehenden Codes
6K (anstelle der ATmega8-typischen 8K) überschreitet.

Ich habe schon nach einer Option wie ".section-size" gesucht aber
nichts adäquates gefunden.


Grüße,
Reimar

PS: Ich möchte natürlich nicht die controllerspezifischen
Konfigurationsdateien des GCCs ändern. Es sollte schon
"optional" gehen.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau doch einfach mit avr-size nach, wie groß dein Programm geworden 
ist?

Autor: R. Grasbon (grasbon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sehe ich bereits, wenn der Übersetzungsvorgang im AVR-Studio
beendet wurde. Aber das ist ja nicht meine Frage. :-)

Autor: klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lass dir doch einfach per objcopy ein Binärimage erzeugen und prüfe die 
Dateigröße per Skript?!

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Quick & Dirty:

Ein entsprechend großes Objekt im Flash anlegen. Z.B. ein 2K großes 
Array. Vor dem Brennen/Uploaden das Objekt dann rausnehmen. Das 
Rausnehmen kannst du per #define und #if/#endif komfortabel lösen.

Auf diese Weise kannst du im Simulator mit der kleinen Codegröße 
debuggen und bekommst auch die Meldung "Flash voll", wenn dein Restcode 
zu groß wird.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die saubere Lösung dürfte wohl ein angepasstes Linkerskript mit neuem 
Speicherlayout sein.

Für den Atmega8 wird eins der Linkerscripte aus 
/avr/lib/ldscripts/avr4.* benutzt z.B. das avr4.x.
http://www.tuxgraphics.org/common/src2/article0904...

Darin ist u.a. beschrieben, wie groß der text Bereich sein kann.
MEMORY
{
  text   (rx)   : ORIGIN = 0, LENGTH = 8K
  ...

In einer Kopie avr4_6k.x kannst du diese Zeile abändern und z.B. die 
Größe des Bootloaderbereichs abziehen
MEMORY
{
  text   (rx)   : ORIGIN = 0, LENGTH = 6K
  ...

Für das Compilieren und Linken nimmst du dann eine Linkeroption in dein 
Projekt auf, um das neue Linkerskript zu benutzen
-Wl,--script,avr4_6k.x

bzw. im Makefile
LINKER_FLAGS += -Wl,--script,avr4_6k.x

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach oweh, jetzt hab ichs...
Klar, dann am besten das Linkerskript anpassen.

Autor: R. Grasbon (grasbon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Tipps.

Linkerskripte anpassen sind sicher eine Möglichkeit, jedoch auch mit 
entsprechendem Aufwand verbunden.
Ich hatte vielmehr gehofft, dass es doch noch irgenwo eine Linkeroption 
gibt, die ich bisher übersehen hatte.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dem WINAVR ist herzlich egal, was als Flashgröße definiert ist. Er warnt 
auch bei 205,8% Belegung nicht:
4.3.3
AVR Memory Usage
----------------
Device: attiny25

Program:    4214 bytes (205.8% Full)
(.text + .data + .bootloader)

Data:        264 bytes (206.3% Full)
(.data + .bss + .noinit)


Peter

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.