白曉慧
【摘 要】比較了基于VxWorks操作系統的多種延時方法,編寫了基于系統時鐘定時器的延時方法的中斷服務程序。該方法精確,可靠。已在工程實踐中,證實了該方法的有效性以及精確性。
【關鍵詞】VxWorks操作系統;延時方法;中斷服務程序
0 引言
VxWorks操作系統是運行在目標機上的高性能、可裁剪的嵌入式實時多任務操作系統,其良好的可靠性和卓越的實時性被廣泛地應用在通信、軍事、航空、航天、航海等高精尖技術及實時性要求極高的領域中。
在實際的工程應用中,周期任務,需要有最大的延遲或稱為等待時間。這類任務一般會為BIT檢測任務,鏈路檢測任務,點跡查詢任務等。這段等待時間,在VxWorks操作系統中,可以通過多種延時方法實現。
1 taskDelay法
1.1 原理
taskDelay()是最簡單的延時方法。延時操作提供了一個簡單的任務休眠機制。當一個任務調用taskDelay()后,它將主動放棄CPU一段時間,進入Delay狀態。超時后,這個任務會排到Ready隊列中同優先級隊列的隊尾等待執行。它的單位是tick,tick是VxWorks下的時鐘中斷頻率,可以通過sysClkRateSet()設置,一般在60-100之間。在體系架構、CPU頻率等硬件條件允許的范圍內,這個值可以隨意設置。不過,設置的時候要根據實際需要,而不是每個時間片的間隔越短越好。時間片的數量影響著內核每秒鐘調度的次數,而每次內核調度都需要消耗一定的CPU資源。如果每秒產生的時間片數量過大,內核調度所消耗的CPU資源就會過多,從而影響整機效率。在實際工程中,一般選取每秒tick數為100。可以通過調用taskDelay(0),將CPU交給同等優先級的任務。由于其延時的基本單位為tick,因此,最小延時單位為10ms,延時精度不高。
一般來說,當該任務通過taskDelay()進入睡眠狀態時,若這段時間內被高優先級的任務占有資源時,則一直得等高優先級的任務放棄資源時,這個任務才會獲得資源。
因此,taskDelay()延時很方便,卻需要有一定的風險。實際的延時時間為預設延時時間與排隊等候時間之和,這樣將會導致延時不準確,也對任務的調度安排提出了一個挑戰。這樣看來,時間片延時并不是很準確,其準確程度需要根據任務調度的狀況來決定。如果沒有任務占用CPU,等待的誤差不超過一個時間片的時間長短;如果有高優先級或同優先級的任務不釋放CPU資源,那么等待將直到任務獲取CPU資源才能結束。
1.2 具體實現
STATUS taskDelay(int ticks)
2 看門狗法
2.1 原理
實時系統任務的執行一般都有時限的約束。VxWorks提供了一種看門狗定時器機制,允許用戶編寫的函數與一個特定的時延相聯系。這個時延,也是以tick來計量的。任何一個任務都可以創建Watchdog Timer并指定定時器超時后執行的例程。這個例程是在系統時鐘ISR的上下文中執行,因此它具有與中斷一樣的優先級。Watchdog Timer并非一個周期性的定時器,在超時停止或是中途放棄計時之后,將一直處于靜止狀態。這一點與系統時鐘不同。
看門狗定時器超時之后,指定的函數在中斷級執行。可以模仿VxWorks中對異常處理的方法,采用分步處理的方法:在Watchdog Timer的ISR中所作的知識發送signal,或是釋放信號量等一些簡單的操作,而創建專用的task等待接收這類信號,依據信號的指示再去執行相應的復雜處理。這樣既不會影響系統的實時性,也可以滿足用戶多樣的需求。
這種計時方法可以提供比較精確的計時,其原因在于定時時間一到,所安排的任務會以中斷級別或更高任務優先級執行。作為代價,看門狗定時器比taskDelay()消耗了更多的系統資源,包括存儲空間和處理器時間。事實上,整個處理的過程可能還會增加中斷處理時間。
2.2 具體實現
需要創建看門狗,并啟動。所需函數如下:
int wdCreate()
STATUS wdStart(WDOG_ID wdId, int delay, FUNCPTR pRoutine, int parameter)
3 系統時鐘定時器法
3.1 原理
定時器機制的實現是建立在時鐘基礎上的。VxWorks為支持精確實時控制,利用不同的硬件定時器提供了系統時鐘和系統輔助時鐘。由于這兩個時鐘都以周期時鐘形式運行,因此相關的硬件定時器的運行方式也是周期形式。每經過一個固定的時間間隔,硬件定時器的ISR將通知VxWorks內核。系統時鐘的周期稱為tick,定時的時長只能是tick的整數倍。由于系統時鐘,處理系統級任務,因而時鐘頻率一般不能很高。但是可以設置系統輔助時鐘的tick數,使其達到精確地定時。
硬件中斷處理是實時系統設計的最重要、最關鍵的問題。由于中斷通常對應著外部事件,系統通過中斷與外部事件交互。為了獲得盡可能快的中斷響應事件,VxWorks的中斷處理程序運行在特定的上下文中。因此,中斷處理不會涉及任務任務上下文的交換。
應用程序可以使用VxWorks未用的硬件中斷。VxWorks提供函數intConnect(),它允許指定的C函數與任意中斷相聯系。intConnect()函數原型是:
STATUS intConnect
(VOIDFUNCPTR *vector, VOIDFUNCPTR routine, int parameter)
只要在工程中定義了INCLUDE_SYSCLK_INT,系統就會自動完成對系統時鐘的初始化,也就是在文件usrConfig.c中的usrRoot()函數中實現。考慮到需要根據實際工程中的需求,需要對不同的周期任務設定不同的定時器,因而選擇自己對系統時鐘進行初始化。本文中設置了10個定時器,分別為定時10ms,20ms,50ms,100ms,200ms,500ms,1s,2s,5s,10s。
3.2 具體實現
bool timeInital()
初始化時,首先應該關中斷;其次,調用sysClkConnect()掛接時間中斷服務程序;然后再通過調用sysClkRateSet()來設置系統時鐘每秒中斷的次數;最后再通過調用sysClkEnable()使能對系統時鐘中斷的響應。
中斷服務程序中,需要首先調用tickAnnounce(),來通知內核一個tick事件。本項目工程的中斷服務程序完成的操作包括:(1)獲取并保存系統時鐘ISR要調用的例程;(2)關聯系統時鐘ISR;(3)對中斷次數計數;(4)更新定時器使能標志。
需要說明的是,需要定義定時器的結構。若定義多個定時器,則定時器的結構中需包含編號,定時器的時間間隔數,定時器的時間毫秒數和定時標志。定時標志就是定時時刻到為true,否則為false。若定時時刻到,會通知另一個標志,并重新將定期器定時標志置為false。
4 小結
本文結合工程實踐,比較了基于VxWorks操作系統下的多種延時方法。硬件方面,時鐘芯片會在確定的時間內為系統產生一個中斷。軟件方面,中斷響應的過程也就是計時的過程,不過系統不會為每一次中斷都進行處理,而是經過一定計數之后才會產生一個時間片。計時控制的目的就是在一段時間之后開始特定的工作。taskDelay是延時結束后將任務置于就緒隊列等候調度,直至CPU資源可用時執行被延遲的任務。看門狗法和系統時鐘定時器法是基于硬件時鐘的, 因而可靠性高。對系統時鐘定時器的中斷服務程序進行了修改,達到了定時的目的。
【參考文獻】
[1]Vxworks Programmer Guide, WindRiver[Z]. 1999.
[2]羅國慶.Vxworks與嵌入式軟件開發[M].機械工業出版社,2003,9.
[3]孔祥營,柏桂枝.嵌入式實時操作系統Vxworks及其開發環境Tornado[Z]. 2002, 1.
[責任編輯:楊玉潔]