stm32单片机移植μc/os时,任务级切换函数和中断级切换函数过程不是一样的吗?

2019-07-14 13:41发布

移植μ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这个程序段???

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
60user115
1楼-- · 2019-07-14 16:03
一个是任务切换,一个是中断嵌套
60user70
2楼-- · 2019-07-14 17:12
回复第 2 楼 于2013-09-29 11:23:47发表:
PendSV 是最低优先级,在你前面的中断发生的时候你已经压栈一遍了。如果你再压栈,那就不对了。所以你只需要做出栈。
任务切换的时候就没有这个问题,PendSV是第一个发生的中断
 
 

那么SysTick中断时硬件都自动保存了哪些寄存器呢???是xpsp,pc,lr??还是cpu的所有的通用寄存器都保存了???要是都保存了,那么进入pendsv中断后前半段的保存r4-r11的程序是略过,而直接进行下面剩余的程序??
freesea123
3楼-- · 2019-07-14 22:21
 精彩回答 2  元偷偷看……
freesea123
4楼-- · 2019-07-14 23:56
SysTick中断是肯定不会去保存R4到R11的
PendSV中断服务程序并不一定每次都去保存R4到R11。
你仔细看一下汇编,里面有OSPendSV_nosave
注意区分两个堆栈

一周热门 更多>