Forum: Compiler & IDEs Bootloader AVR XMega - RAMPZ Register "falsch"


von Adib (Gast)


Lesenswert?

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.
--

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Adib schrieb:

> Kann mir jemand einen Tipp [...] geben?

Eine Toolchain/Distribution verwenden, in der PR52461 gefixt ist?

http://gcc.gnu.org/PR52461

von Adib (Gast)


Lesenswert?

Danke für den Pointer.

Im Moment mache ich auch ein RAMPZ = 0; ( in Assembler) zu Beginn der 
main().

Danke, Adib.
---

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.