<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > μC/OS-II的內(nèi)核結(jié)構(gòu)

          μC/OS-II的內(nèi)核結(jié)構(gòu)

          作者: 時(shí)間:2016-10-08 來源:網(wǎng)絡(luò) 收藏

          了任務(wù),棧檢驗(yàn)功能報(bào)告的棧使用情況將是錯(cuò)誤的。如果任務(wù)一旦建立就決不會(huì)被刪除,

          而用戶初始化時(shí),已將RAM清過零,則OS_TASK_OPT_STK_CLR不需要再定義,這可以節(jié)約程

          序執(zhí)行時(shí)間。傳遞了OS_TASK_OPT_STK_CLR將增加TaskCreateExt()函數(shù)的執(zhí)行時(shí)間,因?yàn)?p>要將棧空間清零。棧容量越大,清零花的時(shí)間越長。最后一個(gè)選擇項(xiàng)

          OS_TASK_OPT_SAVE_FP通知TaskCreateExt(),任務(wù)要做浮點(diǎn)運(yùn)算。如果微處理器有硬件的

          浮點(diǎn)協(xié)處理器,則所建立的任務(wù)在做任務(wù)調(diào)度切換時(shí),浮點(diǎn)寄存器的內(nèi)容要保存。

          .OSTCBId用于存儲(chǔ)任務(wù)的識(shí)別碼。這個(gè)變量現(xiàn)在沒有使用,留給將來擴(kuò)展用。

          .OSTCBNext 和.OSTCBPrev 用于任務(wù)控制塊OS_TCBs的雙重鏈接,該鏈表在時(shí)鐘節(jié)拍函數(shù)

          OSTimeTick()中使用,用于刷新各個(gè)任務(wù)的任務(wù)延遲變量.OSTCBDly,每個(gè)任務(wù)的任務(wù)控制

          塊OS_TCB在任務(wù)建立的時(shí)候被鏈接到鏈表中,在任務(wù)刪除的時(shí)候從鏈表中被刪除。雙重連

          接的鏈表使得任一成員都能被快速插入或刪除。

          .OSTCBEventPtr是指向事件控制塊的指針,后面的章節(jié)中會(huì)有所描述(見第6章任務(wù)間通

          訊與同步)。

          .OSTCBMsg是指向傳給任務(wù)的消息的指針。用法將在后面的章節(jié)中提到(見第6章任務(wù)間通

          訊與同步)。

          .OSTCBDly 當(dāng)需要把任務(wù)延時(shí)若干時(shí)鐘節(jié)拍時(shí)要用到這個(gè)變量,或者需要把任務(wù)掛起一段

          時(shí)間以等待某事件的發(fā)生,這種等待是有超時(shí)限制的。在這種情況下,這個(gè)變量保存的是

          任務(wù)允許等待事件發(fā)生的最多時(shí)鐘節(jié)拍數(shù)。如果這個(gè)變量為0,表示任務(wù)不延時(shí),或者表

          示等待事件發(fā)生的時(shí)間沒有限制。

          .OSTCBStat是任務(wù)的狀態(tài)字。當(dāng).OSTCBStat為0,任務(wù)進(jìn)入就緒態(tài)??梢越o.OSTCBStat賦

          其它的值,在文件uCOS_II.H中有關(guān)于這個(gè)值的描述。

          .OSTCBPrio是任務(wù)優(yōu)先級(jí)。高優(yōu)先級(jí)任務(wù)的.OSTCBPrio值小。也就是說,這個(gè)值越小,任

          務(wù)的優(yōu)先級(jí)越高。

          .OSTCBX,.OSTCBY,.OSTCBBitX和.OSTCBBitY 用于加速任務(wù)進(jìn)入就緒態(tài)的過程或進(jìn)入等

          待事件發(fā)生狀態(tài)的過程(避免在運(yùn)行中去計(jì)算這些值)。這些值是在任務(wù)建立時(shí)算好的,

          或者是在改變?nèi)蝿?wù)優(yōu)先級(jí)時(shí)算出的。這些值的算法見程序清單L3.4。

          程序清單 L3.4 任務(wù)控制塊OS_TCB中幾個(gè)成員的算法

          OSTCBY=priority>>3;

          OSTCBBitY=OSMapTbl[priority>>3];

          OSTCBX=priority0x07;

          OSTCBBitX=OSMapTbl[priority0x07];

          .OSTCBDelReq是一個(gè)布爾量,用于表示該任務(wù)是否需要?jiǎng)h除,用法將在后面的章節(jié)中描述

          (見第4章任務(wù)管理)

          應(yīng)用程序中可以有的最多任務(wù)數(shù)(OS_MAX_TASKS)是在文件OS_CFG.H中定義的。這個(gè)

          最多任務(wù)數(shù)也是μC/OS-Ⅱ分配給用戶程序的最多任務(wù)控制塊OS_TCBs的數(shù)目。將

          OS_MAX_TASKS的數(shù)目設(shè)置為用戶應(yīng)用程序?qū)嶋H需要的任務(wù)數(shù)可以減小RAM的需求量。所有

          的任務(wù)控制塊OS_TCBs都是放在任務(wù)控制塊列表數(shù)組OSTCBTbl[]中的。請注意,μC/OS-Ⅱ

          分配給系統(tǒng)任務(wù)OS_N_SYS_TASKS若干個(gè)任務(wù)控制塊,見文件μC/OS-Ⅱ.H,供其內(nèi)部使

          用。目前,一個(gè)用于空閑任務(wù),另一個(gè)用于任務(wù)統(tǒng)計(jì)(如果OS_TASK_STAT_EN是設(shè)為

          1的)。在μC/OS-Ⅱ初始化的時(shí)候,如圖3.2所示,所有任務(wù)控制塊OS_TCBs被鏈接成單

          向空任務(wù)鏈表。當(dāng)任務(wù)一旦建立,空任務(wù)控制塊指針OSTCBFreeList指向的任務(wù)控制塊便

          賦給了該任務(wù),然后OSTCBFreeList的值調(diào)整為指向下鏈表中下一個(gè)空的任務(wù)控制塊。一

          旦任務(wù)被刪除,任務(wù)控制塊就還給空任務(wù)鏈表。

          圖3.2空任務(wù)列表

          3.4 就緒表(ReadyList)

          每個(gè)任務(wù)被賦予不同的優(yōu)先級(jí)等級(jí),從0級(jí)到最低優(yōu)先級(jí)OS_LOWEST_PR1O,包括0和S_LOWEST_PR1O在內(nèi)(見文件OS_CFG.H)。當(dāng)μC/OS-Ⅱ初始化的時(shí)候,最低優(yōu)先級(jí)OS_LOWEST_PR1O總是被賦給空閑任務(wù)idletask。注意,最多任務(wù)數(shù)目OS_MAX_TASKS和最低優(yōu)先級(jí)數(shù)是沒有關(guān)系的。用戶應(yīng)用程序可以只有10個(gè)任務(wù),而仍然可以有32個(gè)優(yōu)先級(jí)的級(jí)別(如果用戶將最低優(yōu)先級(jí)數(shù)設(shè)為31的話)。

          每個(gè)任務(wù)的就緒態(tài)標(biāo)志都放入就緒表中的,就緒表中有兩個(gè)變量OSRedyGrp和OSRdyTbl[]。在OSRdyGrp中,任務(wù)按優(yōu)先級(jí)分組,8個(gè)任務(wù)為一組。OSRdyGrp中的每一位表示8組任務(wù)中每一組中是否有進(jìn)入就緒態(tài)的任務(wù)。任務(wù)進(jìn)入就緒態(tài)時(shí),就緒表OSRdyTbl[]中的相應(yīng)元素的相應(yīng)位也置位。就緒表OSRdyTbl[]數(shù)組的大小取決于OS_LOWEST_PR1O(見文件OS_CFG.H)。當(dāng)用戶的應(yīng)用程序中任務(wù)數(shù)目比較少時(shí),減少OS_LOWEST_PR1O的值可以降低μC/OS-Ⅱ?qū)AM(數(shù)據(jù)空間)的需求量。

          為確定下次該哪個(gè)優(yōu)先級(jí)的任務(wù)運(yùn)行了,內(nèi)核調(diào)度器總是將OS_LOWEST_PR1O在就緒表中相應(yīng)字節(jié)的相應(yīng)位置1。OSRdyGrp和OSRdyTbl[]之間的關(guān)系見圖3.3,是按以下規(guī)則給出的:

          當(dāng)OSRdyTbl[0]中的任何一位是1時(shí),OSRdyGrp的第0位置1,

          當(dāng)OSRdyTbl[1]中的任何一位是1時(shí),OSRdyGrp的第1位置1,

          當(dāng)OSRdyTbl[2]中的任何一位是1時(shí),OSRdyGrp的第2位置1,

          當(dāng)OSRdyTbl[3]中的任何一位是1時(shí),OSRdyGrp的第3位置1,

          當(dāng)OSRdyTbl[4]中的任何一位是1時(shí),OSRdyGrp的第4位置1,

          當(dāng)OSRdyTbl[5]中的任何一位是1時(shí),OSRdyGrp的第5位置1,

          當(dāng)OSRdyTbl[6]中的任何一位是1時(shí),OSRdyGrp的第6位置1,

          當(dāng)OSRdyTbl[7]中的任何一位是1時(shí),OSRdyGrp的第7位置1,

          程序清單3.5中的代碼用于將任務(wù)放入就緒表。Prio是任務(wù)的優(yōu)先級(jí)。

          程序清單L3.5使任務(wù)進(jìn)入就緒態(tài)

          OSRdyGrp|=OSMapTbl[prio>>3];

          OSRdyTbl[prio>>3]|=OSMapTbl[prio0x07];

          表T3.1OSMapTbl[]的值



          關(guān)鍵詞:

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();