移植μ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这个程序段??? |
RE:stm32单片机移植μc/os时,任务级切换函数和中断级切换函数的困惑
任务切换的时候就没有这个问题,PendSV是第一个发生的中断
RE:stm32单片机移植μc/os时,任务级切换函数和中断级切换函数的困惑
回复:stm32单片机移植μc/os时,任务级切换函数和中断级切换函数的困惑
回复:stm32单片机移植μc/os时,任务级切换函数和中断级切换函数的困惑
PendSV 是最低优先级,在你前面的中断发生的时候你已经压栈一遍了。如果你再压栈,那就不对了。所以你只需要做出栈。
任务切换的时候就没有这个问题,PendSV是第一个发生的中断
那么SysTick中断时硬件都自动保存了哪些寄存器呢???是xpsp,pc,lr??还是cpu的所有的通用寄存器都保存了???要是都保存了,那么进入pendsv中断后前半段的保存r4-r11的程序是略过,而直接进行下面剩余的程序??
回复:stm32单片机移植μc/os时,任务级切换函数和中断级切换函数的困惑
PendSV 是最低优先级,在你前面的中断发生的时候你已经压栈一遍了。如果你再压栈,那就不对了。所以你只需要做出栈。
任务切换的时候就没有这个问题,PendSV是第一个发生的中断
那么SysTick中断时硬件都自动保存了哪些寄存器呢???是xpsp,pc,lr??还是cpu的所有的通用寄存器都保存了???要是都保存了,那么进入pendsv中断后前半段的保存r4-r11的程序是略过,而直接进行下面剩余的程序??
回复:stm32单片机移植μc/os时,任务级切换函数和中断级切换函数的困惑
回复第 2 楼 于2013-09-29 11:23:47发表:
PendSV 是最低优先级,在你前面的中断发生的时候你已经压栈一遍了。如果你再压栈,那就不对了。所以你只需要做出栈。
任务切换的时候就没有这个问题,PendSV是第一个发生的中断
那么SysTick中断时硬件都自动保存了哪些寄存器呢???是xpsp,pc,lr??还是cpu的所有的通用寄存器都保存了???要是都保存了,那么进入pendsv中断后前半段的保存r4-r11的程序是略过,而直接进行下面剩余的程序??
处理器只保存那几个特殊的和R0到R3。R0到R3是为了传参,这就是为啥你要在任务调度的时候自己实现R4到后面的,除非你能保证整个系统的函数传参都不大于这个范围,那你就可以不做这部分保存r4和后面的。
事实上咱们写程序也不会添加很多参数,一般都是包成结构体,传个地址啥的,还能保证函数的可重入。
建议你看看那本 , 里面这部分讲的很详细,尤其是关于PendSV,有专门的一章
回复: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,有专门的一章
中断时硬件只是保存了xpsr,pc,lr,r12,r0-r3,那么中断级别任务切换时,调用OSIntCtrSw进入PendSV中断服务程序时不也得进行r4-r11的保存??可是为什么书上说OSIntCtrSw()由于之前已经发生过中断,故CPU的寄存器已经保存入栈,只需要出栈即将运行任务的R4-R11即可??
回复: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即可??
大哥,R4和后面的寄存器都没变过,当然直接用了
回复: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和后面的寄存器都没变过,当然直接用了
我问的是OSIntCtrSw既然进入了PendSV中断服务程序,而中断服务程序前半段程序就是保存R4-R11的,那么OSIntCtrSw不也得保存R4-R11,不管SysTick中断时保存没有保存过,除非进入PendSV中断服务程序后跳过了保存了R4-R11那几句而直接了后面了出栈R4-R11的程序
RE:stm32单片机移植μc/os时,任务级切换函数和中断级切换函数的困惑
PendSV中断服务程序并不一定每次都去保存R4到R11。
你仔细看一下汇编,里面有OSPendSV_nosave
注意区分两个堆栈
回复:stm32单片机移植μc/os时,任务级切换函数和中断级切换函数的困惑
SysTick中断是肯定不会去保存R4到R11的
PendSV中断服务程序并不一定每次都去保存R4到R11。
你仔细看一下汇编,里面有OSPendSV_nosave
注意区分两个堆栈
邵贝贝老师里面有句话说“进入中断后,应该调用中断切换函数OSIntCtxSw,而不应调用任务切换函数OS_TASK_SW,因为中断服务子程序已经将CPU寄存器存入到了中断了的任务的堆栈中,而无需再做第二次”
那么,“已经将CPU寄存器存入到了....”里面的CPU寄存器指的是XPSR,LR,PC,这些寄存机器??还是指所有的CPU寄存器包括R4-R11??“无需再做第二次”的第二次指的是哪个过程??
我实在是弄不明白了,望帮忙解惑....