利用Protothread實現實時多任務系統
嵌入式程序框架一般類似于程序1所示結構:系統中有3個任務——TaskA、TaskB、TaskC,均放置于主循環內,在每一個循環周期內都被執行一次。在這種結構中,能滿足系統實時性要求的條件是: (當且僅當)TaskA 、TaskB、TaskC三個任務的運行時間之和要小于系統實時響應的時間要求。在系統較為簡單、任務運行時間能滿足實時要求的情況下,可以采用這種最簡單、最直接的順序執行方式。但是更多的情形是,系統不僅要對一些事件做出實時響應,并且還要承擔很多其他的非實時任務,并且這些非實時任務的運行時間要遠遠超出了實時響應時間的要求。傳統的這種程序結構顯然不能滿足系統的實時性要求。通常的解決方案是,引入實時操作系統,由操作系統進行任務的調度,優先執行實時任務,達到滿足系統實時性的要求。
本文引用地址:http://www.j9360.com/article/85487.htm程序1嵌入式程序框架
更好地支持多任務,實時性要求能夠得以保障;
程序開發更加容易,也更便于維護;
有利于提高系統的穩定性和可靠性。但是,操作系統的引入也將帶來較多的系統開銷:
實時操作系統往往使用定時器中斷來切換任務,需要消耗不少的CPU處理時間;
實時操作系統在切換任務時需要保護當前任務的執行現場,這就需要為每個任務準備足夠多的RAM空間來實現任務切換;
實時操作系統的本身也需要占用相當數量的Flash空間和RAM空間。
如果這些系統開銷都在可承受的范圍內,那么采用實時操作系統將是最佳的選擇。但是在很多應用的場合,特別是系統的資源非常緊張的單片機應用,實時操作系統帶來的系統開銷往往是不可接受的。而更換速度更快、RAM更大、Flash更多的CPU意味著成本的增加,且會降低產品的競爭力。當系統中的任務不須進行非常復雜的優先級調度,而且其任務也相對簡單時,引入實時操作系統似有殺雞用牛刀之嫌。
1 Protothread的特點
Protothread是專為資源有限的系統設計的一種耗費資源特別少并且不使用堆棧的線程模型,其特點是:
以純C語言實現,無硬件依賴性;
極少的資源需求,每個Protothread僅需要2個額外的字節;
可以用于有操作系統或無操作系統的場合;
支持阻塞操作且沒有棧的切換。
使用Protothread實現多任務的最主要的好處在于它的輕量級。每個Protothread不需要擁有自已的堆棧,所有的Protothread共享同一個堆棧空間,這一點對于RAM資源有限的系統尤為有利。相對于操作系統下的多任務而言,每個任務都有自已的堆棧空間,這將消耗大量的RAM資源,而每個Protothread僅使用一個整型值保存當前狀態。
2 Protothread的阻塞運行機制
以下是一個典型的Protothread程序示例:
程序2Protothread程序示例
這是一個非常簡單的無線通信的狀態切換程序①,展開Protothread的宏定義,便可以得到程序3所示的展開代碼:
程序3Protothread宏展開代碼
當Protothread程序運行到PT_WAIT_UNTIL時,判斷其運行條件是否滿足,若不滿足,則阻塞。通過比對程序2和程序3的程序代碼可以得知,Protothread的阻塞其實質就是函數返回,只不過在返回前保存了當前的阻塞位置,待下一次Protothread被調用時,直接跳到阻塞位置執行,再次判斷運行條件是否滿足,并執行后續程序或繼續阻塞。
3 利用Protothread構造實時多任務系統
與操作系統下的多任務不同,操作系統下的每個任務可在任意時刻被打斷并阻塞,Protothread僅能在程序員指定位置阻塞。用Protothread實現實時多任務,正是利用了Protothread在指定位置阻塞的特點,讓出執行權限給更高優先級的任務先運行。
下面舉例說明如何利用Protothread構造實時多任務系統。
系統要求:
TaskA實時任務,30 ms內響應,運行時間<20 ms;
TaskB實時任務,200 ms內響應,運行時間<40 ms;
TaskC非實時任務,響應時間無要求,運行時間>30 ms。
linux操作系統文章專題:linux操作系統詳解(linux不再難懂)
評論