个人理解,如有错误,欢迎批评指正。
以Cortex M3为例,栈指针有两个:
- MSP,Main Stack Pointer
- PSP,Process Stack Pointer
两个SP物理地址相同,同一时刻,只能使用其中一种。
- 在裸机开发下,系统启动,首先取出MSP,然后运行。裸机的前后台运行中,始终使用MSP。
- 在RTOS下,每个线程都是while(1)无限循环。系统启动,首先取出MSP,此时是主栈;进入到优先级最高的线程前,切换到该线程的PSP。发生中断,用MSP。再发生线程切换,PSP又指向新线程的栈。
在RTOS下,MSP和PSP在切换使用;并且,每个线程都拥有独立的栈,通过PSP的不停切换达到无缝切换线程的目的。
综上:
- 裸机,Main_Stack单独使用;
- RTOS,Main_Stack + (n * Process_Stack),其中,n是线程的个数。
RTOS的栈 >> 裸机的栈。
PS:希望有一天,论坛支持Tex公式输入。
个人理解,如有错误,欢迎批评指正。
以Cortex M3为例,栈指针有两个:
- MSP,Main Stack Pointer
- PSP,Process Stack Pointer
两个SP物理地址相同,同一时刻,只能使用其中一种。
- 在裸机开发下,系统启动,首先取出MSP,然后运行。裸机的前后台运行中,始终使用MSP。
- 在RTOS下,每个线程都是while(1)无限循环。系统启动,首先取出MSP,此时是主栈;进入到优先级最高的线程前,切换到该线程的PSP。发生中断,用MSP。再发生线程切换,PSP又指向新线程的栈。
在RTOS下,MSP和PSP在切换使用;并且,每个线程都拥有独立的栈,通过PSP的不停切换达到无缝切换线程的目的。
综上:
- 裸机,Main_Stack单独使用;
- RTOS,Main_Stack + (n * Process_Stack),其中,n是线程的个数。
RTOS的栈 >> 裸机的栈。
PS:希望有一天,论坛支持Tex公式输入。
举报