Forum: Compiler & IDEs Codegröße begrenzen?


von Reimar G. (grasbon)


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.

von Sven P. (Gast)


Lesenswert?

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

von Reimar G. (grasbon)


Lesenswert?

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

von klaus (Gast)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


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.

von Stefan B. (stefan) Benutzerseite


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/article09043/avr-libc-user-manual-1.6.4/FAQ.html#faq_linkerscripts

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

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

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

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

von Sven P. (Gast)


Lesenswert?

Ach oweh, jetzt hab ichs...
Klar, dann am besten das Linkerskript anpassen.

von Reimar G. (grasbon)


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.

von Peter D. (peda)


Lesenswert?

Dem WINAVR ist herzlich egal, was als Flashgröße definiert ist. Er warnt 
auch bei 205,8% Belegung nicht:
1
4.3.3
2
AVR Memory Usage
3
----------------
4
Device: attiny25
5
6
Program:    4214 bytes (205.8% Full)
7
(.text + .data + .bootloader)
8
9
Data:        264 bytes (206.3% Full)
10
(.data + .bss + .noinit)


Peter

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.