I am porting FreeRTOS with TrustZone on LPC5500, I put FreeRTOS in secure memory, and created several user tasks in non-secure memory, as shown below:
But so far, I have not successfully switched from a secure task to a non-secure task.
How to switch from a secure task to a non-secure task?
Hi Joseph
The example you provided is very good, I can return to a non-secure task from the PendSV interrupt now. But when I call a secure function (entry function) in the non-secure task, the program will jump to the secure memory. At this time, the PSP stack pointer is used. The use of the PSP will destroy the scene of the secure task. After several task switches have been performed, the program will appear hardfault. I think this is due to the use of both PSP and PSP_NS. Can you give me some advice?
Thank you very much.
Yang Zhang
Non-secure tasks also need Secure stack allocation if you want to allow them to call Secure APIs. So when the Non-secure task is created, a Secure stack space (possibly based on the maximum stack usage of a Secure API).
When doing context switch, you need need to switch both PSP_NS and PSP_S (and their stack limit registers).
Do you know any way to set the PSP in a non-secure task?
Non-secure software cannot set Secure PSP. Given that in your arrangement your RTOS is in Secure side, when you create the task you can allocate the Secure stack for it at the same time.
The context switching code (in Secure privileged side) can set the PSP_S.
I understand what you said, I wiil try it.
Thanks a lot.
Regarding stack frame, sorry for not clear. I meant the stack frame you created in Non-secure stack for the exception return to take place. What is in that stack frame?
Sorry for delay. I must have missed the notification email (too many emails).
A task (assume Non-secure unprivileged) can update SP (R13), and if the current selected SP is PSP, then it is updating PSP_NS.
But normally in an RTOS environment, the initial value of PSP_NS is initialized by the OS (not by the task itself) before the Non-secure task starts.
regards,
Joseph