日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Nucleus PLUS任务调度

發(fā)布時(shí)間:2024/4/15 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Nucleus PLUS任务调度 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

概述

Nucleus Plus內(nèi)核(Kernel)的主要目的是管理實(shí)時(shí)任務(wù)的競(jìng)爭(zhēng)執(zhí)行(共享CPU),為應(yīng)用提供各種便利,高速響應(yīng)外部事件。Nucleus Plus的系統(tǒng)結(jié)構(gòu)如圖1所看到的,能夠看出線程控制是整個(gè)內(nèi)核的核心,通過(guò)郵箱、隊(duì)列、管道來(lái)實(shí)現(xiàn)任務(wù)之間的通信,通過(guò)信號(hào)量、事件組和信號(hào)實(shí)現(xiàn)任務(wù)間的同步。


線程控制部件用來(lái)管理實(shí)時(shí)任務(wù)和高級(jí)中斷服務(wù)的運(yùn)行,它是Nucleus 嵌入式實(shí)時(shí)操作系統(tǒng)最核心的部分。為了控制運(yùn)行過(guò)程,任務(wù)通常被分配一個(gè)優(yōu)先級(jí)。任務(wù)優(yōu)先級(jí)的范圍從0到255,優(yōu)先級(jí)0的優(yōu)先權(quán)最高。除非搶占標(biāo)示位被置為無(wú)效,否則低優(yōu)先級(jí)的任務(wù)將被高優(yōu)先級(jí)就緒的任務(wù)搶占。為保證對(duì)外部事件的實(shí)時(shí)性響應(yīng),Nucleus設(shè)計(jì)了高級(jí)中斷服務(wù)HISR,它的優(yōu)先級(jí)范圍從0到2,當(dāng)中優(yōu)先級(jí)0的級(jí)別最高。

任務(wù)調(diào)度線程就負(fù)責(zé)搶占式實(shí)時(shí)任務(wù)和HISR的調(diào)度管理。每一個(gè)用戶應(yīng)用由多個(gè)任務(wù)組成,一個(gè)任務(wù)就是具有特定目的的半獨(dú)立程序片段,任務(wù)處于五種狀態(tài)之中的一個(gè)--執(zhí)行、就緒、掛起、終止、完畢,如表1所看到的。任務(wù)具有不同的優(yōu)先級(jí),高優(yōu)先級(jí)任務(wù)可以搶占低優(yōu)先級(jí)任務(wù),同優(yōu)先級(jí)任務(wù)依照進(jìn)入”就緒狀態(tài)“的順序調(diào)度,優(yōu)先級(jí)從0-255遞減。

表1 Nucleus任務(wù)的五種狀態(tài)


狀態(tài)意義

執(zhí)行Executing

任務(wù)當(dāng)前正在被CPU運(yùn)行。

就緒Ready

任務(wù)就緒,可是還有一個(gè)任務(wù)當(dāng)前正在執(zhí)行。

掛起Suspended

任務(wù)由于服務(wù)等待需求而體眠。當(dāng)需求滿足時(shí),任務(wù)變?yōu)榫途w狀態(tài)。默認(rèn)情況下,新創(chuàng)建的任務(wù)都處于

終止Terminated

任務(wù)被終止。當(dāng)任務(wù)處于這樣的狀態(tài)時(shí),它將不再運(yùn)行直到它被復(fù)位。

完畢Finished

任務(wù)完畢了.從入口函數(shù)中退出。任務(wù)處于這樣的狀態(tài)時(shí),它將不再運(yùn)行直到受到復(fù)位。

(一)任務(wù)調(diào)度算法

Nucleus調(diào)度程序用來(lái)決定是否要進(jìn)行任務(wù)切換,假設(shè)須要切換的話,切換到哪個(gè)進(jìn)程等。Nucleus實(shí)時(shí)操作系統(tǒng)的任務(wù)調(diào)度算法很easy,它包含時(shí)間片輪轉(zhuǎn)算法和輪詢算法。

時(shí)間片輪轉(zhuǎn)算法是將同樣優(yōu)先級(jí)的任務(wù)都分配同樣的時(shí)間片,當(dāng)時(shí)間片用完后再轉(zhuǎn)到下一個(gè)任務(wù),輪流運(yùn)行直到這個(gè)優(yōu)先級(jí)的所有任務(wù)所有運(yùn)行完成,然后再轉(zhuǎn)到下一個(gè)優(yōu)先級(jí)。輪詢算法是在本優(yōu)先級(jí)內(nèi)的所有任務(wù)依照就緒時(shí)間的先后 順序運(yùn)行,當(dāng)這個(gè)優(yōu)先級(jí)的所有任務(wù)都運(yùn)行完成后,再運(yùn)行下一個(gè)優(yōu)先級(jí)的任務(wù)。

