Cortex-M3 Stack problem using a bootloader

ravaz wrote on Tuesday, April 01, 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…

davedoors wrote on Thursday, April 03, 2008:

Very good point. Can we add this to the standard download?

ravaz wrote on Thursday, April 03, 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

rtel wrote on Thursday, April 03, 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.

ravaz wrote on Thursday, April 03, 2008:

I would take the chance to thank you for the great job and for the perseverance you have to continously improve it…

ravaz wrote on Tuesday, April 08, 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