[En-Nut-Discussion] re location truncated to fit: R_ARM_PC24 against symbol solved - so far
Alain M.
alainm at pobox.com
Sat May 17 20:01:08 CEST 2008
Hi Martin,
what modification did you make to the program and linker script? That
can be usefull to many others, specially if one day it makes a way into
the distribution version
Alain
ml escreveu:
> Hi Alain,
>
> it´s not a big deal. I want to run my program in flash and use the flash
> even for data-storage.
> So i place all functions for writing the flash in RAM. That´s the part who
> works now. I can
> link the code and it is copied to ram. Due to the lack of debuging
> possibilty i write a little
> dump which shows me that the routine is really placed in RAM and called from
> the other
> parts in Flash. (Modern debugging via UART)
>
> Unfortunately the call to _FlashEraseComplete doesn´t come back. I can´t see
> the reason why this
> happens. If i remove the flashcode from the function so that only
> NutEnterCritical and NutExitCritical
> is there than it comes back. :( ??
>
> It would be very nice to have a debugger for that, but all i tried doesn´t
> work. Wether in insight or Eclipse.
> Debugging in RAM works well.
>
> Martin
>
>
>
> RAMFUNC int _FlashWaitReady(flashptr_t addr, flashdat_t data, u_long tmo) {
> while(*addr != data) {
> if (--tmo <= 0) {
> return 1;
> } else {
> asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
> asm volatile ("nop");
> asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
> asm volatile ("nop");
> }
> //NutSleep(1); not possible here, because we must stay in ram !!
> }
> return 0;
> }
>
>
> RAMFUNC unsigned long _FlashIdentifier(void) {
> unsigned long id;
> NutEnterCritical();
> id = 0;
> FLASHBASE[0x555] = 0xAA;
> FLASHBASE[0xAAA] = 0x55;
> FLASHBASE[0x555] = 0x90;
> id = FLASHBASE[0];
> id <<= 16;
> id |= FLASHBASE[1];
> FLASHBASE[0x555] = 0xAA;
> FLASHBASE[0xAAA] = 0x55;
> FLASHBASE[0x555] = 0xF0;
> NutExitCritical();
> return(id);
> }
>
>
> RAMFUNC int _FlashEraseComplete(void)
> {
> int r;
> NutEnterCritical();
> FLASHBASE[0x555] = 0xAA;
> FLASHBASE[0xAAA] = 0x55;
> FLASHBASE[0x555] = 0x80;
> FLASHBASE[0x555] = 0xAA;
> FLASHBASE[0xAAA] = 0x55;
> FLASHBASE[0x555] = 0x10;
> r = _FlashWaitReady(FLASHBASE, (flashdat_t)-1,5000000);
> NutExitCritical();
> return(r);
> }
>
> RAMFUNC int _FlashEraseSector(flashptr_t addr)
> {
> int r;
> NutEnterCritical();
> FLASHBASE[0x555] = 0xAA;
> FLASHBASE[0xAAA] = 0x55;
> FLASHBASE[0x555] = 0x80;
> FLASHBASE[0x555] = 0xAA;
> FLASHBASE[0xAAA] = 0x55;
> *addr = 0x30;
> r = _FlashWaitReady(addr,(flashdat_t)-1,300000);
> NutExitCritical();
> return(r);
> }
>
More information about the En-Nut-Discussion
mailing list