新聞中心

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

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

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

        μC/OS-Ⅱ是怎樣處理臨界段代碼的;

        本文引用地址:http://www.104case.com/article/201610/305744.htm

        什么是任務(wù),怎樣把用戶的任務(wù)交給μC/OS-Ⅱ;

        任務(wù)是怎樣調(diào)度的;

        應(yīng)用程序CPU的利用率是多少,μC/OS-Ⅱ是怎樣知道的;

        怎樣寫中斷服務(wù)子程序;

        什么是時鐘節(jié)拍,μC/OS-Ⅱ是怎樣處理時鐘節(jié)拍的;

        μC/OS-Ⅱ是怎樣初始化的,以及

        怎樣啟動多任務(wù);

        本章還描述以下函數(shù),這些服務(wù)于應(yīng)用程序:

        OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL(),

        OSInit(),

        OSSTart(),

        OSIntEnter() 和 OSIntExit(),

        OSSchedLock() 和 OSSchedUnlock(), 以及

        OSVersiON().

        3.0 臨界段(CriticalSections)

        和其它內(nèi)核一樣,μC/OS-Ⅱ為了處理臨界段代碼需要關(guān)中斷,處理完畢后再開中斷。這使得μC/OS-Ⅱ能夠避免同時有其它任務(wù)或中斷服務(wù)進入臨界段代碼。關(guān)中斷的時間是實時內(nèi)核開發(fā)商應(yīng)提供的最重要的指標(biāo)之一,因為這個指標(biāo)影響用戶系統(tǒng)對實時事件的響應(yīng)性。μC/OS-Ⅱ努力使關(guān)中斷時間降至最短,但就使用μC/OS-Ⅱ而言,關(guān)中斷的時間很大程度上取決于微處理器的架構(gòu)以及編譯器所生成的代碼質(zhì)量。

        微處理器一般都有關(guān)中斷/開中斷指令,用戶使用的C語言編譯器必須有某種機制能夠在C中直接實現(xiàn)關(guān)中斷/開中斷地操作。某些C編譯器允許在用戶的C源代碼中插入?yún)R編語言的語句。這使得插入微處理器指令來關(guān)中斷/開中斷很容易實現(xiàn)。而有的編譯器把從C語言中關(guān)中斷/開中斷放在語言的擴展部分。μC/OS-Ⅱ定義兩個宏(macros)來關(guān)中斷和開中斷,以便避開不同C編譯器廠商選擇不同的方法來處理關(guān)中斷和開中斷。μC/OS-Ⅱ中的這兩個宏調(diào)用分別是:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。因為這兩個宏的定義取決于所用的微處理器,故在文件OS_CPU.H中可以找到相應(yīng)宏定義。每種微處理器都有自己的OS_CPU.H文件。

        3.1 任務(wù)

        一個任務(wù)通常是一個無限的循環(huán)[L3.1(2)],如程序清單3.1所示。一個任務(wù)看起來像其它C的函數(shù)一樣,有函數(shù)返回類型,有形式參數(shù)變量,但是任務(wù)是絕不會返回的。故返回參數(shù)必須定義成void[L3.1(1)]。

        程序清單L3.1任務(wù)是一個無限循環(huán)

        voidYourTask(void*pdata)(1)

        {

        for(;;){(2)

        /* 用戶代碼 */

        調(diào)用uC/OS-II的某種系統(tǒng)服務(wù):

        OSMboxPend();

        OSQPend();

        OSSemPend();

        OSTaskDel(OS_PRIO_SELF);

        OSTaskSuspend(OS_PRIO_SELF);

        OSTimeDly();

        OSTimeDlyHMSM();

        /* 用戶代碼 */

        }

        }

        不同的是,當(dāng)任務(wù)完成以后,任務(wù)可以自我刪除,如清單L3.2所示。注意任務(wù)代碼并非真的刪除了,μC/OS-Ⅱ只是簡單地不再理會這個任務(wù)了,這個任務(wù)的代碼也不會再運行,如果任務(wù)調(diào)用了OSTaskDel(),這個任務(wù)絕不會返回什么。

        程序清單 L3.2. 任務(wù)完成后自我刪除

        voidYourTask(void*pdata)

        {

        /* 用戶代碼 */

        OSTaskDel(OS_PRIO_SELF);

        }

        形式參數(shù)變量[L3.1(1)]是由用戶代碼在第一次執(zhí)行的時候帶入的。請注意,該變量的類型是一個指向void的指針。這是為了允許用戶應(yīng)用程序傳遞任何類型的數(shù)據(jù)給任務(wù)。這個指針好比一輛萬能的車子,如果需要的話,可以運載一個變量的地址,或一個結(jié)構(gòu),甚至是一個函數(shù)的地址。也可以建立許多相同的任務(wù),所有任務(wù)都使用同一個函數(shù)(或者說是同一個任務(wù)代碼程序),見第一章的例1。例如,用戶可以將四個串行口安排成每個串行口都是一個單獨的任務(wù),而每個任務(wù)的代碼實際上是相同的。并不需要將代碼復(fù)制四次,用戶可以建立一個任務(wù),向這個任務(wù)傳入一個指向某數(shù)據(jù)結(jié)構(gòu)的指針變量,這個數(shù)據(jù)結(jié)構(gòu)定義串行口的參數(shù)(波特率、I/O口地址、中斷向量號等)。

        μC/OS-Ⅱ可以管理多達64個任務(wù),但目前版本的μC/OS-Ⅱ有兩個任務(wù)已經(jīng)被系統(tǒng)占用了。作者保留了優(yōu)先級為0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRI0-2,OS_LOWEST_PRI0-1以及OS_LOWEST_PRI0這8個任務(wù)以被將來使用。OS_LOWEST_PRI0是作為定義的常數(shù)在OS_CFG.H文件中用定義常數(shù)語句#defineconstant定義的。因此用戶可以有多達56個應(yīng)用任務(wù)。必須給每個任務(wù)賦以不同的優(yōu)先級,優(yōu)先級可以從0到OS_LOWEST_PR10-2。優(yōu)先級號越低,任務(wù)的優(yōu)先級越高。μC/OS-Ⅱ總是運行進入就緒態(tài)的優(yōu)先級最高的任務(wù)。目前版本的μC/OS-Ⅱ中,任務(wù)的優(yōu)先級號就是任務(wù)編號(ID)。優(yōu)先級號(或任務(wù)的ID號)也被一些內(nèi)核服務(wù)函數(shù)調(diào)用,如改變優(yōu)先級函數(shù)OSTaskChangePrio(),以及任務(wù)刪除函數(shù)OSTaskDel()。

        為了使μC/OS-Ⅱ能管理用戶任務(wù),用戶必須在建立一個任務(wù)的時候,將任務(wù)的起始地址與其它參數(shù)一起傳給下面兩個函數(shù)中的一個:OSTastCreat或OSTaskCreatExt()。

        OSTaskCreateExt()是OSTaskCreate()的擴展,擴展了一些附加的功能。,這兩個函數(shù)的解釋見第四章,任務(wù)管理。

        3.2 任務(wù)狀態(tài)

        圖3.1是μC/OS-Ⅱ控制下的任務(wù)狀態(tài)轉(zhuǎn)換圖。在任一給定的時刻,任務(wù)的狀態(tài)一定是在這五種狀態(tài)之一。

        睡眠態(tài)(DORMANT)指任務(wù)駐留在程序空間之中,還沒有交給μC/OS-Ⅱ管理,(見程序清單L3.1或L3.2)。把任務(wù)交給μC/OS-Ⅱ是通過調(diào)用下述兩個函數(shù)之一:

        OSTaskCreate()或OSTaskCreateExt()。當(dāng)任務(wù)一旦建立,這個任務(wù)就進入就緒態(tài)準(zhǔn)備運行。任務(wù)的建立可以是在多任務(wù)運行開始之前,也可以是動態(tài)地被一個運行著的任務(wù)建立。如果一個任務(wù)是被另一個任務(wù)建立的,而這個任務(wù)的優(yōu)先級高于建立它的那個任務(wù),則這個剛剛建立的任務(wù)將立即得到CPU的控制權(quán)。一個任務(wù)可以通過調(diào)用OSTaskDel()返回到睡眠態(tài),或通過調(diào)用該函數(shù)讓另一個任務(wù)進入睡眠態(tài)。

        調(diào)用OSStart()可以啟動多任務(wù)。OSStart()函數(shù)運行進入就緒態(tài)的優(yōu)先級最高的任務(wù)。就緒的任務(wù)只有當(dāng)所有優(yōu)先級高于這個任務(wù)的任務(wù)轉(zhuǎn)為等待狀態(tài),或者是被刪除了,才能進入運行態(tài)。


        上一頁 1 2 3 4 5 6 7 8 9 下一頁

        關(guān)鍵詞:

        評論


        相關(guān)推薦

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

        關(guān)閉
        主站蜘蛛池模板: 科尔| 邻水| 泰和县| 博湖县| 汝城县| 思南县| 全州县| 高雄县| 济源市| 蕉岭县| 大化| 滦南县| 澄江县| 阿拉尔市| 无极县| 伊宁县| 横山县| 普洱| 青海省| 高淳县| 孝义市| 桃园市| 昆明市| 安陆市| 绥宁县| 高淳县| 祁连县| 高唐县| 仙居县| 平泉县| 汕头市| 武安市| 增城市| 宜川县| 淮安市| 山东省| 开平市| 梁河县| 凤翔县| 长治市| 登封市|