Codegröße begrenzen?

OP #2032029
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.
Persönliche Seite #2032321
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.
Persönliche Seite #2032495
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
#2033484
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

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