<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 一種嵌入式微調度器的實(shí)現方法

一種嵌入式微調度器的實(shí)現方法

作者:重慶郵電大學(xué)生 曾素華 蔣建春 時(shí)間:2008-07-14 來(lái)源:?jiǎn)纹瑱C與嵌入式系統應用 收藏

  3.2.2 任務(wù)及實(shí)現

本文引用地址:http://dyxdggzs.com/article/85653.htm

  這種算法已在16位單片機Motorola MC9S12DP256B和8位單片機AT89C52上實(shí)現。一些與硬件相關(guān)的算法,主要給出在MC9S12DP256B上的算法實(shí)現。

 ?、俳⑷蝿?wù)Os_Task_Create()算法。任務(wù)創(chuàng )建函數代碼如下:

  該程序表示了系統建立任務(wù)的過(guò)程。如上節所述每個(gè)任務(wù)對應一個(gè)優(yōu)先級,所以任務(wù)ID也可表示任務(wù)的優(yōu)先級。建立任務(wù)的過(guò)程就是,把任務(wù)控制塊數組的任務(wù)人口地址對應ID(即任務(wù)優(yōu)先級)的任務(wù)控制塊的任務(wù)入口地址指向任務(wù)函數的地址,并初始化該任務(wù)的任務(wù)堆棧。

 ?、谌蝿?wù)的功能是找到當前就緒列表中優(yōu)先級最高的任務(wù),并把這個(gè)任務(wù)切換到運行狀態(tài)。在任務(wù)控制塊列表中使用任務(wù)在列表中的相對位置表示優(yōu)先級的高低,并不需要實(shí)際地對任務(wù)優(yōu)先級進(jìn)行比較。算法流程如圖1所示。

  從任務(wù)控制塊隊列的頭部(即任務(wù)優(yōu)先級為0的任務(wù))開(kāi)始依次檢查任務(wù)就緒標志(os_tcb.state),如果當前任務(wù)標志≠1,表示當前任務(wù)為非就緒狀態(tài),繼續檢查下一優(yōu)先級的任務(wù)。如果當前任務(wù)標志為1,則找到最高優(yōu)先級任務(wù)退出循環(huán),調用任務(wù)調度函數進(jìn)行任務(wù)狀態(tài)切換。

  任務(wù)的如下:

  任務(wù)級切換函數需要改變程序計數器(PC),所以必須通過(guò)軟中斷實(shí)現。在軟中斷服務(wù)函數中改變當前運行任務(wù)的TCB指針到最高優(yōu)先級就緒任務(wù),執行中斷返回指令在新的任務(wù)堆棧中彈出最高優(yōu)先級任務(wù)的PSW和PC指針,從而完成任務(wù)切換。

 ?、廴蝿?wù)狀態(tài)轉換主要是激活任務(wù)os_Task_Active()、掛起任務(wù)os_Task_Suspend()和延遲任務(wù)os_Task_Delay()。掛起任務(wù)使任務(wù)進(jìn)入掛起狀態(tài),延遲任務(wù)使任務(wù)進(jìn)入等待狀態(tài),而激活任務(wù)函數可以使任務(wù)從掛起狀態(tài)或者等待狀態(tài)直接進(jìn)入就緒狀態(tài)。任務(wù)的狀態(tài)由任務(wù)控制塊中的任務(wù)狀態(tài)字(os_tcb.state)給出。當os_tcb.state=1時(shí)表示任務(wù)進(jìn)入就緒狀態(tài);當os_tcb.state=0時(shí)表示任務(wù)處于掛起狀態(tài);當os_tcb.state>1時(shí)表示任務(wù)等待os_tcb.state-1個(gè)系統時(shí)鐘間隔之后進(jìn)入就緒狀態(tài)。任務(wù)狀態(tài)切換示意圖如圖2所示。

 ?、苡捎谶@些中低端的儀器儀表每個(gè)任務(wù)的執行時(shí)間都比較短,為了避免優(yōu)先級反轉和死鎖,采用非搶占式調度方式,進(jìn)入就緒態(tài)的任務(wù)必須在當前任務(wù)執行完成后才能被調度。調度時(shí)處于就緒表中優(yōu)先級最高的任務(wù)進(jìn)入運行。

  3.2.3 調度算法的時(shí)鐘驅動(dòng)

  時(shí)間驅動(dòng)需要硬件提供時(shí)鐘節拍來(lái)實(shí)現任務(wù)的定時(shí)。時(shí)鐘節拍信號源可以是專(zhuān)門(mén)的硬件定時(shí)器,比如AT89C52中的Timer2。也可以使用其他更精確的方式提供系統時(shí)鐘節拍。在這里使用MC9S12DP256B捕獲器的第7個(gè)通道來(lái)實(shí)現,時(shí)鐘中斷處理函數如下:

  #pragma CODE_SEG DEFAULT在MC9S12DP256B的捕獲器中有一個(gè)自動(dòng)增長(cháng)主時(shí)鐘,每一個(gè)硬件周期驅動(dòng)TCNT十1,并與TC7相比較。設置TC7=TCNT+OS_TICK_OC_CNTS(在系統配置文件中定義),當度過(guò)OS_TICK_OC_CNTS個(gè)硬件周期時(shí),TCNT=TC7則產(chǎn)生中斷。在中斷中調用系統時(shí)鐘節拍函數提供精確的系統時(shí)鐘節拍,并再次初始化TC7=TCNT+OS_TICK_OC_CNTS,產(chǎn)生下一個(gè)時(shí)鐘節拍。

  系統時(shí)鐘節拍函數自動(dòng)檢查每個(gè)被延遲的任務(wù),當任務(wù)的延遲周期結束后,自動(dòng)將任務(wù)切換到就緒狀態(tài)。具體算法如下:

 ?、購娜蝿?wù)控制塊列表頭部開(kāi)始順序檢查各任務(wù)狀態(tài)字,將所有延遲任務(wù)的任務(wù)狀態(tài)字減1。

 ?、诋斍把舆t任務(wù)的狀態(tài)字變?yōu)?時(shí),該任務(wù)延時(shí)結束,置就緒任務(wù)列表改變標志位。

 ?、刍謴捅恢袛嗳蝿?wù)狀態(tài),返回中斷。

  系統時(shí)鐘驅動(dòng)代碼如下:

  結 語(yǔ)

  本文提出的任務(wù)調度算法是一個(gè)應用于系統的中間件,目的是良好地管理CPU資源,提供方便的用戶(hù)應用接口,具有良好的可移植性、時(shí)間性能和空間性能。在具有大量周期性任務(wù)的輕量級的應用中,性能和易用性的提高是非常明顯的。該算法已經(jīng)成功應用于車(chē)載的圖形操作系統中。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>