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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 牛人業(yè)話 > Qsys與uC/OS-II學(xué)習(xí)筆記4:任務(wù)狀態(tài)與工作機(jī)制

          Qsys與uC/OS-II學(xué)習(xí)筆記4:任務(wù)狀態(tài)與工作機(jī)制

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

            前面一個(gè)筆記我們已經(jīng)可以輕松的使用EDS提供的HAL構(gòu)建一個(gè)-II的模板工程,在這個(gè)工程里,所有和移植有關(guān)的問題都不用我們操心,我們只要放心的去設(shè)計(jì)我們的應(yīng)用程序便可。而一個(gè)最簡(jiǎn)單的-II工程也已經(jīng)呈現(xiàn)在我們面前,三個(gè)最基本的步驟就可以完成一個(gè)我們?cè)?jīng)以為多么神奇的操作系統(tǒng)。但是,雖然我們能夠構(gòu)建兩個(gè)最基本的任務(wù),但說實(shí)在話,我們還沒搞懂它到底如何工作的,依葫蘆畫瓢沒有錯(cuò),若能夠搞清楚它的工作機(jī)理就更好了。

          本文引用地址:http://www.ex-cimer.com/article/279415.htm

            先來回顧一下兩個(gè)task,如下代碼:

            /* Prints "Hello World" and sleeps for three seconds */

            void task1(void* pdata)

            {

            while (1)

            {

            printf("Hello from task1n");

            OSTimeDlyHMSM(0, 0, 3, 0);

            }

            }

            /* Prints "Hello World" and sleeps for three seconds */

            void task2(void* pdata)

            {

            while (1)

            {

            printf("Hello from task2n");

            OSTimeDlyHMSM(0, 0, 3, 0);

            }

            }

            兩個(gè)task的代碼幾乎如出一轍,他們都有自己的主循環(huán)while(1),而在while(1)里面都是先打印一串字符,然后調(diào)用-II的任務(wù)延時(shí)函數(shù)。在打印結(jié)果上看,task1和task2的打印信息是不斷的交錯(cuò)打印,沒有哪個(gè)task會(huì)連續(xù)得到打印的機(jī)會(huì),其奧秘就在于他們的任務(wù)延時(shí)是一致的。關(guān)于任務(wù)延時(shí)這里先不做文章,下篇筆記再詳細(xì)探討,這里我們只做一個(gè)和任務(wù)延時(shí)有關(guān)的小小測(cè)試,將task2的任務(wù)延時(shí)函數(shù)注釋,如下修改task2的函數(shù):

            /* Prints "Hello World" and sleeps for three seconds */

            void task2(void* pdata)

            {

            while (1)

            {

            printf("Hello from task2n");

            //OSTimeDlyHMSM(0, 0, 3, 0);

            }

            }

            重新編譯軟件工程,然后在硬件上在線運(yùn)行,此時(shí)我們看到在Console中打印的字符串信息如圖1所示。是不是很出乎我們的意料,沒錯(cuò),這個(gè)測(cè)試中我們就是要拿優(yōu)先級(jí)低的task2來說事,在沒有任務(wù)延時(shí)函數(shù)的task2中,雖然它的優(yōu)先級(jí)沒有task1高,但它卻一直占有著CPU的控制權(quán),這到底怎么回事?確實(shí)是任務(wù)延時(shí)函數(shù)在作怪,本筆記先不深入,只要大家先記?。喝蝿?wù)延時(shí)的主要作用便是先把當(dāng)前任務(wù)的CPU控制權(quán)釋放,交給其他的優(yōu)先級(jí)最高的就緒任務(wù)控制。該測(cè)試中,其實(shí)task1只是在剛啟動(dòng)系統(tǒng)的時(shí)候執(zhí)行了一次,然后它調(diào)用任務(wù)延時(shí)函數(shù)將CPU控制權(quán)交出,這一交不要緊,task2就賴著不還了,因?yàn)閠ask2在運(yùn)行過程中自始至終沒有調(diào)用任務(wù)延時(shí),所以它將一直占用著CPU,當(dāng)然了,這種狀況可不是我們希望看到的。

            

           

            圖1

            當(dāng)前兩個(gè)task,每個(gè)task通常也都要有自己的while(1),如同大多數(shù)裸奔的MCU一樣,這又是為什么?裸奔著的MCU通常都只有一個(gè)main函數(shù)中的while(1)控制著CPU的使用權(quán),CPU的寄存器也供它獨(dú)享。而uC/OS-II卻要改變這一狀況,如圖2所示,每個(gè)任務(wù)都有自己的堆棧和任務(wù)控制塊,而CPU的控制權(quán)通常是輪流著使用的,話說“風(fēng)水輪流轉(zhuǎn)”嘛,也有這么點(diǎn)味道。當(dāng)某個(gè)任務(wù)占用CPU使用權(quán)時(shí),CPU的寄存器自然也是它獨(dú)自享用,它可以將當(dāng)前堆棧里面的數(shù)據(jù)對(duì)應(yīng)搬移到CPU寄存器中執(zhí)行,而其他的任務(wù)無論在此之前處于何種狀態(tài),都要把他們的數(shù)據(jù)存儲(chǔ)中他們自家的堆棧中;一旦當(dāng)前任務(wù)完成工作或者因?yàn)槟撤N系統(tǒng)允許的任務(wù)切換情況出現(xiàn),那么它就得乖乖的交出CPU使用權(quán),把CPU寄存器中的當(dāng)前數(shù)據(jù)搬回到自己的堆棧中。到底何時(shí)切換任務(wù),何時(shí)搶占任務(wù),這都由每個(gè)任務(wù)自己的任務(wù)控制塊把持著,他們不會(huì)越權(quán)搶占別人的CPU控制權(quán),當(dāng)然也不會(huì)允許他人隨意的搶走屬于自己的CPU控制權(quán)。uC/OS-II內(nèi)部的任務(wù)切換說白了就是CPU控制權(quán)的切換以及相應(yīng)的入棧出棧操作,但是這其中涉及到的諸如任務(wù)優(yōu)先權(quán)的輪換或者說任務(wù)仲裁等問題的處理機(jī)制就是非常體現(xiàn)功力的地方,后續(xù)有機(jī)會(huì)也要好好探討下這方面的議題。

            

           

            圖2

            前面我們談到任務(wù)的切換,在同一時(shí)刻不同的任務(wù)都處于不同的狀態(tài),運(yùn)行著的任務(wù)肯定只有一個(gè),那么其他任務(wù)的狀態(tài)都如何?如圖3所示,uC/OS-II把任務(wù)的狀態(tài)劃分為5種:即睡眠態(tài)任務(wù)、就緒態(tài)任務(wù)、運(yùn)行態(tài)任務(wù)、被中斷態(tài)任務(wù)和等待狀態(tài)任務(wù)。這里我們先簡(jiǎn)單的將這5種狀態(tài)羅列,并沒有將他們之間的轉(zhuǎn)換關(guān)系示意處理,但各個(gè)不同狀態(tài)之間的變化也都是通過一定的事件觸發(fā)或者函數(shù)調(diào)用引起的。

            

           

            圖3

            作者原著的《嵌入式實(shí)時(shí)操作系統(tǒng)uC/OS-II》一書中對(duì)這5種狀態(tài)有如下描述:就緒態(tài)意味著任務(wù)已經(jīng)準(zhǔn)備好,可以運(yùn)行,但由于該任務(wù)的優(yōu)先級(jí)比正在運(yùn)行的任務(wù)優(yōu)先級(jí)低,還暫時(shí)不能運(yùn)行;運(yùn)行態(tài)是指任務(wù)掌握了CPU的使用權(quán),正在運(yùn)行;掛起態(tài)也稱作等待狀態(tài)任務(wù),指任務(wù)在等待某一事件的發(fā)生(例如等待某外設(shè)I/O操作,等待某共享資源由暫不能使用變成能使用狀態(tài),等待定時(shí)脈沖的到來,或等待超時(shí)信號(hào)的到來以結(jié)束目前的等待,等等);發(fā)生中斷時(shí),CPU提供相應(yīng)的中斷服務(wù),原來正在運(yùn)行的任務(wù)暫不能運(yùn)行,就進(jìn)入了被中斷任務(wù)。

            就拿我們前面列舉的實(shí)例來講,當(dāng)task1運(yùn)行時(shí),它處于運(yùn)行態(tài),task2就處于就緒態(tài)。而其他幾種狀態(tài)我們暫時(shí)還沒有接觸,后面遇到了再逐一談?wù)摗?/p>



          關(guān)鍵詞: Qsys uC/OS

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