<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 利用Protothread實(shí)現實(shí)時(shí)多任務(wù)系統

利用Protothread實(shí)現實(shí)時(shí)多任務(wù)系統

作者::長(cháng)沙威勝儀表集團 羅光平 湖南大學(xué) 郭衛鋒 時(shí)間:2008-07-09 來(lái)源:?jiǎn)纹瑱C與嵌入式系統應用 收藏

  程序框架一般類(lèi)似于程序1所示結構:系統中有3個(gè)任務(wù)——TaskA、TaskB、TaskC,均放置于主循環(huán)內,在每一個(gè)循環(huán)周期內都被執行一次。在這種結構中,能滿(mǎn)足系統實(shí)時(shí)性要求的條件是: (當且僅當)TaskA 、TaskB、TaskC三個(gè)任務(wù)的運行時(shí)間之和要小于系統實(shí)時(shí)響應的時(shí)間要求。在系統較為簡(jiǎn)單、任務(wù)運行時(shí)間能滿(mǎn)足實(shí)時(shí)要求的情況下,可以采用這種最簡(jiǎn)單、最直接的順序執行方式。但是更多的情形是,系統不僅要對一些事件做出實(shí)時(shí)響應,并且還要承擔很多其他的非實(shí)時(shí)任務(wù),并且這些非實(shí)時(shí)任務(wù)的運行時(shí)間要遠遠超出了實(shí)時(shí)響應時(shí)間的要求。傳統的這種程序結構顯然不能滿(mǎn)足系統的實(shí)時(shí)性要求。通常的解決方案是,引入實(shí)時(shí),由進(jìn)行任務(wù)的調度,優(yōu)先執行實(shí)時(shí)任務(wù),達到滿(mǎn)足系統實(shí)時(shí)性的要求。

本文引用地址:http://dyxdggzs.com/article/85487.htm

  程序1程序框架

  一般來(lái)說(shuō),在系統開(kāi)發(fā)中引入實(shí)時(shí)有諸多優(yōu)點(diǎn):

  更好地支持多任務(wù),實(shí)時(shí)性要求能夠得以保障;
  程序開(kāi)發(fā)更加容易,也更便于維護;
  有利于提高系統的穩定性和可靠性。但是,操作系統的引入也將帶來(lái)較多的系統開(kāi)銷(xiāo):
  實(shí)時(shí)操作系統往往使用定時(shí)器中斷來(lái)切換任務(wù),需要消耗不少的CPU處理時(shí)間;
  實(shí)時(shí)操作系統在切換任務(wù)時(shí)需要保護當前任務(wù)的執行現場(chǎng),這就需要為每個(gè)任務(wù)準備足夠多的RAM空間來(lái)實(shí)現任務(wù)切換;
  實(shí)時(shí)操作系統的本身也需要占用相當數量的Flash空間和RAM空間。

  如果這些系統開(kāi)銷(xiāo)都在可承受的范圍內,那么采用實(shí)時(shí)操作系統將是最佳的選擇。但是在很多應用的場(chǎng)合,特別是系統的資源非常緊張的單片機應用,實(shí)時(shí)操作系統帶來(lái)的系統開(kāi)銷(xiāo)往往是不可接受的。而更換速度更快、RAM更大、Flash更多的CPU意味著(zhù)成本的增加,且會(huì )降低產(chǎn)品的競爭力。當系統中的任務(wù)不須進(jìn)行非常復雜的優(yōu)先級調度,而且其任務(wù)也相對簡(jiǎn)單時(shí),引入實(shí)時(shí)操作系統似有殺雞用牛刀之嫌。

  1 的特點(diǎn)

  是專(zhuān)為資源有限的系統設計的一種耗費資源特別少并且不使用堆棧的線(xiàn)程模型,其特點(diǎn)是:

  以純C語(yǔ)言實(shí)現,無(wú)硬件依賴(lài)性;
  極少的資源需求,每個(gè)僅需要2個(gè)額外的字節;
  可以用于有操作系統或無(wú)操作系統的場(chǎng)合;
  支持阻塞操作且沒(méi)有棧的切換。

  使用Protothread實(shí)現多任務(wù)的最主要的好處在于它的輕量級。每個(gè)Protothread不需要擁有自已的堆棧,所有的Protothread共享同一個(gè)堆??臻g,這一點(diǎn)對于RAM資源有限的系統尤為有利。相對于操作系統下的多任務(wù)而言,每個(gè)任務(wù)都有自已的堆??臻g,這將消耗大量的RAM資源,而每個(gè)Protothread僅使用一個(gè)整型值保存當前狀態(tài)。

  2 Protothread的阻塞運行機制

  以下是一個(gè)典型的Protothread程序示例:

  程序2Protothread程序示例

  這是一個(gè)非常簡(jiǎn)單的無(wú)線(xiàn)通信的狀態(tài)切換程序①,展開(kāi)Protothread的宏定義,便可以得到程序3所示的展開(kāi)代碼:

  程序3Protothread宏展開(kāi)代碼

  當Protothread程序運行到PT_WAIT_UNTIL時(shí),判斷其運行條件是否滿(mǎn)足,若不滿(mǎn)足,則阻塞。通過(guò)比對程序2和程序3的程序代碼可以得知,Protothread的阻塞其實(shí)質(zhì)就是函數返回,只不過(guò)在返回前保存了當前的阻塞位置,待下一次Protothread被調用時(shí),直接跳到阻塞位置執行,再次判斷運行條件是否滿(mǎn)足,并執行后續程序或繼續阻塞。

  3 利用Protothread構造實(shí)時(shí)

  與操作系統下的多任務(wù)不同,操作系統下的每個(gè)任務(wù)可在任意時(shí)刻被打斷并阻塞,Protothread僅能在程序員指定位置阻塞。用Protothread實(shí)現實(shí)時(shí)多任務(wù),正是利用了Protothread在指定位置阻塞的特點(diǎn),讓出執行權限給更高優(yōu)先級的任務(wù)先運行。

  下面舉例說(shuō)明如何利用Protothread構造實(shí)時(shí)。

  系統要求:

  TaskA實(shí)時(shí)任務(wù),30 ms內響應,運行時(shí)間<20 ms;

  TaskB實(shí)時(shí)任務(wù),200 ms內響應,運行時(shí)間<40 ms;

  TaskC非實(shí)時(shí)任務(wù),響應時(shí)間無(wú)要求,運行時(shí)間>30 ms。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>