标签:
QK有同步抢占(post event时)和异步抢占(中断时)两种方式。而传统RTOS不分抢占的方式,只能归为异步抢占吧。
在post一个事件到高优先级任务时,会调用QK_scheduler
, 找到当前最高的优先级任务来执行,这是同步抢占;而异步抢占发生在中断中,也会调用QK_scheduler
。
不管是什么抢占,在返回前都要检查是不是有更高级的任务要执行--处理事件。
static void interrupt ISR( ) {
uint8_t pin; //用于暂存被中断任务的优先级
QK_ISR_ENTRY(pin, ISR_PRIO); //QK的特殊中断进入处理,执行下面的3个动作:
(1)保存当前优先级(被中断任务的优先级)到pin中;
(2)设置当前优先级为ISR_PRIO;
(3)开中断
Do interrupt processingthat might include QF calls.//传统中断服务处理,其中可以调QF函数。
QK_ISR_EXIT(pin); //QK的特殊中断退出,执行下面4个动作:
(1)关中断
(2)写结束EOI(End Of Interrupt) 到中断控制器. 如8259。相当于中断结束了,可以响应其它中断了。
(3)恢复当前优先级为pin
(4)调用QK_scheduler ; //*!异步抢占可能在这里会发生。
}//*!这里是中断的真正返回。上边的EOI只是表示本次中断结束,但并没返回。
!!!这里的关键是对EOI的理解,当写EOI时,表示当前中断已经结束,可以响应所有的中断,包括同级与低级。虽然当前中断已经结束,但并没有马上中断返回,在返回前会调用QK_scheculer
, 如有更高任务,就执行,执行完才可能返回。
这种处理是可以多层嵌套的,所有的过程只用了一个stack。
其思想源于SST(Super Simple Task)。
标签:
原文地址:http://www.cnblogs.com/hyper99/p/QK-dui-zhong-duan-de-te-shu-chu-li.html