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.
Das sehe ich bereits, wenn der Übersetzungsvorgang im AVR-Studio beendet wurde. Aber das ist ja nicht meine Frage. :-)
Lass dir doch einfach per objcopy ein Binärimage erzeugen und prüfe die Dateigröße per Skript?!
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.
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 |
Ach oweh, jetzt hab ichs... Klar, dann am besten das Linkerskript anpassen.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.