Forum: Compiler & IDEs Interrupts in Flash > 64k


von Steff (Gast)


Lesenswert?

Hallo,

Ich benutze eine  Atmega1284p, der in C mit avr-gcc 4.7.2 programmiert 
wird.
Geflasht wird mit avrdude.

Für einen Bootloader Test verschiebe ich die Textsektion in den 
Bootloader-Bereich. Genauer gesagt, an Byteadresse 0x1E000. 
(linkeraufruf: -Ttext,0x1E000)
Die Größe meines Bootloaderbereichs habe ich per Fuse auf 4k Words 
gestellt, das entspricht der Start-Word-Adresse 0xF000. Der linker will 
ja soweit ich weiß die Byteadresse, richtig? Hier sehe ich also kein 
Problem.

Den Reset-Vektor verbiege ich per BOOTRST.
Das klappt soweit, wie ich durch einen Test herausgefunden habe.

Ich verschiebe die Vektortabelle mittels MCUCR. Das Prozedere klappt 
auch, denn wenn ich mir anschließend MCUCR an meinen Leds ausgeben lasse 
erhalte ich das Bitmuster 0x02.

Trotzdem krieg ich keine Interrupts zum Laufen. Programme ohne ISRs, wie 
Led-Blinken mittels delay, klappen wunderbar.
UART mittels ISR klappt nicht, der Interrupt kommt nicht.
Der allergleiche Programmcode funktioniert 100% wenn ich .text nicht 
verschiebe.

Gibt es also noch was zu beachten?
Liegt es daran dass der Controller 128k Speicher hat? Muss dabei 
irgendwas bzgl. Sprungbefehle beachtet werden?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Steff schrieb:
> Gibt es also noch was zu beachten?

Verwendet dein Programm irgendwo LPM?

Schau mal ins Disassembly bzw. ins Mapfile, ob LPM verwendet wird bzw. 
Daten in .progmem* liegen.

Der Compiler geht davon aus, dass .progmem in die unteren 64kiB passt 
und verwendet daher LPM.

Ab 4.9.2 verwendet der Compiler für seine Daten (.progmem.gcc_sw_table*, 
.ctors, .dtors, ...) ELPM falls notwendig.  Siehe auch

http://gcc.gnu.org/PR63223

Für Anwenderdaten ist der Anwender selbst verantwortlich.

Für Daten von der AVR-LibC weiß ich net.

4.9.2 wurde am Donnerstag releast.

: Bearbeitet durch User
von Steff (Gast)


Lesenswert?

Vielen Dank Johann,

In der Tat habe ich eine Konfigurationsstruktur mittels __flash ins 
Flash gelegt.
Die Struktur ist Teil des UART Treibers und der läuft schon seit 
Ewigkeiten und auf verschiedenen Controllern, d.h. da hätte ich als 
letztes gesucht.

Du hast mir den Sonntag gerettet :-)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Wenn Effizienz keine große Rolle spielt können die Daten auch nach 
__memx.

Oder eben __flash1 verwenden.

Das erwartet die Daten in 0x10000..0x1ffff.  Der Compiler legt das nach 
.progmem1.data, aber die Standard-Linkerskripte behandeln diese Sections 
nicht oder es kommt nach .progmem*.

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.