專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

Ucos-2學(xué)習(xí)筆記

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年04月25日   【字體:
現(xiàn)在公司做項(xiàng)目用的是ucos系統(tǒng),之前都在裸奔,現(xiàn)在從零開(kāi)始,想把學(xué)習(xí)筆錄記錄下來(lái)。以供日后翻閱。眼前有本書(shū)是邵貝貝的,可是一看就有點(diǎn)頭大,還是從零開(kāi)始吧!

 

為什么要用操作系統(tǒng)?

裸奔程序是由先后順序的,比如執(zhí)行程序a時(shí),程序B在等待,等a執(zhí)行完后才允許B執(zhí)行。而在操作系統(tǒng)上我們可以理解為多個(gè)任務(wù)都在執(zhí)行,兩個(gè)人物之間可以通過(guò)操作系統(tǒng)來(lái)協(xié)調(diào),當(dāng)優(yōu)先級(jí)高的緊急任務(wù)可以搶占內(nèi)核優(yōu)先執(zhí)行任務(wù)。Ucos2適用于小系統(tǒng)小規(guī)模的項(xiàng)目,可以提高執(zhí)行效率。嚴(yán)格地說(shuō),uc/OS-II只是一個(gè)實(shí)時(shí)操作系統(tǒng)內(nèi)核

它僅僅包含了任 務(wù) 調(diào)度、任務(wù)管理、時(shí)間管理、內(nèi)存管理和任務(wù)間的通信和同步等基本功能,沒(méi)有提供輸入輸出管理、文件系統(tǒng)、網(wǎng)絡(luò)等額外的服務(wù),我想后者可能是區(qū)別于linux的區(qū)別吧。但由于uc/OS-II良好的可擴(kuò)展性和源碼開(kāi)放,這些非必需的功能完全可以由用戶自己根據(jù)需要分別實(shí)現(xiàn)。

幾個(gè)概念

什么是搶占式任務(wù)?

簡(jiǎn)單地說(shuō)就是誰(shuí)的優(yōu)先級(jí)高誰(shuí)就可以搶占內(nèi)核或者空間來(lái)執(zhí)行優(yōu)先級(jí)高的任務(wù)。

或者這么說(shuō),高優(yōu)先級(jí)任務(wù)可以在某些時(shí)刻搶占了正在CPU上運(yùn)行的低優(yōu)先級(jí)任務(wù)的CPU執(zhí)行權(quán)限。根據(jù)搶占時(shí)機(jī)又可以分為用戶空間搶占和內(nèi)核搶占。

什么是任務(wù)調(diào)度機(jī)制?

首先要?jiǎng)?chuàng)建任務(wù),創(chuàng)建任務(wù)的數(shù)目有限制,56個(gè)以內(nèi),創(chuàng)建任務(wù)也有優(yōu)先級(jí),優(yōu)先級(jí)別為0時(shí),優(yōu)先級(jí)最高。系統(tǒng)初始化完畢后,外設(shè)驅(qū)動(dòng)初始化完畢后,建立任務(wù),任務(wù)中含有一些參數(shù),包括返回值,優(yōu)先級(jí)別,堆棧大小等,然后開(kāi)始任務(wù)調(diào)度,也就是程序運(yùn)行。

Ucos2的運(yùn)行步驟?(工作原理)

首先進(jìn)行操作系統(tǒng)初始化,主要完成任務(wù)控制塊(tcb)初始化,然后開(kāi)始創(chuàng)建新任務(wù)、初始化任務(wù)堆棧區(qū),最后調(diào)用OSSTART()函數(shù),開(kāi)始任務(wù)調(diào)度。主函數(shù)如下:

 

int main(void) 

    INT8U ret 0; 

    BspInit();      //外設(shè)功能初始化

RestoreConfigData();

OSInit();       //uCOS-II系統(tǒng)初始化 

 

  

    ret OSTaskCreate(      Start_Task, //初始化任務(wù)

                               (void*)0, //無(wú)參數(shù)

    &Start_TaskStk[APP_TASK_STK_SIZE-1], //任務(wù)堆棧大小為128*4Byte

                       PRIO_START_TASK); //優(yōu)先級(jí)最高2

 

    if (ret != OS_ERR_NONE)

    {

        DebugOut(0, "Start_Task 任務(wù)建立失敗error %d\r\n", ret);

    }

 

OSStart();      //開(kāi)始任務(wù)調(diào)度

 

return 0; 

}

在多任務(wù)調(diào)度開(kāi)始后,啟動(dòng)時(shí)鐘源開(kāi)始計(jì)數(shù),時(shí)鐘的中斷信號(hào),延時(shí),超時(shí)都是由此產(chǎn)生。  

當(dāng)時(shí)鐘中斷來(lái)臨時(shí),系統(tǒng)把當(dāng)前正在執(zhí)行的任務(wù)掛起,保護(hù)現(xiàn)場(chǎng),進(jìn)行中斷處理,判斷有無(wú)任務(wù)延時(shí)到期。若有,則使該任務(wù)進(jìn)入就緒態(tài),并對(duì)所有進(jìn)入就緒態(tài)的任務(wù)的優(yōu)先級(jí)進(jìn)行比較,通過(guò)任務(wù)切換去執(zhí)行最高優(yōu)先級(jí)的任務(wù)。若沒(méi)有別的任務(wù)進(jìn)入就緒態(tài),則恢復(fù)現(xiàn)場(chǎng)繼續(xù)執(zhí)行原任務(wù)。另一種調(diào)度方式是任務(wù)級(jí)的調(diào)度,即通過(guò)發(fā)軟中斷命令或依靠處理器在任務(wù)執(zhí)行中調(diào)度。如任務(wù)要等待信號(hào)量或一個(gè)正在執(zhí)行的任務(wù)被掛起時(shí),就需要在此任務(wù)中調(diào)度,找出目前處于就緒態(tài)的優(yōu)先級(jí)最高的任務(wù)去執(zhí)行。當(dāng)沒(méi)有任何任務(wù)進(jìn)入就緒態(tài)時(shí),就去執(zhí)行空任務(wù)。

如圖

 


參考資料

http://wenku.baidu.com/view/948dad0303d8ce2f00662300.html 

關(guān)閉窗口

相關(guān)文章