1.QK的特性
QK(Quntum Kernel)是一個(gè)搶占式、基于優(yōu)先級(jí)實(shí)時(shí)微內(nèi)核、一個(gè)多任務(wù)調(diào)度器;
QK不同于傳統(tǒng)的RTOS,是非阻塞的,并且只用了一個(gè)stack;
對(duì)QK中的任務(wù)來說,采用了IOC(好萊塢原則)方式(是callback的),而不同于傳統(tǒng)RTOS中任務(wù)的多線程或進(jìn)程中的等待;
傳統(tǒng)RTOS只有中斷后,才可能會(huì)有任務(wù)切換,而QK不只是中斷后,在post一個(gè)事件后,也可能會(huì)使任務(wù)切換;
QK對(duì)事件的處理是RTC的;
.......
2.QK搶占方式
QK有同步搶占(post event時(shí))和異步搶占(中斷時(shí))兩種方式,
QK對(duì)中斷的特殊處理
。而傳統(tǒng)RTOS不分搶占的方式,只能歸為異步搶占吧。在post一個(gè)事件到高優(yōu)先級(jí)任務(wù)時(shí),會(huì)調(diào)用QK_scheduler, 找到當(dāng)前最高的優(yōu)先級(jí)任務(wù)來執(zhí)行,這是同步搶占;而異步搶占發(fā)生在中斷中,也會(huì)調(diào)用QK_scheduler。
不管是什么搶占,在返回前都要檢查是不是有更高級(jí)的任務(wù)要執(zhí)行--處理事件。
3.QK的中斷處理 (偽代碼)
static void interrupt ISR( ) {
uint8_t pin; //用于暫存被中斷任務(wù)的優(yōu)先級(jí)
QK_ISR_ENTRY(pin, ISR_PRIO); //QK的特殊中斷進(jìn)入處理,執(zhí)行下面的3個(gè)動(dòng)作:
(1)保存當(dāng)前優(yōu)先級(jí)(被中斷任務(wù)的優(yōu)先級(jí))到pin中;
(2)設(shè)置當(dāng)前優(yōu)先級(jí)為ISR_PRIO;
(3)開中斷
Do interrupt processingthat might include QF calls.//傳統(tǒng)中斷服務(wù)處理,其中可以調(diào)QF函數(shù),
電腦資料
《QK對(duì)中斷的特殊處理》(http://www.ishadingyu.com)。QK_ISR_EXIT(pin); //QK的特殊中斷退出,執(zhí)行下面4個(gè)動(dòng)作:
(1)關(guān)中斷
(2)寫結(jié)束EOI(End Of Interrupt) 到中斷控制器. 如8259。相當(dāng)于中斷結(jié)束了,可以響應(yīng)其它中斷了。
(3)恢復(fù)當(dāng)前優(yōu)先級(jí)為pin
(4)調(diào)用QK_scheduler ; //*!異步搶占可能在這里會(huì)發(fā)生。
}//*!這里是中斷的真正返回。上邊的EOI只是表示本次中斷結(jié)束,但并沒返回。
。!這里的關(guān)鍵是對(duì)EOI的理解,當(dāng)寫EOI時(shí),表示當(dāng)前中斷已經(jīng)結(jié)束,可以響應(yīng)所有的中斷,包括同級(jí)與低級(jí)。雖然當(dāng)前中斷已經(jīng)結(jié)束,但并沒有馬上中斷返回,在返回前會(huì)調(diào)用QK_scheculer, 如有更高任務(wù),就執(zhí)行,執(zhí)行完才可能返回。
這種處理是可以多層嵌套的,所有的過程只用了一個(gè)stack。