硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2449|回复: 9
收起左侧

版主UCOSIII 教程中任务切换设计(带浮点)的疑问求教

[复制链接]

22

主题

93

回帖

159

积分

初级会员

积分
159
发表于 2017-6-28 14:58:48 | 显示全部楼层 |阅读模式
__asm void PendSV_Handler(void)
{
MRS      R0, PSP        
TST      LR, #0x10      
IT       EQ
VSTMDBEQ R0!, {S16-S31}   
MOV      R2, LR
MRS      R3, CONTROL           
STMDB    R0!,{R2-R11}  
LDR      R1,=__cpp(&curr_task)
LDR      R2,[R1]        
LDR      R3,=__cpp(&ampSP_array)
STR      R0,[R3, R2, LSL #2]   


LDR      R4,=__cpp(&next_task)
LDR      R4,[R4]        
STR      R4,[R1]        
LDR      R0,[R3, R4, LSL #2]   
LDMIA    R0!,{R2-R11}   
MOV      LR, R2
MSR      CONTROL, R3           
TST      LR, #0x10     
IT       EQ
VLDMIAEQ R0!, {S16-S31}   
MSR      PSP, R0      
BX       LR            
ALIGN  4
}
这是任务切换时的入栈和出栈代码,有一个地方不是很明白:就是加载下一个任务堆栈中的数据到相应寄存器中MOV LR , R2和MSR CONTROL ,R3这两句应该是加载LR和CONTROL,那么到BX LR退出PendSV_Handler的时候又自动弹出了xPSR,PC,LR,这样岂不是两次赋值LR了?有点不明白
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106763
QQ
发表于 2017-6-28 15:40:45 | 显示全部楼层
没关系啊,本来就是入栈的时候将LR 和CONTROL寄存器都进行了一次手动入栈。
回复

使用道具 举报

22

主题

93

回帖

159

积分

初级会员

积分
159
 楼主| 发表于 2017-6-28 16:37:58 | 显示全部楼层

回 eric2013 的帖子

eric2013:没关系啊,本来就是入栈的时候将LR 和CONTROL寄存器都进行了一次手动入栈。
(2017-06-28 15:40)
那是不是入栈的时候保存了两个LR,,一个是自动入栈的LR,,,另一个是更新后的LR(即EXC_RETURN的值)?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106763
QQ
发表于 2017-6-28 16:43:41 | 显示全部楼层

回 shibinjie 的帖子

shibinjie:那是不是入栈的时候保存了两个LR,,一个是自动入栈的LR,,,另一个是更新后的LR(即EXC_RETURN的值)? (2017-06-28 16:37) 
对,自动入栈的是一对,我们这里手动入栈是一对,方便判断LR的bit4浮点是否使用,
回复

使用道具 举报

22

主题

93

回帖

159

积分

初级会员

积分
159
 楼主| 发表于 2017-6-28 16:50:15 | 显示全部楼层

回 eric2013 的帖子

eric2013:对,自动入栈的是一对,我们这里手动入栈是一对,方便判断LR的bit4浮点是否使用, (2017-06-28 16:43)
还有个问题,最后8个寄存器自动出栈是用的MSP吧?而入栈的时候自动入栈的8个寄存器用的是PSP,这是不是矛盾了?每次入栈用PSP,出栈用MSP,不相符合啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106763
QQ
发表于 2017-6-28 17:08:03 | 显示全部楼层

回 shibinjie 的帖子

shibinjie:还有个问题,最后8个寄存器自动出栈是用的MSP吧?而入栈的时候自动入栈的8个寄存器用的是PSP,这是不是矛盾了?每次入栈用PSP,出栈用MSP,不相符合啊 (2017-06-28 16:50) 
注意CONTROL寄存器配置,我们这里是用的双堆栈。
回复

使用道具 举报

22

主题

93

回帖

159

积分

初级会员

积分
159
 楼主| 发表于 2017-6-29 08:52:22 | 显示全部楼层

回 eric2013 的帖子

eric2013:注意CONTROL寄存器配置,我们这里是用的双堆栈。 (2017-06-28 17:08)
我知道是双堆栈啊,但还是不太明白。入栈的时候用的是PSP和任务堆栈吧。在PendSV里面一直用的是MSP吧,最后从PendSV函数返回的时候也应该是用的MSP吧,而MSP对应的应该是系统堆栈吧,不知道这样分析对不对?如果对的话,那每次PendSV返回的时候都是用的系统堆栈,那每切换一次任务,MSP就指向了更高的RAM地址了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106763
QQ
发表于 2017-6-29 09:14:10 | 显示全部楼层

回 shibinjie 的帖子

shibinjie:我知道是双堆栈啊,但还是不太明白。入栈的时候用的是PSP和任务堆栈吧。在PendSV里面一直用的是MSP吧,最后从PendSV函数返回的时候也应该是用的MSP吧,而MSP对应的应该是系统堆栈吧,不知道这样分析对不对?如果对的话,那每次PendSV返回的时候都是用的系统堆栈,那每切换一次任 .. (2017-06-29 08:52) 
你调试状观察下MSP的变化,你这个问题就讨论这么多吧,已经帮你好几天了。剩下自己研究下[s:142]
回复

使用道具 举报

22

主题

93

回帖

159

积分

初级会员

积分
159
 楼主| 发表于 2017-6-29 10:06:18 | 显示全部楼层

回 eric2013 的帖子

eric2013:你调试状观察下MSP的变化,你这个问题就讨论这么多吧,已经帮你好几天了。剩下自己研究下[s:142] (2017-06-29 09:14)
[s:151][s:151][s:151]
回复

使用道具 举报

22

主题

93

回帖

159

积分

初级会员

积分
159
 楼主| 发表于 2017-6-29 10:12:36 | 显示全部楼层

回 eric2013 的帖子

eric2013:你调试状观察下MSP的变化,你这个问题就讨论这么多吧,已经帮你好几天了。剩下自己研究下[s:142] (2017-06-29 09:14)
还是谢谢,讨论的太多了[s:140]
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-5 09:35 , Processed in 0.198103 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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