kazenoai 发表于 2011-3-8 11:48:02

uCOS II 关于 OSCtxSw 和 OSIntCtxSw 的困惑

我看到 uCOS II 书籍中的,我的理解是在任务级中进行任务切换调用 OSCtxSw,而在推出中断时的任务切换调用的是 OSIntCtxSw,使用 OSIntCtxSw 的话应该不用再触发一个软中断,但是我看到别人的一段移植代码,里面的 OSCtxSw 和 OSIntCtxSw 却使用的是相同的代码,这是为什么?
OSCtxSw
    PUSH    {R4, R5}
    LDR   R4, =NVIC_INT_CTRL                                          ;trigger the PendSV exception
                                                                        
    LDR   R5, =NVIC_PENDSVSET
    STR   R5,
    POP   {R4, R5}
    BX      LR

OSIntCtxSw
    PUSH    {R4, R5}
    LDR   R4, =NVIC_INT_CTRL                                          ;trigger the PendSV exception
                                                                        
    LDR   R5, =NVIC_PENDSVSET
    STR   R5,
    POP   {R4, R5}
    BX      LR
    NOP

这是在LM3S 的 CORTEX M3 中的关于 OSCtxSw 和 OSIntCtxSw 移植代码,两段代码完全一样。
这样可以吗?实际上是可以运行的,但是不理解啊。

yinqiu009 发表于 2011-3-8 11:56:22

这个函数的作用就如你所说,就是为了任务调度。Cortex中断的压栈出栈自动完成,所以这俩函数就一样了。你有兴趣可以看看ARM7的CPU和Cortex的这部分区别。
--------------------------------------------------
好久以前弄过Ucos,可能记得不准:)

aozima 发表于 2011-3-8 11:57:43

CM3内核,专门加了个pend中断用来切换线程的.所以都这么做了.

wgjwgj 发表于 2011-3-8 12:37:04

因为中断级切换和任务级切换,都可以用同一个函数来切换,所以就合二为一了。因为这在ARM7里面可以这么干的。但是M3核的,不太清楚,如果可以合二为一,那么就说明它有和ARM7一样的特性。

kazenoai 发表于 2011-3-8 12:52:05

这是因为我对于 CORTEX M3 内核不熟悉,所以对于 uCOS 和硬件打交道的部分不了解,应该仔细研究内核方面的,谢谢了!

wanas 发表于 2011-3-8 13:01:00

OSIntCtxSw 只是刮起了一个NVIC_PENDSVSET,请求调度。随后中断退出。紧接着pendsv就启动了,这个中断完成任务切换。
请参考中断咬尾机制。

kazenoai 发表于 2011-3-8 14:16:41

听了楼上的解释,我说一下我的理解:因为 cortex m3 有这种中断咬尾机制,所以在第一个中断退出的时候并没有对堆栈进行处理,直接就进入了 PendSV 中断,因此在实际上现在的堆栈指针 SP 依然是指向被中断的哪一个任务,所以这时候又是和任务级上的任务切换一样了,所以这里就是使用相同的函数来实现在中断过后的任务切换。
页: [1]
查看完整版本: uCOS II 关于 OSCtxSw 和 OSIntCtxSw 的困惑