国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

Qsys與uC/OS-II學習筆記4:任務狀態與工作機制

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


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


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


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

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

廠商推薦

  • Microchip視頻專區
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿澤電子(Mouser)專區
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 最新91网址| 欧美中文字幕一区二区三区| 国产在线午夜| 色噜噜狠狠色综合欧洲| 亚洲国产精品成人精品软件| 欧美在线不卡视频| 新版天堂中文资源8在线| 天天操天天干天天舔| 97视频免费观看| 青青青手机视频| 色综久久| 日本一二三区在线视频| 一二三四在线观看免费高清网| 在线播放日本爽快片| 黑丝制服影院| 色综合久久88中文字幕| 奇米色婷婷| 性荡视频在线播放视频| 一个人在线观看片免费完整中文版 | 高清午夜福利电影在线| 亚洲大片在线观看| 四虎影院国产精品| 亚洲国产天堂久久综合226| 伊伊成人网| 欧美freesex黑人又粗又| 欧美精品v日韩精品v国产精品| 日本五级床片全部免费放| 天天晚上开着日| 高跟丝袜岳第一次| 伊人久久精品午夜| 一级毛片短视频| 中日韩视频在线看免费观看| 97人妻碰视频在线观看| 我们中文在线观看免费完整版| 亚洲狠狠婷婷综合久久蜜桃| 色好看在线视频播放| 亚洲乱欲| 国产剧情在线精品视频不卡| 中文在线观看免费网站| 日本免费观看的视频在线| 亚洲视频在线观看免费|