引言
嵌入式實時作業系統(RTOS,Real Time Operating System)為嵌入式應用的開發者提供了系統級的支撐環境,極大地簡化了嵌入式軟體系統的設計過程,成為作業系統中一個非常重要的分支。随着RTOS在嵌入式系統中的大量應用,RTOS的選擇與評價成為了一個重要的問題。一個RTOS的評價要從很多角度進行,如體系結構、API的豐富程度、網絡支援、可靠性等。其中,實時性是RTOS評價的最重要的名額之一,實時性的優劣是使用者選擇作業系統的一個重要參考。評價一個作業系統的實時性應該着重考察它的哪些名額,以及如何進行測試,是本文着重讨論的問題。
1 作業系統實時性的主要名額
嚴格地說,影響嵌入式作業系統實時性的因素有很多。限于篇幅,本文隻列出影響作業系統實時性的6個主要因素。
(1) 常用系統調用平均運作時間
即系統調用效率,是指核心執行常用的系統調用所需的平均時間。可以參考POSIX标準,按照程序、線程、同步原語(信号量和互斥體等)、檔案、記憶體、中斷處理、時鐘、時間分類,選取部分常用的系統調用進行測試,如建立/删除程序與線程、建立/删除檔案、讀/寫檔案、設定/得到優先級、建立/釋放信号量、配置設定/釋放記憶體空間、加載/解除安裝中斷處理子產品等。選取的樣本不可能十分完整,在這裡隻是作為一種方法提出,僅供參考。
(2) 任務切換時間
任務切換時間是指事件引發切換後,從目前任務停止運作、儲存運作狀态(CPU寄存器内容),到裝入下一個将要運作的任務狀态、開始運作的時間間隔,如圖1所示。

