OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8037|回复: 3

关于uc/OS II的移植中MSP和PSP的疑问

[复制链接]

10

主题

45

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2013-4-8
在线时间
1 小时
发表于 2015-8-28 10:33:54 | 显示全部楼层 |阅读模式
5金钱
在uC/OS II开启任务调度函数OSStart()函数中会调用和硬件相关的OSStartHighRdy()函数。OSStartHighRdy()函数代码如下:
[mw_shl_code=c,true]OSStartHighRdy LDR R4, =NVIC_SYSPRI2 ; 设置PENDSV和Systick的优先级为0xFFFF LDR R5, =NVIC_PENDSV_PRI STR R5, [R4] MOV R4, #0 ; set the PSP to 0 for initial context switch call MSR PSP, R4 LDR R4, =OSRunning ; OSRunning = TRUE MOV R5, #1 STRB R5, [R4] ;切换到最高优先级的任务 LDR R4, =NVIC_INT_CTRL ;trigger the PendSV exception (causes context switch) LDR R5, =NVIC_PENDSVSET ;触发PendSV中断从而进行context switch STR R5, [R4] CPSIE I ;enable interrupts at processor level OSStartHang B OSStartHang ;should never get here[/mw_shl_code]
上述代码第6行的地方会将PSP清零,最后触发一个PendSv异常进行来实现任务切换。
对于PendSv异常的实现,大致过程如下:当首次进入PendSv异常之前,内核采用的是MSP自动入栈CPU的寄存器,然后在PendSv异常服务函数中用用户初始化任务堆栈的数据对CPU寄存器进行了context switch(即实现了任务的切换)并且退出时改用了PSP。
那么问题来了:之前用MSP入栈的寄存器值是不是还在栈上,并且永远不会消失了还是说Cortex-M内核会自己把这部分数据处理掉?



最佳答案

查看完整内容[请看2#楼]

MSP和PSP是两个堆栈指针,既然有两个堆栈指针,那么就有两个堆栈,所以MSP入栈的数据是MSP的,PSP入栈的数据是PSP的,相互之间互不影响
每天奋斗一点点,终究会有成功的那一天
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2017-5-4
在线时间
21 小时
发表于 2015-8-28 10:33:55 | 显示全部楼层
MSP和PSP是两个堆栈指针,既然有两个堆栈指针,那么就有两个堆栈,所以MSP入栈的数据是MSP的,PSP入栈的数据是PSP的,相互之间互不影响
回复

使用道具 举报

5

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2015-1-9
在线时间
0 小时
发表于 2015-8-28 15:28:10 | 显示全部楼层
操作系统也是在main函数中对各种os函数不停的调用,返回的一个过程,既然有这么一个过程,必然伴随着压栈和出栈的
回复

使用道具 举报

0

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2015-8-29
在线时间
5 小时
发表于 2015-8-29 16:12:34 | 显示全部楼层
psp和msp实质是同一内存不同地址而已,压进msp的数据肯定还在,操作系统其实是以欺骗内核的手段进行任务切换的。
从不发帖,发帖必申酷。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 00:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表