在工業控制領域,很多時候對系統實時性的要求較高,下面就通過英創公司的EM9160(內核為Linux-2.6)和EM9280(內核為Linux-3.9)工控主板,對Linux的不同版本2.6和3.9進行實時性的探究,對它們分別測試,得出測試結果,通過實驗數據說明Linux-2.6和Linux-3.9在實時性方面的差別。
實時性的一個重要參數就是任務的響應延遲時間,它包含了其它幾個重要的實時性參數(中斷潛伏期時間,調度潛伏期時間等),任務響應延遲時間越短,說明任務對外部事件的響應速度越快,實時性也就越好。
本次測試就是針對任務的響應延遲時間進行的,使用串口接收整包數據然后解包得到數據,再對數據打包回發。測量出串口接收端RX接收數據完畢到發出端TX開始發送數據的時間間隔,并對EM9160和EM9280的測試結果進行比較。
測試中,使用一塊工控主板通過串口向測試使用的EM9160和EM9280每秒發送一個9字節的整包數據。
測試中通訊數據包定義如下:
0x55 |
0xaa |
DestAddr |
SourceAddr |
DatLen |
Dat0 |
… |
Datn |
checksum |
測試得出的時間間隔包括兩段,串口RX端接受數據完畢至系統響應數據的延遲時間和處理數據的時間。這里的處理數據非常簡單,讀取數據解包,再打包回發,所用時間僅為10us不到。所以,測量出的時間間隔主要是系統響應串口接收數據的延遲時間。
由于測量任務的響應延遲時間不同于一般的時間參數測量,它要求很高的時間測量精度(至少微秒級)。所以,測試中采用示波器作為測試工具,分別測出在接受處理數據時串口RX端和TX端的波形,觀察波形之間的時間間隔,就能精確的測量出串口收發數據的時間間隔。
根據上面所闡述的,在EM9160和EM9280工控主板上分別進行Linux系統對任務響應延遲的測量。
測試所用程序的一些主要部分;
首先配置并打開串口:
rc = m_Serial.OpenPort( 2, 115200, '8', '1', 'N');
這里為打開ttyS2,波特率115200,8位字符長度掩碼,1位停止位,無奇偶校驗。
數據的接收采用建立一個單獨線程的方式,在線程中調用select()函數等待數據,當接受到數據以后,對數據處理,要進行相應解包,檢驗和的驗證,并且回發:
pthread_create(&m_thread,&attr,(void *(*) (void *))&ReceiveThreadFunc, (void*)this );
串口發送數據需要經過打包處理:
int CSerial::WritePort(unsigned char *Buf, int len ,int fd)
對該例程感興趣的客戶可以點此下載該例程完整代碼。
在EM9160和EM9280上面都使用同樣的程序進行測試。
基于EM9160平臺,對Linux-2.6的測試結果:
橙色線CH1的波形是串口接收端RX的波形,藍色線CH2的波形是串口發送端TX的波形,波形橫軸每一格的單位為2.5ms。測試波形的截圖如下。
![]() |
![]() |
|
|
![]() |
|
通過對以上四張圖波形的觀察,可以發現,EM9160工控主板在Linux-2.6的環境下,系統等任務的響應延遲是一個范圍值,最短時間在1ms左右,最長時間已經超過了10ms。
下面來看基于EM9280平臺,對Linux-3.9的測試結果:
橙色線CH1的波形是串口接收端RX的波形,藍色線CH2的波形是串口發送端TX的波形。波形橫軸每一格的單位為250us,測試波形的截圖如下。
![]() |
![]() |
|
|
![]() |
通過對這三張圖中波形的分析,可以看出,在EM9280工控主板在Linux-3.9的環境下波形很穩定,系統對任務的響應延遲時間在1MS以內。能夠滿足對實時性的較高要求。
分析實驗數據,可以發現,Linux-3.9對任務的響應延遲時間能夠保持在1ms之內,而Linux-2.6對任務的響應延遲時間最短時間在1ms左右,但是最長時間卻達到了10ms左右。通過對比,可以得出Linux-3.9相對于Linux-2.6在實時性上有相對較大的提升。
本次測試采用的波特率是115200,這樣可以盡可能的減少數據傳輸時間和接收與發送超時的影響,與系統的響應時間對比,能夠顯現出實時性的特點。對于較慢的波特率,比如9600,4800等,數據傳輸本身較慢,等待數據傳輸和超時的時間也較長,可能一次數據傳輸完成的時間和系統響應的時間已經相差不大或者超過系統響應時間,這種情況下,Linux-2.6已經能夠滿足實時性的要求。但是當客戶的傳輸速率較快而且對實時性的要求較高時,建議選用內核為Linux-3.9的工控主板進行相關開發,能夠滿足需求。
成都英創信息技術有限公司 028-8618 0660