你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32单片机移植μc/os时,任务级切换函数和中断级切换函数的困惑

[复制链接]
天空之城123 提问时间:2013-9-29 10:23 /
移植μc/os时,任务级切换函数即OSCtrSw,中断级任务切换函数为OSIntCtrSw,两者的功能都是设置PendSV中断,从而在PendSV中断服务程序中真正实现任务的切换。而PendSV中断服务程序的过程就是先保存CPU的R4-R11寄存器,之后再出栈即将运行的任务的R4-R11,从而实现任务切换。那么这两个任务切换函数过程不是一样的???为什么书上说OSIntCtrSw()由于之前已经发生过中断,故CPU的寄存器已经保存入栈,只需要出栈即将运行任务的R4-R11即可??OSIntCtrSw和OSCtrSw进入的是同一个PendSV中断服务函数,为什么OSCtrSw时进入PendSV服务程序得先保存R4-R11,而OSIntCtrSw可以省略这一步?因为他们进入的是同一个PendSV服务程序,那么它们俩按照程序的一条一条执行不都是先应该保存R4-R11吗??难道是当OSIntCtrSw时,执行PendSV服务程序会可以跳过保存R4-R11这个步骤,而只执行出栈即将运行任务的R4-R11这个程序段???

 
收藏 评论11 发布时间:2013-9-29 10:23

举报

11个回答
dzc2001 回答时间:2013-9-29 11:23:47

RE:stm32单片机移植μc/os时,任务级切换函数和中断级切换函数的困惑

PendSV 是最低优先级,在你前面的中断发生的时候你已经压栈一遍了。如果你再压栈,那就不对了。所以你只需要做出栈。
任务切换的时候就没有这个问题,PendSV是第一个发生的中断
 
Hiker天下 回答时间:2013-9-29 15:27:55

RE:stm32单片机移植μc/os时,任务级切换函数和中断级切换函数的困惑

一个是任务切换,一个是中断嵌套
蜗牛-2032493 回答时间:2013-9-29 20:24:22

回复:stm32单片机移植μc/os时,任务级切换函数和中断级切换函数的困惑

顶顶顶顶顶顶,我和楼主的困惑一样,好几天了,找不着正确详细的答案
蜗牛-2032493 回答时间:2013-9-29 20:29:47

回复:stm32单片机移植μc/os时,任务级切换函数和中断级切换函数的困惑

回复第 2 楼 于2013-09-29 11:23:47发表:
PendSV 是最低优先级,在你前面的中断发生的时候你已经压栈一遍了。如果你再压栈,那就不对了。所以你只需要做出栈。
任务切换的时候就没有这个问题,PendSV是第一个发生的中断
 
 

那么SysTick中断时硬件都自动保存了哪些寄存器呢???是xpsp,pc,lr??还是cpu的所有的通用寄存器都保存了???要是都保存了,那么进入pendsv中断后前半段的保存r4-r11的程序是略过,而直接进行下面剩余的程序??
蜗牛-2032493 回答时间:2013-9-29 20:30:24

回复:stm32单片机移植μc/os时,任务级切换函数和中断级切换函数的困惑

回复第 2 楼 于2013-09-29 11:23:47发表:
PendSV 是最低优先级,在你前面的中断发生的时候你已经压栈一遍了。如果你再压栈,那就不对了。所以你只需要做出栈。
任务切换的时候就没有这个问题,PendSV是第一个发生的中断
 
 

那么SysTick中断时硬件都自动保存了哪些寄存器呢???是xpsp,pc,lr??还是cpu的所有的通用寄存器都保存了???要是都保存了,那么进入pendsv中断后前半段的保存r4-r11的程序是略过,而直接进行下面剩余的程序??
dzc2001 回答时间:2013-9-29 21:08:44

回复:stm32单片机移植μc/os时,任务级切换函数和中断级切换函数的困惑

回复第 6 楼 于2013-09-29 20:30:24发表:
回复第 2 楼 于2013-09-29 11:23:47发表:
PendSV 是最低优先级,在你前面的中断发生的时候你已经压栈一遍了。如果你再压栈,那就不对了。所以你只需要做出栈。
任务切换的时候就没有这个问题,PendSV是第一个发生的中断
 
 