再者,Nucleus實(shí)時(shí)操作系統(tǒng)具有可搶占性,進(jìn)程調(diào)度的根據(jù)就是依照優(yōu)先級(jí)從高到低順序進(jìn)行調(diào)度。當(dāng)?shù)蛢?yōu)先級(jí)任務(wù)在運(yùn)行時(shí),高優(yōu)先級(jí)任務(wù)就緒準(zhǔn)備運(yùn)行時(shí)則會(huì)搶占運(yùn)行,迫使低優(yōu)先級(jí)任務(wù)掛起。

Nucleus的調(diào)度時(shí)機(jī)包含:

(1)進(jìn)程狀態(tài)轉(zhuǎn)換的時(shí)刻,即進(jìn)程終止、進(jìn)程睡眠;

(2)可執(zhí)行隊(duì)列中新添加一個(gè)進(jìn)程時(shí);

(3)當(dāng)前進(jìn)程的時(shí)間片用完;

(4)進(jìn)程從系統(tǒng)調(diào)用返回到用戶態(tài);

(5)內(nèi)核處理完中斷后,進(jìn)程返回到用戶態(tài)。

(二)Nucleus PLUS任務(wù)管理

1,主要任務(wù)控制結(jié)構(gòu)

Nucleus PLUS每個(gè)任務(wù)都有一個(gè)控制結(jié)構(gòu)體稱為線程控制塊Thread Control Block(TCB),任務(wù)支持動(dòng)態(tài)的創(chuàng)建和刪除,TC通過(guò)一個(gè)雙向鏈表TCD_Created_Tasks_List管理全部的任務(wù),全局變量TCD_Total_Tasks表示已創(chuàng)建的總?cè)蝿?wù)數(shù)。

TCD_Priority_List是一個(gè)大小為256的TCB指針數(shù)組TC_TCB (*TCD_Priority_List)[256](數(shù)組大小與Nucleus PLUS優(yōu)先級(jí)數(shù)同樣),數(shù)組元素按任務(wù)優(yōu)先級(jí)索引。數(shù)組中的每一個(gè)元素都是某個(gè)優(yōu)先級(jí)就緒任務(wù)鏈表的頭。若某元素為空則表明那個(gè)優(yōu)先級(jí)沒(méi)有就緒任務(wù)。 對(duì)于每一個(gè)優(yōu)先級(jí)的就緒任務(wù)列表,TCB是以雙向列表的形式存儲(chǔ)。即Nucleus PLUS維護(hù)一個(gè)指針數(shù)組來(lái)調(diào)度不同優(yōu)先級(jí)的任務(wù)鏈表。

圖2 TCD_Priority_List

2,任務(wù)優(yōu)先級(jí)管理

Nucleus在進(jìn)行任務(wù)切換時(shí)須要計(jì)算最高優(yōu)先級(jí),為了高速的計(jì)算就緒任務(wù)中最高的優(yōu)先級(jí),Nucleus PLUS引入了一種優(yōu)先級(jí)分組+查找表機(jī)制。

2.1 TCD_Priority_Groups

任務(wù)的優(yōu)先級(jí)從0到255,0的優(yōu)先級(jí)別最高,255的優(yōu)先級(jí)別最低。256個(gè)優(yōu)先級(jí)分成32組,每組相應(yīng)8個(gè)級(jí)別。比如第0組相應(yīng)優(yōu)先級(jí)0~7、第1組相應(yīng) 8~15、...。用32位整型變量TCD_Priority_Groups的每一位標(biāo)示優(yōu)先級(jí)組是否有任務(wù)進(jìn)入就緒狀態(tài),某位為1表示改組至少有一個(gè)任務(wù)就緒。

圖3 TCD_Priority_Groups

2.2 TCD_Sub_Priority_Groups[]

子優(yōu)先級(jí)數(shù)組TCD_Sub_Priority_Groups[32]標(biāo)示一個(gè)組內(nèi)詳細(xì)的8個(gè)優(yōu)先級(jí),數(shù)組元素為8位整型,每一位相應(yīng)組內(nèi)一個(gè)優(yōu)先級(jí)。如TCD_Sub_Priority_Groups[0]表示第0組(優(yōu)先級(jí)0-7)任務(wù)的就緒狀態(tài),第0位為1表明優(yōu)先級(jí)0的任務(wù)就緒、第7位為1表明優(yōu)先級(jí)7的任務(wù)就緒。

圖4 TCD_Sub_Priority_Groups

若任務(wù)的優(yōu)先級(jí)為Tc_priority, 該任務(wù)的子優(yōu)先級(jí)掩碼為:tc_sub_priority=1<<(tc_priority&7)。 該任務(wù)的優(yōu)先級(jí)組掩碼為:tc_priority_group=1<<((tc_priority)>>3)。

