We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi, I am using a NXP S32K118 Cortex M0+ processor
I have a scheduler function used to call different tasks ( all is time scheduled ) and i need to do the following:
-> Use the main stack pointer (MSP) for this scheduler function
-> Use the process stack pointer (PSP) for the scheduled tasks
I have 3 stacks defined in ram ( main stack, secondary stack 1, secondary stack 2 ). The idea is that the scheduler uses the main stack, and the scheduled tasks use the secondary stack 1 or secondary stack 2, so i need to switch from MSP to PSP when i´m in the scheduer, before calling the corresponding task, and switch back from PSP to MSP once the corresponding task is completed and im back on the scheduler.
I know how to switch these pointers writing to PSP/MSP/CONTROL registers, but the problem I have is i dont know how to do this context switch/ what i need to do in addition of simply changing stack pointers in order to keep all the stacks working properly, so im here just finding for any help/tips if anyone knows how to implement this properly.
Thank you! :)
Hi,
Since you would like to have a time scheduled function that invokes scheduled tasks, it is recommended to use a combination of setting up your SysTick and PendSV handlers to perform context switching operations.
Though, there are many possible implementations, here is one of the possible suggestion:
- SysTick timer can be used to trigger Systick exception that gets triggered on a regular time interval for time scheduled operations.
- PendSV interrupt can be used to perform context switching between a scheduler function and scheduled tasks. A scheduler function can be part of your PendSV handler that will use Main stack.
- Within the thread mode, depending on how you invoke a task, you could configure CONTROL register to use Secondary stack.
In this way, you could segregate scheduled function to be invoked on a higher priority level via PendSV than your scheduled tasks that execute on thread mode with secondary stack.
Thanks,
Uma