luoyiming1984 发表于 2010-9-4 17:39:32

初学uC/OS II,关于任务切换的问题

OS_CPU_SysTick中断就是负责调度任务的吧?这个中断周期是多少?我看着这个中断是定时器产生。
我对这个中断的理解是进入中断的时候把被中断的任务保存到堆栈中,然后再从堆栈中取出另一个任务,退出中断后就开始执行另一个任务。
STM32中有个PendSV又是怎么回事?我看STM32的硬件介绍,PendSV可以防止在切换任务时有中断发生,导致中断反被线程打断。STR912没有这个功能,那它又是怎么防止中断被切换掉?

John_Lee 发表于 2010-9-8 01:11:47

“负责调度任务”的说法不妥,应该是“引起任务切换”。

抢占式rtos中,引起任务切换的原因有两种:
1、任务调用同步原语时(比如获取信号量)时,系统发现同步资源(信号量计数=0)不能满足任务的要求,而将任务转入阻塞态,并将系统中就绪队列中最高优先级的任务转入运行态,这就是一次切换。
2、中断。中断服务例程可以调整同步资源,使已阻塞任务的同步资源要求得到满足,满足后,系统将阻塞态的任务转入就绪态,如果刚转入的任务优先级比正在运行态的任务优先级高,系统也会进行切换。

systick仅仅是系统中的一个中断,其它中断还有很多。

PendSV也是一个中断,只是它比较特殊,触发后不会立即响应中断,而要到了所有中断(包括嵌套的)全部完成后,PendSV中断才会响应。

PendSV的本意是:将任务切换从中断服务中独立出来。移到PendSV中进行,以硬件的方式实现普通rtos的enter interrupt和exit interrupt功能,这个效率不是软件能比的,并且,如果rtos设计得法,还可以降低中断潜伏时间(提高中断响应速度)。

_Kevin_ 发表于 2010-9-8 07:45:04

标记二楼
页: [1]
查看完整版本: 初学uC/OS II,关于任务切换的问题