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?
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
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 :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.