2.3 TCD_Lowest_Set_Bit[]

TCD_Lowest_Set_Bit[]是一個(gè)查找表(元素預(yù)先已計(jì)算出),該表是8位整型數(shù)據(jù)的序號(hào)和數(shù)據(jù)8個(gè)位中第一個(gè)為1的位的位置(從高往底數(shù))的,比如TCD_Lowest_Set_Bit[n]=value,n指8位整型數(shù)的值(就是序號(hào)),value指的是8個(gè)位中第一個(gè)為1的位置(從低往高數(shù))。如Unsigned Char 7的二進(jìn)制是0000 0111,第一個(gè)為1的位位0,value=0,TCD_Lowest_Set_Bit[7] = 0。

如此便能夠求得表TCD_Lowest_Set_Bit[256]。舉例,8位整型數(shù)中位0為1的數(shù)據(jù)包含1、3、5、7、9、11、13、15,...,253,255,所以有:

TCD_Lowest_Set_Bit[1]= 0, TCD_Lowest_Set_Bit[3]= 0, TCD_Lowest_Set_Bit[5]= 0, TCD_Lowest_Set_Bit[7]= 0, ..., TCD_Lowest_Set_Bit[253]= 0, TCD_Lowest_Set_Bit[255]= 0。

?

2.4 任務(wù)創(chuàng)建和優(yōu)先級(jí)管理的基本過(guò)程

任務(wù)優(yōu)先級(jí)管理全局變量

UNSIGNED TCD_Priority_Groups; DATA_ELEMENT TCD_Sub_Priority_Groups[TC_MAX_GROUPS]; UNSIGNED_CHAR TCD_Lowest_Set_Bit[256] = {0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0}; INT TCD_Highest_Priority;//就緒狀態(tài)任務(wù)的最高優(yōu)先級(jí) i.創(chuàng)建一個(gè)task時(shí)(tcc.c)--TCC_Create_Task?funtion

extern UNSIGNED TCD_Priority_Groups; extern DATA_ELEMENT TCD_Sub_Priority_Groups[TC_MAX_GROUPS]; extern UNSIGNED_CHAR TCD_Lowest_Set_Bit[]; extern INT TCD_Highest_Priority; task -> tc_priority = priority; task -> tc_priority_head = &(TCD_Priority_List[priority]); task -> tc_sub_priority = (DATA_ELEMENT) (1 << (priority & 7));//組內(nèi)子優(yōu)先級(jí)計(jì)算,0-7 priority = priority >> 3;//優(yōu)先級(jí)組計(jì)算,有32個(gè)組 task -> tc_priority_group = ((UNSIGNED) 1) << priority;//優(yōu)先級(jí)組響應(yīng)組標(biāo)示位置1 task -> tc_sub_priority_ptr = &(TCD_Sub_Priority_Groups[priority]);//指向子優(yōu)先級(jí)起始

ii. 恢復(fù)執(zhí)行一個(gè)task時(shí)(tcc.c)--TCC_Resume_Task?fuction

TCD_Priority_Groups = TCD_Priority_Groups | (task -> tc_priority_group); //組號(hào)保存到全局變量 *(task -> tc_sub_priority_ptr) = (*(task -> tc_sub_priority_ptr)) | task -> tc_sub_priority; //組內(nèi)值保存到全局變量

iii.獲取當(dāng)前最高優(yōu)先級(jí)(tcc.c)

if (TCD_Priority_Groups & TC_HIGHEST_MASK) index = 0; else if (TCD_Priority_Groups & TC_NEXT_HIGHEST_MASK) index = 8; else if (TCD_Priority_Groups & TC_NEXT_LOWEST_MASK) index = 16; else index = 24; index = index + TCD_Lowest_Set_Bit[(INT)((TCD_Priority_Groups >> index) & TC_HIGHEST_MASK)];//獲取組號(hào)中1的最低排位,取值范圍0~31 temp = TCD_Sub_Priority_Groups[index];//與priority_group相應(yīng),有32個(gè)Sub_Priority_Groups,通過(guò)index查找到相應(yīng)的Sub_Priority_Groups TCD_Highest_Priority = (index << 3) + TCD_Lowest_Set_Bit[temp];//獲取到實(shí)際的最高優(yōu)先級(jí) 獲取到實(shí)際的最高優(yōu)先級(jí)后,將最高優(yōu)先級(jí)的任務(wù)掛入Tcd_priority_list[]、完畢調(diào)度后,該任務(wù)位會(huì)被清空,接著再次循環(huán)獲取下一個(gè)任務(wù)優(yōu)先級(jí)。

轉(zhuǎn)載于:https://www.cnblogs.com/bhlsheji/p/3824916.html

總結(jié)

以上是生活随笔為你收集整理的Nucleus PLUS任务调度的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。