Hallo, ich setzte gerade meinen in C geschriebenen Bootloader Code auf XMega um. Irgendwie klappt das aber nicht so ganz. Der Code wird per Linker Schalter -Ttext=0x20000 auf die korrete Flash position gemappt. Auch die ISR Vectoren sind dort. Der Init Code setzt aber das RAMPZ register aux 0x02. Damit werden alle IO-Zugriffe auf den falschen Addressbereich gemappt. Nach dem Reset ist das RAMPZ Register noch auf 0x00. zB Zugriff auf IO-POrt PORTE.OUT = 0xaa; geht halt nicht auf das IO-Register sondern auf eine Addresse um 0x20000 "daneben". Ich habe mir versucht am Atmel-Applikation-Notes etwas abzuschauen. Die sind aber nicht mit AVR-Staudio Projektfiles sondern mit IAR-Projektfiles. Kann mir jemand einen Tipp oder ein BeispielCode für den Bootloaderbereich geben? Danke, Adib. --
Adib schrieb: > Kann mir jemand einen Tipp [...] geben? Eine Toolchain/Distribution verwenden, in der PR52461 gefixt ist? http://gcc.gnu.org/PR52461
Danke für den Pointer. Im Moment mache ich auch ein RAMPZ = 0; ( in Assembler) zu Beginn der main(). Danke, Adib. ---
Adib schrieb: > Im Moment mache ich auch ein RAMPZ = 0; zu Beginn der main(). Idealerweise geschieht das vor main, etwa so:
1 | #include <avr/io.h> |
2 | |
3 | static __attribute__((section(".init8"),used,unused,naked) |
4 | void fix_PR52461 (void) |
5 | {
|
6 | __asm__ volatile ("out %0, __zero_reg__" |
7 | :: "n" (_SFR_IO_ADDR (RAMPZ))); |
8 | }
|
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.