那么SysTick中断时硬件都自动保存了哪些寄存器呢???是xpsp,pc,lr??还是cpu的所有的通用寄存器都保存了???要是都保存了,那么进入pendsv中断后前半段的保存r4-r11的程序是略过,而直接进行下面剩余的程序??
 
 
处理器只保存那几个特殊的和R0到R3。R0到R3是为了传参,这就是为啥你要在任务调度的时候自己实现R4到后面的,除非你能保证整个系统的函数传参都不大于这个范围,那你就可以不做这部分保存r4和后面的。
事实上咱们写程序也不会添加很多参数,一般都是包成结构体,传个地址啥的,还能保证函数的可重入。
建议你看看那本 , 里面这部分讲的很详细,尤其是关于PendSV,有专门的一章
 
蜗牛-2032493 回答时间:2013-9-29 21:18:42

回复:stm32单片机移植μc/os时,任务级切换函数和中断级切换函数的困惑

回复第 7 楼 于2013-09-29 21:08:44发表:
回复第 6 楼 于2013-09-29 20:30:24发表:
回复第 2 楼 于2013-09-29 11:23:47发表:
PendSV 是最低优先级,在你前面的中断发生的时候你已经压栈一遍了。如果你再压栈,那就不对了。所以你只需要做出栈。
任务切换的时候就没有这个问题,PendSV是第一个发生的中断
 
 

那么SysTick中断时硬件都自动保存了哪些寄存器呢???是xpsp,pc,lr??还是cpu的所有的通用寄存器都保存了???要是都保存了,那么进入pendsv中断后前半段的保存r4-r11的程序是略过,而直接进行下面剩余的程序??
 
 
处理器只保存那几个特殊的和R0到R3。R0到R3是为了传参,这就是为啥你要在任务调度的时候自己实现R4到后面的,除非你能保证整个系统的函数传参都不大于这个范围,那你就可以不做这部分保存r4和后面的。
事实上咱们写程序也不会添加很多参数,一般都是包成结构体,传个地址啥的,还能保证函数的可重入。
建议你看看那本 , 里面这部分讲的很详细,尤其是关于PendSV,有专门的一章
 

 

中断时硬件只是保存了xpsr,pc,lr,r12,r0-r3,那么中断级别任务切换时,调用OSIntCtrSw进入PendSV中断服务程序时不也得进行r4-r11的保存??可是为什么书上说OSIntCtrSw()由于之前已经发生过中断,故CPU的寄存器已经保存入栈,只需要出栈即将运行任务的R4-R11即可??
dzc2001 回答时间:2013-9-30 01:14:17

回复:stm32单片机移植μc/os时,任务级切换函数和中断级切换函数的困惑

回复第 8 楼 于2013-09-29 21:18:42发表:
回复第 7 楼 于2013-09-29 21:08:44发表:
回复第 6 楼 于2013-09-29 20:30:24发表:
回复第 2 楼 于2013-09-29 11:23:47发表:
PendSV 是最低优先级,在你前面的中断发生的时候你已经压栈一遍了。如果你再压栈,那就不对了。所以你只需要做出栈。
任务切换的时候就没有这个问题,PendSV是第一个发生的中断
 
 

那么SysTick中断时硬件都自动保存了哪些寄存器呢???是xpsp,pc,lr??还是cpu的所有的通用寄存器都保存了???要是都保存了,那么进入pendsv中断后前半段的保存r4-r11的程序是略过,而直接进行下面剩余的程序??
 
 
处理器只保存那几个特殊的和R0到R3。R0到R3是为了传参,这就是为啥你要在任务调度的时候自己实现R4到后面的,除非你能保证整个系统的函数传参都不大于这个范围,那你就可以不做这部分保存r4和后面的。
事实上咱们写程序也不会添加很多参数,一般都是包成结构体,传个地址啥的,还能保证函数的可重入。
建议你看看那本 , 里面这部分讲的很详细,尤其是关于PendSV,有专门的一章
 

 

