<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)

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

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

          本文引用地址:http://www.ex-cimer.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-Ⅱ?yàn)榱颂幚砼R界段代碼需要關(guān)中斷,處理完畢后再開中斷。這使得μC/OS-Ⅱ能夠避免同時有其它任務(wù)或中斷服務(wù)進(jìn)入臨界段代碼。關(guān)中斷的時間是實(shí)時內(nèi)核開發(fā)商應(yīng)提供的最重要的指標(biāo)之一,因?yàn)檫@個指標(biāo)影響用戶系統(tǒng)對實(shí)時事件的響應(yīng)性。μC/OS-Ⅱ努力使關(guān)中斷時間降至最短,但就使用μC/OS-Ⅱ而言,關(guān)中斷的時間很大程度上取決于微處理器的架構(gòu)以及編譯器所生成的代碼質(zhì)量。

          微處理器一般都有關(guān)中斷/開中斷指令,用戶使用的C語言編譯器必須有某種機(jī)制能夠在C中直接實(shí)現(xiàn)關(guān)中斷/開中斷地操作。某些C編譯器允許在用戶的C源代碼中插入?yún)R編語言的語句。這使得插入微處理器指令來關(guān)中斷/開中斷很容易實(shí)現(xiàn)。而有的編譯器把從C語言中關(guān)中斷/開中斷放在語言的擴(kuò)展部分。μC/OS-Ⅱ定義兩個宏(macros)來關(guān)中斷和開中斷,以便避開不同C編譯器廠商選擇不同的方法來處理關(guān)中斷和開中斷。μC/OS-Ⅱ中的這兩個宏調(diào)用分別是:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。因?yàn)檫@兩個宏的定義取決于所用的微處理器,故在文件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ù)的代碼也不會再運(yùn)行,如果任務(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ù)。這個指針好比一輛萬能的車子,如果需要的話,可以運(yùn)載一個變量的地址,或一個結(jié)構(gòu),甚至是一個函數(shù)的地址。也可以建立許多相同的任務(wù),所有任務(wù)都使用同一個函數(shù)(或者說是同一個任務(wù)代碼程序),見第一章的例1。例如,用戶可以將四個串行口安排成每個串行口都是一個單獨(dú)的任務(wù),而每個任務(wù)的代碼實(shí)際上是相同的。并不需要將代碼復(fù)制四次,用戶可以建立一個任務(wù),向這個任務(wù)傳入一個指向某數(shù)據(jù)結(jié)構(gòu)的指針變量,這個數(shù)據(jù)結(jié)構(gòu)定義串行口的參數(shù)(波特率、I/O口地址、中斷向量號等)。

          μC/OS-Ⅱ可以管理多達(dá)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定義的。因此用戶可以有多達(dá)56個應(yīng)用任務(wù)。必須給每個任務(wù)賦以不同的優(yōu)先級,優(yōu)先級可以從0到OS_LOWEST_PR10-2。優(yōu)先級號越低,任務(wù)的優(yōu)先級越高。μC/OS-Ⅱ總是運(yùn)行進(jìn)入就緒態(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()的擴(kuò)展,擴(kuò)展了一些附加的功能。,這兩個函數(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ù)就進(jìn)入就緒態(tài)準(zhǔn)備運(yùn)行。任務(wù)的建立可以是在多任務(wù)運(yùn)行開始之前,也可以是動態(tài)地被一個運(yùn)行著的任務(wù)建立。如果一個任務(wù)是被另一個任務(wù)建立的,而這個任務(wù)的優(yōu)先級高于建立它的那個任務(wù),則這個剛剛建立的任務(wù)將立即得到CPU的控制權(quán)。一個任務(wù)可以通過調(diào)用OSTaskDel()返回到睡眠態(tài),或通過調(diào)用該函數(shù)讓另一個任務(wù)進(jìn)入睡眠態(tài)。

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


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

          關(guān)鍵詞:

          評論


          相關(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); })();