ARM IAR, LPC200 relocation question
I am unable to relocate the demo project from a start location of 0x0 to 0x4000. I move up the intvec and the start of ROM by 0x4000 and sometimes it runs, sometimes it ends up wandering somewhere down around 0x21F0. If I back those changes out and locate at 0x0, it runs fine.
Are there any location dependencies buried in the headers or macros or the IAR setup that would cause this behavior?
Thanks
George
ARM IAR, LPC200 relocation question
To explain further: The jump that takes it out of its own memory space comes at the end of the portRESTORE_CONTEXT macro.
Why does this appear to work sometimes?
George
ARM IAR, LPC200 relocation question
The ARM7 will expect the interrupt vector table to be at zero. Are you remapping it somehow?
ARM IAR, LPC200 relocation question
The IAR has a .ICF file that tells the linker where the intvec table is to be put, remapping it. In this case it is in front of my rom region, 0x4000. The IDE will start the debug from there or in the normal target a bootloader running from 0x00 will jump to 0x4000 when its ready to start. I don’t believe this is the problem area.
The last step of the portRESTORE_CONTEXT :
; And return – correcting the offset in the LR to obtain the
; correct address.
SUBS PC, LR, #4
is where it disappears. And it doesn’t happen everytime which makes it spooky.
Thanks
George
ARM IAR, LPC200 relocation question
…but the CPU will still use address 0 for the vector table, won’t it? Unless there is something else mapped to address zero (this is how its done in SAM7, you have a copy of the vector table elsewhere then map the elsewhere address to address zero because the CPU allays looks at address zero. I forget how the LPC does it).
If its the first call to portRESTORE_CONTEXT() then most likely the CPU is in the wrong mode. You must have the CPU in Supervisor mode when vTaskStartScheduler() is called. Step through the macro to see what it tries to do and what mode its in.
Regards.
ARM IAR, LPC200 relocation question
Just had a quick look at the LPC2368 manual – are you setting the MEMMAP register to tell the CPU where the vector table is?
Regards.
ARM IAR, LPC200 relocation question
MEMMAP is not being used. This if the first call of the portRESTORE_CONTEXT(). And right at the end, when it is executing the SUBS PC, LR, #4 statement the mode is Supervisor (0x13).
The debugger doesn’t single step at this point so I have to hit pause to see where we land: Its in the lower rom region and the mode is ABT….
Spurious interrupt maybe?
The only mods to the Demo code:
– processor is LPC2148. The appropriate changes have been made in the IDE, 2 tweaks of the code.
– I’ve added code to get to my LED’s which requires I2C activated. But at the point of this fault none of this is even initialized, let alone run.
George
ARM IAR, LPC200 relocation question
Of course MEMMAP needs to be used if the code is being relocated! Doh.
So I reserved the space and added the code:
memcpy((void*)0x40000000, (void*)(0x00004000), 0x60);
MEMMAP= 0x02; // look for interrupts in ram
Still no joy. The code spends all of its time in the Prefetch_handler. I hooked up counters in all the un-used interrupts. eg:
__irq __arm void Prefetch_Handler(void)
{ Prefetch_cnt++; }
After a few seconds the Prefetch interrupt has been hit 9 million times. And the Data_Handler also 200 times.
George
ARM IAR, LPC200 relocation question
break through!! ( At least it works now)
If you are going to relocate the intvec, then the intvec needs to be relocatable.
in cstart.s:
ldr pc,[pc,#+24] ;; Reset
ldr pc,[pc,#+24] ;; Undefined instructions
; b vPortYieldProcessor <<<<<<<<<<<<<< don’t do this, its won’t relocate
or the b will not have the range when it
is placed in RAM
ldr pc,[pc,#+24] ;; Software interrupt (SWI/SVC) <<<<<<<<<<< count on the indirection
ldr pc,[pc,#+24] ;; Prefetch abort
ldr pc,[pc,#+24] ;; Data abort
__vector_0x14
DC32 0 ;; RESERVED
ldr pc, [PC, #-0xFF0] ;; IRQ
ldr pc,[pc,#+24] ;; FIQ
DC32 __iar_program_start ;; Reset
DC32 undef_handler ;; Undefined instructions
DC32 swi_handler ;; Software interrupt (SWI/SVC) <<<<<<<<<<<,, to here
DC32 prefetch_handler ;; Prefetch abort
DC32 data_handler ;; Data abort
DC32 0 ;; RESERVED
DC32 0 ;; IRQ
DC32 fiq_handler ;; FIQ
swi_handler
b vPortYieldProcessor <<<<<<<<<<<<<<<,, and to here
undef_handler
b Undef_Handler
prefetch_handler
b Prefetch_Handler
data_handler
b Data_Handler
fiq_handler
b fiq_handler
Thanks for your patience
George
ps if this still is wrong, warn me!