中断时硬件只是保存了xpsr,pc,lr,r12,r0-r3,那么中断级别任务切换时,调用OSIntCtrSw进入PendSV中断服务程序时不也得进行r4-r11的保存??可是为什么书上说OSIntCtrSw()由于之前已经发生过中断,故CPU的寄存器已经保存入栈,只需要出栈即将运行任务的R4-R11即可??
 
大哥,R4和后面的寄存器都没变过,当然直接用了
 
蜗牛-2032493 回答时间:2013-9-30 08:26:44

回复:stm32单片机移植μc/os时,任务级切换函数和中断级切换函数的困惑

回复第 9 楼 于2013-09-30 01:14:17发表:
回复第 8 楼 于2013-09-29 21:18:42发表:
回复第 7 楼 于2013-09-29 21:08:44发表:
回复第 6 楼 于2013-09-29 20:30:24发表:
回复第 2 楼 于2013-09-29 11:23:47发表:
PendSV 是最低优先级,在你前面的中断发生的时候你已经压栈一遍了。如果你再压栈,那就不对了。所以你只需要做出栈。
任务切换的时候就没有这个问题,PendSV是第一个发生的中断
 
 

那么SysTick中断时硬件都自动保存了哪些寄存器呢???是xpsp,pc,lr??还是cpu的所有的通用寄存器都保存了???要是都保存了,那么进入pendsv中断后前半段的保存r4-r11的程序是略过,而直接进行下面剩余的程序??
 
 
处理器只保存那几个特殊的和R0到R3。R0到R3是为了传参,这就是为啥你要在任务调度的时候自己实现R4到后面的,除非你能保证整个系统的函数传参都不大于这个范围,那你就可以不做这部分保存r4和后面的。
事实上咱们写程序也不会添加很多参数,一般都是包成结构体,传个地址啥的,还能保证函数的可重入。
建议你看看那本 , 里面这部分讲的很详细,尤其是关于PendSV,有专门的一章
 

 

中断时硬件只是保存了xpsr,pc,lr,r12,r0-r3,那么中断级别任务切换时,调用OSIntCtrSw进入PendSV中断服务程序时不也得进行r4-r11的保存??可是为什么书上说OSIntCtrSw()由于之前已经发生过中断,故CPU的寄存器已经保存入栈,只需要出栈即将运行任务的R4-R11即可??
 
大哥,R4和后面的寄存器都没变过,当然直接用了
 

 
我问的是OSIntCtrSw既然进入了PendSV中断服务程序,而中断服务程序前半段程序就是保存R4-R11的,那么OSIntCtrSw不也得保存R4-R11,不管SysTick中断时保存没有保存过,除非进入PendSV中断服务程序后跳过了保存了R4-R11那几句而直接了后面了出栈R4-R11的程序
dzc2001 回答时间:2013-9-30 10:18:20

RE:stm32单片机移植μc/os时,任务级切换函数和中断级切换函数的困惑

SysTick中断是肯定不会去保存R4到R11的
PendSV中断服务程序并不一定每次都去保存R4到R11。
你仔细看一下汇编,里面有OSPendSV_nosave
注意区分两个堆栈
蜗牛-2032493 回答时间:2013-9-30 11:48:04

回复:stm32单片机移植μc/os时,任务级切换函数和中断级切换函数的困惑

回复第 11 楼 于2013-09-30 10:18:20发表:
SysTick中断是肯定不会去保存R4到R11的
PendSV中断服务程序并不一定每次都去保存R4到R11。
你仔细看一下汇编,里面有OSPendSV_nosave
注意区分两个堆栈
 

邵贝贝老师里面有句话说“进入中断后,应该调用中断切换函数OSIntCtxSw,而不应调用任务切换函数OS_TASK_SW,因为中断服务子程序已经将CPU寄存器存入到了中断了的任务的堆栈中,而无需再做第二次”
那么,“已经将CPU寄存器存入到了....”里面的CPU寄存器指的是XPSR,LR,PC,这些寄存机器??还是指所有的CPU寄存器包括R4-R11??“无需再做第二次”的第二次指的是哪个过程??
我实在是弄不明白了,望帮忙解惑....

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版