Cortex-M3 Stack problem using a bootloader

Posted by ravaz on April 1, 2008
I found a problem on the Cortex-M3 port. In the port.c file the MSP (main stack pointer) is initialized assuiming that the vector table is strored at the adress 0x00000000, using a bootloader this is not hte case. For that reason I modified the code as follow:


Line 160: prvSetMSP( *((unsigned portLONG *) portNVIC_VTABLE ) );

The portNVIC_VTABLE must be defined using:

#define portNVIC_VTABLE 0xE000ED08


Hope can help....

RE: Cortex-M3 Stack problem using a bootloader

Posted by Dave on April 3, 2008
Very good point. Can we add this to the standard download?

RE: Cortex-M3 Stack problem using a bootloade

Posted by ravaz on April 3, 2008
Another correction should be done is the systick timer reload value. To be correct the value should be loaded using:

*(portNVIC_SYSTICK_LOAD) = (configCPU_CLOCK_HZ / configTICK_RATE_HZ)-1;

regards

Ravaz

RE: Cortex-M3 Stack problem using a bootloade

Posted by Richard on April 3, 2008
I like to make sure I make that mistake over and over again :o) It will be right (for this port at least) in the next version.

Regards.

RE: Cortex-M3 Stack problem using a bootloade

Posted by ravaz on April 3, 2008
I would take the chance to thank you for the great job and for the perseverance you have to continously improve it....

RE: Cortex-M3 Stack problem using a bootloade

Posted by ravaz on April 8, 2008
I did the modification for the version 4.8.0 as follow

void vPortStartFirstTask(void)
{
asm volatile(
" ldr r0, =0xE000ED08 \n" /* Load the NVIC_TABLE offset address. */
" ldr r0, [r0] \n" /* Get the vector table offset. */
" ldr r0, [r0] \n" /* Get the stack pointer. */
" msr msp, r0 \n" /* Set the msp back to the start of the stack. */
" svc 0 \n" /* System call to start first task. */
);
}


Regards


Ravaz