Please make reference the MQX RTCS code, where in boot.s, the active stack pointer is set to PSP (set bit 1 of the CONTROL register). Then no need do any manipulation of this bit. Cortex m4 itself automatically switches the active stack pointer to MSP in handler mode and switches back to PSP with exception return.
Here is the stack pointer switch code at <boot.s>
|/* Prepare process stack pointer */|
|mrs r0, MSP|
|msr PSP, r0|
|/* Switch to proccess stack (PSP) */|
|mrs r0, CONTROL|
|orr r0, r0, #2|
|msr CONTROL, r0|
Thank you Carlos, Fang and Mark,
Your suggestions helped a lot. I implemented the code suggested by Carlos and I found that the priority for the PendSV call is set differently for the K64. I used the following:
NVIC_SetPriority(PendSV_IRQn, 0xF); // Set PendSV to lowest possible priority
It works great!
You can study the FreeRTOS file /source/portable/GCC/ARM_MC4F/port.c to get some examples of such context switching.
uTasker developer and supporter (+5'000 hours experience on +60 Kinetis derivatives in +80 product developments)