圖1 任務切換時間
需要注意的是,要使任務進行切換,需要一定的事件觸發。通常,這個事件是同步原語,使任務切換,并且過程可被監控。但是,同步原語的操作會帶來一定的系統開銷,而且不同作業系統的各種同步原語操作效率不同。是以,對被測作業系統使用其支援的各種同步原語進行任務切換測試,選取各自用時最少者——這裡稱為“最佳原語”,作為測量值,以使誤差最小。經過對Mutex、Semaphore、Critical Section、SVR5 Semaphore、POSIX Semaphore、pthread_mutex的測試之後,測得WinCE的最佳原語為Critical Section,而Linux的最佳原語為 pthread_mutex。
(3) 線程切換時間
線程是可被排程的最小機關。在嵌入式系統的應用系統中,很多功能是以線程的方式執行的,是以線程切換時間同樣是考察的一個要點。測試方法及原理與任務切換類似,不再介紹。
(4) 任務搶占時間
任務搶占時間是高優先級的任務從正在運作的低優先級任務中獲得系統控制權所消耗的時間,如圖2所示。
圖2 任務搶占時間
(5) 信号量混洗時間
信号量混洗時間指從一個任務釋放信号量到另一個等待該信号量的任務被激活的時間延遲,如圖3所示。
圖3 信号量混洗時間
在嵌入式系統中,通常有許多任務同時競争某一共享資源,基于信号量的互斥通路保證了任一時刻隻有一個任務能夠通路公共資源。信号量混洗時間反映了與互斥有關的時間開銷,是RTOS實時性的一個重要名額。
(6) 中斷響應時間
中斷響應時間是指從中斷發生到開始執行使用者的中斷服務程式代碼來處理該中斷的時間。中斷處理時間通常不僅由RTOS決定,而且還由使用者的中斷處理程式決定,是以不應包括在測試架構之内。
針對這些名額的部分或全部,已經有了為數不少的測試方法和測試程式,例如Rhealstone方法,大量的benchmark(lmbench、HbenchOS等)。但這些測試方法及程式或者是由于計時方法的不足導緻計時精度不夠,或者是由于需要過多的專業硬體裝置(如邏輯分析儀、示波器,等),使得測試要求過高,測試條件不易達到,均存在着一定的缺陷。針對這些問題,本文中提出了一種基于CPLD與目标系統結合的測試方法,較好地解決了這些問題。
2 比對平台及測試方法
2.1 比對測試平台介紹
為了更好地對嵌入式系統中各層次的軟體系統(包括作業系統、Bootloader、使用者應用程式以及其他系統程式)進行評測,我們設計并實作了雙嵌入式系統比對實驗平台。實驗平台以2塊研華PCM7230開發闆(基于PXA255處理器)和1個CPLD器件為核心,開發闆上運作被測作業系統,保證了測試環境的完全相同;CPLD器件負責産生中斷負載、雙系統的同步置位/複位觸發與計時功能,保證了測試結果的精确,并且易于比對、觀察,突出評測過程比對的特點。圖4是比對測試平台的邏輯結構。
圖4 比對測試平台的邏輯結構
下面列出的是比對平台中主要的硬體型号與種類。
◇ CPU:XScale (400 Hz)。
◇ 時鐘:HT1381。
◇ ROM:1 MB AMD。
◇ SDRAM:64 MB。
◇ Flash:32 MB。
◇ I/O資源: 包含RS232(COM1~4),RS485(COM5),2個USB Host和1個USB Client,Ethernet DM9000.10/100 basedT,以及AMI120擴充總線接口。
2.2 測試與計時方法
在測試過程中,采用目前比較流行的基準測試程式法(benchmark)對上述實時性名額進行評測。針對每一名額,編寫相應的測試程式。在測試過程中,一個最基本原則是盡可能地減小測量誤差,采用多種政策減小其他因素對測試的影響,例如關閉核心中部分不需要的程序,以縮短核心占用CPU時間;禁用資料Cache和指令Cache,以避免高速緩存對RTOS相應名額的影響;對同一名額進行高頻度重複測試,統計其最大值、最小值和平均值等,得到盡可能客觀的結果。
與通常的基準測試方法相比較,本測試方法的特點是采用CPLD器件與測試程式相結合的方法,利用CPLD與開發闆上豐富的引腳資源,通過CPLD進行程式設計,可友善地對被測試系統産生中斷負載、同步觸發,而且不會增加被測系統的額外負載。同時,減少系統調用的次數,使測試結果更加精确,更接近核心自身的運作值。
另外,測試過程的計時功能通過CPLD程式設計實作,與傳統的利用RTOS核心的時間系統調用計時方式相比,解決了不同作業系統系統調用傳回值精度不夠、機關不統一的問題。由于比對平台中的CPLD器件選用的是Xilinx公司的XC9500系列,其最高系統時鐘頻率為100 MHz,引腳到引腳的最大時延為10 ns,是以實作的計數器計時精度可以達到數十ns,幾乎可以忽略不計,極大提高了計時精度,如圖5所示。
圖5 CPLD測試、計時方法
整個測試過程主要分為4部分:準備工作,核心測試程式程式設計,CPLD程式設計,與外界互動部分的實作。準備工作包括編譯核心、修改Bootloader等,Bootloader通過對i?boot?lite?1.8進行修改,使其可應用于比對平台上;核心測試程式按照前面所提到的6個名額,劃分為6個子產品,分别編寫;CPLD程式設計主要包括計時程式、中斷負載加載程式等;外界互動部分主要包括序列槽通信、以太網卡驅動。下面是部分CPLD上的VHDL程式源碼。其中,fenpin為時鐘頻率,flagreci為接收信号;當使用按鍵人工控制時,flagsend和flagstop為計時開始和結束。
process(fenpin,flagsend,flagreci,flagstop)
begin
flag<=flagsend & flagreci & flagstop;
if(fenpin′ event and fenpin='1') then
if(flag="0010000") then
if(tempsendout="0000000000000111") then
tempsendout<=tempsendout;
else
tempsendout<=tempsendout+'1';
end if;
countout<=countout+'1';
if(tempsendout="0000000000000111") then
outsend<='0';
outsendled<='0';
iscounting<='1';
else
outsend<='1';
outsendled<='1';
end if;
else
iscounting<='0';
signdisp<='1';
end if;
end if;
end process;
測試程式的代碼較多,這裡不一一列出,僅給出程式中嵌入的與CPLD互動的部分代碼片段供參考。
#define base_add (*(volatile unsigned *)0x40E00000)
#define gpio3_derect (*(volatile unsigned *)(0x40E00000+0x0C))
#define gpio3_out1 (*(volatile unsigned *)(0x40E00000+0x18))
int to_CPLD(void) {
gpio3_derect = 0x8;//設定引腳為輸出
gpio3_out1 = 0x8;//輸出一個高電平
}
代碼的前段定義了相關寄存器的位址,在測試過程中,使用PXA255的GPIO3引腳與CPLD互動,實作計時功能。由于需要在核心态運作,故該函數作為一個子產品編譯進核心,測試程式中通過ioctl系統調用執行此段代碼,将信号發送給CPLD,CPLD計算2次信号的間隔時間,實作計時功能。
3 Linux、WinCE的測試結果及分析
根據上述名額體系及測試方法,我們對Linux和WinCE進行了相關的測試。其中,Linux版本為2.4.19,WinCE版本為WinCE.Net。由于當硬體平台與運作環境不同時,即使同一核心運作時展現的性能名額也會不同,是以對不同RTOS的評測隻有在相同平台環境下進行比對才有其價值,測試以評價為目标,評價以比對為依據。表1是對上述兩種核心的評測結果。由于篇幅所限,這裡隻列出了平均時間,最大、最小值沒有列出。
表1 Linux和WinCE比對評測結果名額
從表1中可以看出,在任務切換時間、線程切換時間、系統調用平均運作時間幾項名額中,Linux2.4.19和WinCE.Net相差不大;但在任務搶占時間、信号量混洗時間、中斷響應時間幾項名額中,WinCE.Net明顯優于Linux2.4.19。總的來說,WinCE.Net的實時性優于Linux2.4.19。下面從兩種作業系統的特點、内部實作機制等方面來解釋說明上述測試結果。
Linux與WinCE均允許不同程序的優先級相同,這一點不同于μC/OS等實時核心(μC/OS中每個任務的優先級唯一),是以采用的排程算法都是搶占式和時間片輪轉的混和式排程政策。是以,在同優先級的程序切換時,二者名額相差不大。
測試中使用的Linux2.4.19并非是為嵌入式實時系統設計的專用作業系統,隻是對原有的通用核心進行了一定的裁剪;而WinCE.Net雖然也不是一個嚴格意義上的實時核心,但卻是專門為嵌入式系統設計的。是以,在任務搶占和中斷響應方面,WinCE要顯著強于Linux。另外,Linux2.4.19在核心級并不支援搶占,這也是它的搶占時間大于WinCE的一個主要原因。不過,這一點在2.6版本的Linux核心中已經得到了解決。
系統調用效率上,WinCE.Net要優于Linux2.4.19,但是Linux的系統調用更加符合POSIX标準,更加規範,而且更加開放。
綜上所述,在對實時性要求較高的嵌入式系統中,WinCE.Net要比Linux2.4.19更加适用,并且WinCE.Net在開發類桌面系統中繼承了微軟的一貫優勢,使得開發更加容易。但是,如果系統的實時性要求不高,Linux也許是更合适的選擇,因為使用它可以降低成本,并且完全對使用者透明,便于修改定制。若想使用Linux作為作業系統開發實時性要求較高的系統,則應對其做适當的實時性改造,或者直接使用已經過實時改造的Linux核心,如RTLinux等。
4 總結與展望
本文介紹的測試方法與傳統的純軟體測試方法相比,具有精度高、易于比對的特點,且測試的複雜度并沒有顯著地增加;與單純的硬體測試方法相比,具有成本效益高、需要裝置少、擴充性強等特點,且測試精度差别不大,但功能不如邏輯分析儀、示波器等專用硬體裝置強大。本文介紹的嵌入式作業系統實時性名額體系還有着較大的完善和擴充空間,每一個名額都可以進一步細化。若能在不同的負載條件下利用本文的測試方法進一步測試,則可使得測試結果更加全面客觀。
本文摘自:http://www.lyctr.com/shownews.asp?id=193