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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

uCOS-II核心算法分析(μCOS-Ⅱ)

發(fā)布時間:2023/12/15 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 uCOS-II核心算法分析(μCOS-Ⅱ) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
μC/OS-Ⅱ是一種免費公開源代碼、結(jié)構(gòu)小巧、具有可剝奪實時內(nèi)核的實時操作系統(tǒng)。其內(nèi)核提供任務(wù)調(diào)度與管理、時間管理、任務(wù)間同步與通信、內(nèi)存管理和中斷服務(wù)等功能。適合小型控制系統(tǒng),具有執(zhí)行效率高、占用空間小、實時性能優(yōu)良和可擴(kuò)展性強(qiáng)等特點,最小內(nèi)核可編譯至2KB。μC/OS-Ⅱ為何如此高效呢?我們從它的核心算法——任務(wù)調(diào)度算法開始分析。
2.1任務(wù)調(diào)度算法分析
? ? ? 操作系統(tǒng)的實時性主要體現(xiàn)在:當(dāng)優(yōu)先級高的任務(wù)要求工作時,操作系統(tǒng)要以盡快的時間將此任務(wù)調(diào)度到CPU執(zhí)行。這里所花費的時間主要包括兩部分:查找最高優(yōu)先級任務(wù)和任務(wù)上下文切換。其中,任務(wù)上下文切換時間是和處理器相關(guān)的,操作系統(tǒng)無法控制。我們主要分析uC/OS-ii如何查找最高優(yōu)先級任務(wù)的。

?? 因為任務(wù)較少,uC/OS-II采用單一優(yōu)先級,這為算法的實現(xiàn)提供了很大的方便在uC/OS-II中,優(yōu)先級可以作為任務(wù)的標(biāo)識(當(dāng)然要在任務(wù)存在的情況下,是通過一個指針數(shù)組實現(xiàn)的)來用。
?? 調(diào)度算法主要基于分級查詢。考慮到任務(wù)數(shù)目<64,可以用6bit來表示,分為高3位和低三位。uC/OS-II將優(yōu)先級進(jìn)行分組,按高三位進(jìn)行分組,可得8個(最多)優(yōu)先級數(shù)組(000-111);每個優(yōu)先級的在數(shù)組中的位置由其低三位表示。在源碼中,高三位用帶Y后綴的變量表示,而低三位用帶 X后綴的變量表示。這樣建立了1個變量OSRdyGrp(INT8U,8bit,每個bit代表一組)和1個數(shù)組OSRdyTbl[8](INT8U,每組8bit,每個bit代表一個優(yōu)先級)。這樣形成了的二級查詢,先選組,再選組內(nèi)偏移。
?? 其中,OSRdyGrp每一bit置1,表示該組有任務(wù)就緒。(第0~7組)。其示意圖見下圖:

我們舉一個例子,看一下如果優(yōu)先級為22的任務(wù)就緒,我們?nèi)绾螌?yōu)先級數(shù)組進(jìn)行操作。用二進(jìn)制表示為0b00010110,其高3位為010,為2,則將第2組,也就是OSRdyGrp的第2位置1。其低3位為110,為6,則將其OSRdyTbl[2]的第6位置1。編程實現(xiàn)時,可以通過對1進(jìn)行移位,再進(jìn)行 或 操作來實現(xiàn)。但考慮到移位時間不確定,uC/OS-II選擇建立了一個表OSMapTbl[8],如下。
表 T3.1 OSMapTbl[]的值

Index????????? Bit Mask (Binary)
0????????? 00000001
1????????? 00000010
2????????? 00000100
3????????? 00001000
4????????? 00010000
5????????? 00100000
6????????? 01000000
7????????? 10000000
這樣,當(dāng)一個任務(wù)就緒時,我們這樣處理。其中Prio是任務(wù)的優(yōu)先級。
程序清單 L3.5 使任務(wù)進(jìn)入就緒態(tài)
OSRdyGrp????????????? |= OSMapTbl[prio >> 3];
OSRdyTbl[prio >> 3] |= OSMapTbl[prio & 0x07];
而當(dāng)任務(wù)被掛起或刪除時,我們這樣處理:
程序清單 L3.6 從就緒表中刪除一個任務(wù)
if ((OSRdyTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07]) == 0)
????? OSRdyGrp &= ~OSMapTbl[prio >> 3];
表建立了,如何查詢最高優(yōu)先級呢?這是很關(guān)鍵的。因為優(yōu)先級的值越小,優(yōu)先級越高,我們只需從OSRdyGrp中找到最低位置1的的那一組,再從該組中,查找最低位置1的位置,組合一下,就得到了最高的優(yōu)先級。
同樣,這可以通過一個while循環(huán)進(jìn)行判斷,但是,時間也是不確定的。所以,uC/OS-II又建立了一張表OSUnMapTbl,這張表有點大,其下標(biāo)值范圍為0x00-0xff,值域為0-7。
這樣,其查詢流程為:
程序清單 L3.7 找出進(jìn)入就緒態(tài)的優(yōu)先級最高的任務(wù)
y????? = OSUnMapTbl[OSRdyGrp];
x????? = OSUnMapTbl[OSRdyTbl[y]];
prio = (y << 3) + x;

2.2事件處理算法分析
在uC/OS-II中,事件可以是信號量、郵箱或者消息隊列等,并用統(tǒng)一的結(jié)構(gòu)體OS_EVENT表示。
我們先看一下OS_EVENT的組成:
typedef struct {
INT8U???????????? OSEventType;????????????????
INT8U????? OSEventGrp;???????????????????
INT16U??????????? OSEventCnt;???????????????????
void???????????? *OSEventPtr;??????????????????
INT8U????? OSEventTbl[OS_EVENT_TBL_SIZE];
} OS_EVENT;
????????? 注意其中兩個變量:OSEventGrp和OSEventTbl[],是不是覺得有點象OSRdyGrp和OSRdyTbl[]。那它們的處理算法是不是也一樣呢?你猜對了,這里關(guān)于事件的各種操作(如pend、post、timeout、wait等)的算法和任務(wù)調(diào)度算法如出一轍。當(dāng)然也用到了 OSUnMapTb[]和OSMapTbl[]。只是任務(wù)就緒時(等待CPU時)插入就緒表,而當(dāng)任務(wù)需要等待事件時要插入EVENT等待列表,反之亦同。
2.3 小結(jié)
????????? 這兩個算法(1種算法)是os_core.c中最主要的算法。此算法執(zhí)行時間恒定,不隨任務(wù)數(shù)目的多少變化(但不能超過64個任務(wù)),保證了其實時性。這里,順便對uC/OS-ii的設(shè)計哲學(xué)進(jìn)行臆測:那就是“以空間換時間”,也就是表格table (array)。這可以從uC/OS-II中存在眾多的全局變量,如OSEventTabl[],OSRdyTbl[],OSTCBTbl[](這樣避免了動態(tài)初始化)看出,也可以從上面介紹的任務(wù)調(diào)度算法中看出(核心數(shù)據(jù)結(jié)構(gòu)為數(shù)組,并建立了兩張表OSUnMapTbl和OSMapTbl)。

總結(jié)

以上是生活随笔為你收集整理的uCOS-II核心算法分析(μCOS-Ⅱ)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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