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

發(fā)布時(shí)間:2016-1-28 09:58    發(fā)布者:designapp
關(guān)鍵詞: Qsys
  前面一個(gè)筆記我們已經(jīng)可以輕松的使用EDS提供的HAL構建一個(gè)uC/OS-II的模板工程,在這個(gè)工程里,所有和移植有關(guān)的問(wèn)題都不用我們操心,我們只要放心的去設計我們的應用程序便可。而一個(gè)最簡(jiǎn)單的uC/OS-II工程也已經(jīng)呈現在我們面前,三個(gè)最基本的步驟就可以完成一個(gè)我們曾經(jīng)以為多么神奇的操作系統。但是,雖然我們能夠構建兩個(gè)最基本的任務(wù),但說(shuō)實(shí)在話(huà),我們還沒(méi)搞懂它到底如何工作的,依葫蘆畫(huà)瓢沒(méi)有錯,若能夠搞清楚它的工作機理就更好了。
  先來(lái)回顧一下兩個(gè)task,如下代碼:
  /* Prints "Hello World" and sleeps for three seconds */
  void task1(void* pdata)
  {
  while (1)
  {
  printf("Hello from task1\n");
  OSTimeDlyHMSM(0, 0, 3, 0);
  }
  }
  /* Prints "Hello World" and sleeps for three seconds */
  void task2(void* pdata)
  {
  while (1)
  {
  printf("Hello from task2\n");
  OSTimeDlyHMSM(0, 0, 3, 0);
  }
  }
  兩個(gè)task的代碼幾乎如出一轍,他們都有自己的主循環(huán)while(1),而在while(1)里面都是先打印一串字符,然后調用uC/OS-II的任務(wù)延時(shí)函數。在打印結果上看,task1和task2的打印信息是不斷的交錯打印,沒(méi)有哪個(gè)task會(huì )連續得到打印的機會(huì ),其奧秘就在于他們的任務(wù)延時(shí)是一致的。關(guān)于任務(wù)延時(shí)這里先不做文章,下篇筆記再詳細探討,這里我們只做一個(gè)和任務(wù)延時(shí)有關(guān)的小小測試,將task2的任務(wù)延時(shí)函數注釋?zhuān)缦滦薷膖ask2的函數:
  /* Prints "Hello World" and sleeps for three seconds */
  void task2(void* pdata)
  {
  while (1)
  {
  printf("Hello from task2\n");
  //OSTimeDlyHMSM(0, 0, 3, 0);
  }
  }
  重新編譯軟件工程,然后在硬件上在線(xiàn)運行,此時(shí)我們看到在Console中打印的字符串信息如圖1所示。是不是很出乎我們的意料,沒(méi)錯,這個(gè)測試中我們就是要拿優(yōu)先級低的task2來(lái)說(shuō)事,在沒(méi)有任務(wù)延時(shí)函數的task2中,雖然它的優(yōu)先級沒(méi)有task1高,但它卻一直占有著(zhù)CPU的控制權,這到底怎么回事?確實(shí)是任務(wù)延時(shí)函數在作怪,本筆記先不深入,只要大家先記。喝蝿(wù)延時(shí)的主要作用便是先把當前任務(wù)的CPU控制權釋放,交給其他的優(yōu)先級最高的就緒任務(wù)控制。該測試中,其實(shí)task1只是在剛啟動(dòng)系統的時(shí)候執行了一次,然后它調用任務(wù)延時(shí)函數將CPU控制權交出,這一交不要緊,task2就賴(lài)著(zhù)不還了,因為task2在運行過(guò)程中自始至終沒(méi)有調用任務(wù)延時(shí),所以它將一直占用著(zhù)CPU,當然了,這種狀況可不是我們希望看到的。
  


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


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


  圖3
  作者原著(zhù)的《嵌入式實(shí)時(shí)操作系統uC/OS-II》一書(shū)中對這5種狀態(tài)有如下描述:就緒態(tài)意味著(zhù)任務(wù)已經(jīng)準備好,可以運行,但由于該任務(wù)的優(yōu)先級比正在運行的任務(wù)優(yōu)先級低,還暫時(shí)不能運行;運行態(tài)是指任務(wù)掌握了CPU的使用權,正在運行;掛起態(tài)也稱(chēng)作等待狀態(tài)任務(wù),指任務(wù)在等待某一事件的發(fā)生(例如等待某外設I/O操作,等待某共享資源由暫不能使用變成能使用狀態(tài),等待定時(shí)脈沖的到來(lái),或等待超時(shí)信號的到來(lái)以結束目前的等待,等等);發(fā)生中斷時(shí),CPU提供相應的中斷服務(wù),原來(lái)正在運行的任務(wù)暫不能運行,就進(jìn)入了被中斷任務(wù)。
  就拿我們前面列舉的實(shí)例來(lái)講,當task1運行時(shí),它處于運行態(tài),task2就處于就緒態(tài)。而其他幾種狀態(tài)我們暫時(shí)還沒(méi)有接觸,后面遇到了再逐一談?wù)摗?br />                                
                                                               
                               
               
本文地址:http://selenalain.com/thread-160447-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页