Interrupts in Flash > 64k

Gast #3866288
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?
Persönliche Seite #3866793
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.
Gast #3867136
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 :-)

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