平臺包括運行環(huán)境和開發(fā)環(huán)境兩部分。使用開發(fā)環(huán)境,用戶可以方便組態(tài)和二次開發(fā),而將開發(fā)重點集中到具體的控制系統(tǒng)應用上,而諸如系統(tǒng)的軟件架構設計、實時性保證、通用的控制系統(tǒng)軟件如網絡通信、控制算法等復雜而繁瑣的軟件工作,則交由平臺完成。
2.3平臺的總體框架
嵌入式控制系統(tǒng)平臺是以嵌入式實時操作系統(tǒng)為核心,包括硬件平臺、硬件驅動、圖形庫運行環(huán)境、實時數(shù)據(jù)庫管理與通信、人機界面、軟PLC、網絡通信、用戶應用程序等。
嵌入式控制系統(tǒng)平臺總體框架如圖1所示。
圖1嵌入式控制系統(tǒng)軟件平臺總體框架
由圖1可知,嵌入式控制系統(tǒng)軟件平臺主要包括以下部分:
(1) 嵌入式硬件平臺 (2) 嵌入式實時操作系統(tǒng) (3) 硬件驅動程序 (4) 圖形庫與運行環(huán)境 (5) 實時數(shù)據(jù)庫管理與通信 (6) 人機界面 (7) 軟PLC (8) 網絡通信 (9) 用戶應用程序
3嵌入式控制系統(tǒng)軟件平臺主要模塊的實現(xiàn)
嵌入式控制系統(tǒng)軟件平臺是個非常復雜的系統(tǒng),從總體框架圖可以看出平臺包括實時操作系統(tǒng)、實時數(shù)據(jù)庫管理與通信、圖形庫與運行環(huán)境、人機界面等許多模塊,本章著重介紹嵌入式實時操作系統(tǒng)、實時數(shù)據(jù)庫管理與通信等模塊的實現(xiàn)。
3.1嵌入式Linux實時操作系統(tǒng)
Linux是一種能運行于多種平臺、功能強大、源代碼公開、免費的操作系統(tǒng),基于Linux開發(fā)一個開放的、標準的、高效廉價的實時操作系統(tǒng)是完全可行的。本文介紹的嵌入式控制系統(tǒng)軟件平臺就采用嵌入式Linux實時操作系統(tǒng),使用雙內核RTAI解決方案。RTAI的實現(xiàn)方案類似于RT-Linux,是雙內核系統(tǒng),即利用Linux內核,同時增加一個實時內核,兩個內核共同工作。RTAI利用Linux提供的內核模塊機制完成實時任務,提供實時服務。模塊是內核的一部分,但是沒有被編譯到內核里去。模塊被編譯成一組目標文件,根據(jù)需要,這些文件能夠被插入到正在運行的內核中,也可以從正在運行的內核中移去。RTAI實現(xiàn)的主要模塊有RTAI核心模塊、RTAI調度器模塊、RTAI先進先出模塊、RTAI共享內存模塊和LXRT模塊等。
3.1.3基于RTAI的Linux實時操作系統(tǒng)的實現(xiàn)
我們實現(xiàn)基于RTAI的Linux實時操作系統(tǒng)的過程是:在標準Linux的基礎上,打上RTAI的實時補丁包,根據(jù)特定硬件條件和運行環(huán)境的要求進行適當?shù)呐渲?再對內核進行裁剪后編譯成一個支持實時性的內核。
3.1.4基于RTAI-Linux的應用程序開發(fā)
在編寫基于RTAI-Linux的應用程序時,根據(jù)實時系統(tǒng)的具體要求,將應用程序分為實時任務和非實時任務。實時任務是實時模塊,作為Linux核心可加載模塊運行在核心態(tài)。一般地,定義init_module()函數(shù),它在執(zhí)行insmod命令裝載模塊時被調用,在該函數(shù)中一般是作一些初試化工作,并且啟動實時任務。同樣的,還需要定義cleanup_module()函數(shù),它在執(zhí)行rmmod卸載模塊時被調用,在該函數(shù)中一般是做一些資源釋放工作。實時任務的設計應該盡可能簡單,僅包含那些有強實時要求的處理模塊,如實時數(shù)據(jù)采集、外部設備控制等。
非實時任務是普通的Linux進程,它在用戶態(tài)運行,運行那些對實時要求不高的任務,如數(shù)據(jù)處理、圖形顯示等。
實時任務(RTAI核心態(tài))并不能直接調用系統(tǒng)調用,它必須通過特定的方法和非實時任務(Linux進程)進行通信。它們可以通過共享內存和FIFO等方法通信。
基于RTAI應用程序的結構圖如圖2所示。
圖2 RTAI應用程序結構圖
3.2實時數(shù)據(jù)庫管理與通
本系統(tǒng)的實時數(shù)據(jù)庫管理著全局I/O數(shù)據(jù)。通過硬件驅動程序,將數(shù)據(jù)采集,并放入到實時數(shù)據(jù)庫中,同時,上層軟件從實時數(shù)據(jù)庫中獲得數(shù)據(jù)。
3.2.1數(shù)據(jù)結構設計
實時數(shù)據(jù)庫與其他一般數(shù)據(jù)庫一樣,包含一組對象及其結構,由于目前對實時數(shù)據(jù)庫還沒有提出統(tǒng)一的數(shù)據(jù)模型,所以不同廠家開發(fā)的數(shù)據(jù)庫的數(shù)據(jù)結構都有很大差別。本系統(tǒng)的實時數(shù)據(jù)庫,一個基本的數(shù)據(jù)對象為“數(shù)據(jù)”,一個數(shù)據(jù)包含若干信息,如數(shù)據(jù)名稱、數(shù)據(jù)類型、數(shù)據(jù)位置、數(shù)據(jù)長度等。
考慮到數(shù)據(jù)的存取效率,程序運行一開始,我們將在內存區(qū)開辟一段緩沖區(qū),緩沖區(qū)中只存放數(shù)據(jù),如果緩沖區(qū)大小不夠,即緩沖區(qū)的數(shù)據(jù)較多,可以自動擴展緩沖區(qū)大小。實時數(shù)據(jù)存放在緩沖區(qū)時,我們采取這種思想:如果不是bit型數(shù)據(jù),由于數(shù)據(jù)長度都是字節(jié)的整數(shù)倍,存入緩沖區(qū)中以字節(jié)來進行存儲,該數(shù)據(jù)的長度length是以字節(jié)來計算。如果是bit型數(shù)據(jù),存入緩沖區(qū)中,該數(shù)據(jù)的長度length是以位來計算,接著再存儲一個實時數(shù)據(jù),若為非bit型數(shù)據(jù),則從下一個字節(jié)開始存放,即原來的bit型數(shù)據(jù)占用一個字節(jié),若為bit型數(shù)據(jù),根據(jù)此數(shù)據(jù)的長度來判斷其存放位置,這里又分兩種情況,如果這兩個bit型數(shù)據(jù)的長度沒有超過8位,則緊接著前一個bit型數(shù)據(jù)后存儲這個bit型數(shù)據(jù),如果兩個bit型數(shù)據(jù)的長度超過8位,則從下一個字節(jié)開始存放,即原來的bit型數(shù)據(jù)占用一個字節(jié)。
3.2.2數(shù)據(jù)存取設計
為了存取方便,我們將所有的實時數(shù)據(jù)組成一個鏈表,鏈表的節(jié)點類型為上述的rtdb_data_t結構。當向實時緩沖區(qū)中加入一條數(shù)據(jù)時,就自動會計算出數(shù)據(jù)存儲位置、長度等信息,并在實時數(shù)據(jù)庫鏈表中加上一個節(jié)點。這樣,取實時數(shù)據(jù)就非常靈活和方便,如果知道實時數(shù)據(jù)