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

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的程序
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版