OpenEdv-开源电子网

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

求助!!ucosii在初始化任务私有栈时,任务栈的R14(LR)应该赋予什么值?

[复制链接]

7

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2018-9-19
在线时间
15 小时
发表于 2019-5-21 21:06:32 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 tc2544 于 2019-5-21 21:11 编辑

战舰V3的ucosii移植,初始化任务栈函数中,为什么要给任务栈的R14(LR)赋值0xFFFFFFFEL???
而探索者F4的ucosii移植,初始化任务栈函数中,为什么要给任务栈的R14(LR)赋值函数OS_TaskReturn ???

战舰V3的初始化任务栈函数: 3.PNG
战舰V3的PendSV中断函数:
asm.PNG

以下是我的错误分析,求纠正:
先创建任务A,运行任务A,再创建任务B,切换到任务B运行 (任务B的优先级高于任务A)
1:运行第一个任务A时,PendSV中断结束后,通过汇编BX LR送合法的LR(位2=1)给PC完成中断返回,使用PSP出栈,硬件自动把第一个任务的R0-R3,R12,LR,PC,xPSR赋值给CPU。其中,任务A的LR取值0xFFFFFFFE(非法值)并赋值给CPU的LR。2:任务A切换到任务B,PendSV中断返回时,通过汇编BX LR送非法的LR(0xFFFFFFFE)给PC,由于LR非法引起INPVC最终产生用法Fault异常





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2019-5-22 02:20:54 | 显示全部楼层
回复

使用道具 举报

7

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2018-9-19
在线时间
15 小时
 楼主| 发表于 2019-5-22 21:35:55 | 显示全部楼层
本帖最后由 tc2544 于 2019-5-26 14:53 编辑

想通了,不知道是不是这样分析的:

Ucos分析:
//提示:R14和LR都是同一寄存器。
//前言部分:
OS启动前的主程序:CPU处于thread模式,使用MSP作为SP。     
中断里面:CPU处于handler模式,使用MSP作为SP。   
OS启动后的主程序:CPU处于thread模式,使用PSP作为SP。     
当中断返回前CPU的 LR值为0xFFFFFFFD,中断返回时把PSP作为栈指针进行中断返回。
Ucosii通过自定义一个数组(全局变量)作为任务栈,PSP等于数组中某个元素的地址。中断返回时,以SP的值作为地址,找到对应的栈数据,进行出栈。

//运行第一个任务:
0.STM32通过运行OSStartHighRdy函数,触发PendSV中断运行第一个任务。
1.进入PendSV中断前,CPU用的是main函数的R14。
2.进入PendSV中断前使用MSP作为栈顶指针SP,CPU的R14被硬件自动修改为0xFFFFFFF9。(CPU从thread模式变为handler模式,参考下图中的表9.4)
3.中断返回前,手动把任务的R4至R11存入到CPU的R4至R11,手动把PSP的值改为任务栈中存放R0的数组元素的地址值,手动修改CPU的LR值为0xFFFFFFFD。
4.中断返回,CPU根据PSP出栈自动弹出任务栈(xPSR、PC 、LR、R12 、R3、R2 、R1、R0)。
5.中断返回后,进入任务函数, PSP等于任务栈底地址的下一个单元(32bit作为1个单元)。(分析:由于出栈时先把栈顶数据抛出,再令PSP等于新的栈顶地址。所以出栈结束后,PSP等于任务栈底地址的下一个单元,这是正常的)
6.结论:通过欺骗CPU运行第一个任务而不是使用MSP出栈来返回中断。

//任务1与任务2之间切换:(任务1切换到任务2,任务2优先级高于任务1)
1.进入PendSV中断前,CPU用的是任务1的R14(LR),
2.进入PendSV中断前使用PSP作为栈顶指针SP,CPU的R14被硬件自动改为0xFFFFFFFD。(参考下图中的表9.4)
3.中断返回前,手动保存任务1的R4-R11,手动把PSP的值改为任务2的私有栈中存放R0的数组元素的地址值,手动修改CPU的LR值为0xFFFFFFFD。
4.中断返回,CPU根据PSP出栈自动弹出任务栈(xPSR、PC 、LR、R12 、R3、R2 、R1、R0),运行任务2。

// 退出PendSV中断前,如果CPU的LR非法导致触发INVPC引起用法fault!!但是上面例子中,每次进入PendSV中断,R14都被硬件自动修改为0xFFFFFFF9或0xFFFFFFFD,再手动修改为0xFFFFFFFD,R14属于合法值,并不会引起用法fault。所以,任务栈的R14的值可以随意设置。
捕获.PNG

回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-25 23:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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