1 概 述
??? 嵌入式系統具有專用性強、外圍設備多樣的特性,這決定了其應用的硬件環境差異性較大。系統軟件模塊與硬件之間的接口是嵌入式實時系統的主要特征,是系統設計過程中的必需環節,也是影響嵌入式系統應用前景的關鍵問題之一。硬件抽象層(Hardware Abstraction Layer,HAL)的引入可有效解決這一問題。HAL是將硬件平臺與應用軟件隔離開來的軟件層次,通過硬件抽象技術實現硬件相關和硬件無關兩部分程序代碼的隔離,為應用軟件提供一個沒有硬件特性的接口。硬件抽象層的引入不僅是系統體系結構設計方法的改進,更直接關系到整個系統的開發模式以及嵌入式操作系統的可移植性。硬件抽象層的引入大大推動了嵌入式系統開發的規范化進程。
??? EMC是一個開放源代碼的用于機床或機器人等運動控制系統的計算機控制軟件。它能同時驅動9軸電機。其運動控制特性包括:刀具半徑和長度補償、軸同步運動、自適應進給速度、恒速度控制等。EMC2在原有EMC軟件的基礎上加入了許多新的特性和功能,其中包括了HAL和軟件PLC模塊ClassicLadder。ClassicLadder是一個基于LGPL協議的梯形圖解釋器。它隨著EMC2一起發布,可以與EMC2的HAL一起工作。本文中的控制系統利用EMC2的HAL為軟PLC中的應用程序提供底層硬件操作支持,提高了應用程序的平臺無關性與可移植性。
2 硬件架構
??? 控制器是鋰電池卷繞恒張力控制器,采用符合PC/104總線規范的單板計算機(以下簡稱PC104)與基于FPGA的專用主機板相結合的方法構建系統硬件。PC104中運行實時Linux,ClassicLadder及HAL作為實時模塊加載到Linux系統中。
??? 系統硬件框圖如圖1所示。其中ADS8361為12位模/數轉換器,用于采集張力值等模擬量;AD5624為數/模轉換器,用于控制直流電機轉速及氣壓閥壓力值;FPGA控制所有外圍芯片,并產生電機脈沖方向信號,同時對電機編碼器信號進行計數;CPLD控制I/O輸入/輸出點,并與FPGA交換信息。利用EMC2中HAL的實現原理,可編寫組件將硬件系統所有設備抽象成引腳和函數的形式,供軟PLC在需要時加載。
3 EMC2中HAL的基本概念
??? EMC2的HAL提供了一種簡便方法,將一些已有軟硬件模塊進行加載和組合形成一個復雜的系統,從而使EMC2更容易配置,以使用各種硬件設備。硬件資源在HAL中被封裝成特定組件,隨時被控制系統載入使用。EMC2中的HAL有以下基本概念:
??? Component,組件。是定義好輸入、輸出及行為的軟件模塊,可以在需要時安裝及連接。
??? Parameter,參數。許多硬件組件有可調整參數需要進行訪問。HAL有輸入及輸出兩種類型的參數。
??? Pin,引腳。硬件組件用于互聯的連接端子。所有Pin都有名稱,并在連接時使用。HAL的Pin是只存在于計算機內的軟件實體。
??? Physical_Pin,物理引腳。許多I/O設備有真正的物理引腳或終端連接到外部硬件,這些被稱為物理引腳。
??? Signal,信號。現實中硬件組件使用導線互連。在HAL中導線相當于“信號”。HAL的信號將HAL的引腳連接在一起,可以隨意斷開或重新連接。
??? Type,類型。引腳和信號都有類型屬性,即信號只能連接到相同類型的引腳。目前,HAL有4種類型:BIT、FLOAT、U32、S32。
??? Function,函數。每個函數是一個執行具體行為的代碼塊,執行讀取輸入、計算輸出等操作。系統設計者可以使用“線程”對一系列函數加以調度,以使其按照特定的順序及時間間隔運行。
??? Thread,線程。作為一個實時任務的組成部分,線程是一個以特定時間間隔運行的函數序列。函數可以添加到線程并在每次線程運行時調用。
4 HAL架構
??? 系統軟件架構如圖2所示。用HAL將各I/O通道、ADC通道、DAC通道、脈沖通道、編碼器通道抽象成Pin,將對硬件各模塊的操作抽象成各個Function,將Pin和Function封裝在命名為hal_CNC的Component中。
??? 硬件在Component中被映射為如下數據結構:
???
??? 由上述結構可以看出,每個Pin對應一個相應類型的指針,該指針指向的內存區便存放該引腳的值。
5 基于HAL的驅動程序編寫
??? hal_CNC由源文件hal_CNC.c和hal_CNC.h構成。hal_CNC.c定義了對hal_CNC的初始化、底層硬件驅動函數、hal_CNC退出時的操作等。rtapi_app_main()函數是載入Component時的程序入口。
??? 首先申請當前Component的ID號,對Component的每個操作都由該ID號索引。
??? comp_id=hal_init(“hal_CNC”);
??? //hal_CNC為Component的名字
??? 其次,分配組件運行時所需內存,代表Pin的指針指向的內存區域便是在此分配:
??? CNC_driver=hal_malloc(sizeof(CNC_struct));
??? 接著將所定義Pin導出到HAL。該操作通過調用自定義的export()函數來完成。以DAC模塊為例,操作如下:
??? for(n=0;n<8;n++)
??? export_dac(n,CNC_driver); //導出Pin
??? 每次調用export_dac()時,都會調用如下語句注冊一個Pin。
??? rtapi_snprintf(buf,HAL_NAME_LEN,“CNC.DAC.%d.value”,num);
??? hal_pin_float_new(buf,HAL_IN,&(addr->dac_value[num]),comp_id);
??? 其中“CNC.DAC.XXX.value”是Pin的名稱。軟PLC通過該名稱對此Pin進行引用。hal_pin_float_new()是HAL提供的函數,在新建Type為FLOAT型的Pin時使用。該函數一共有4個參數,依次是Pin名、Pin方向、Pin內存指針地址、Component ID。引腳方向HAL_IN表示該值是從軟件層“輸入”到HAL中的,該方向針對軟件層與HAL層而言。
??? 對Pin進行操作的Function也要導出到HAL:
??? hal_export_[unct(“CNC.DAC.write”,CNC_dac_write,CNC_driver,1,0,comp_id);其中“CNC.DAC.write”為軟件層使用該Function時引用的名字;CNC_dac_write為函數在C源文件中實際對應的C函數名稱;CNC_driver為Component的內存指針;1表示函數用到了浮點數;0表示該函數不可重入;comp_id為Component ID。
??? 依照上述做法將所有硬件功能模塊全部導出到HAL后,在rtapi_app_main()的最后調用hal_ready(comp_id),表明該Component已經初始化完畢,可以開始使用了。
??? 在關閉Component退出時,系統會自動調用hal_CNC.C中編寫的rtapi_app_exit()。其實現如下:
??? void rtapi_app_exit(void){hal_exit(comp_id);)
??? hal_exit()關閉并釋放HAL及RTAPI使用到的系統資源,使這些資源可被重新使用。
??? 用EMC2自帶的工具comp對源文件hal_CNC.c和hal_CNC.h進行編譯,即可得到名為hal_CNC的Compo-nent。該組件自動放入EMC2的模塊庫中,隨時可被其他軟件模塊調用。
6 HAL的使用
??? 以DAC為例,在Linux下的命令行輸入“halrun”進入EMC2的HAL運行界面,輸入:
??? loadrt threads namel=thread periodl=1000000
??? 創建名為“thread”的線程,該線程執行周期為1 ms。
執行:
??? loadrt hal_CNC
??? 將所編寫的硬件系統組件調入,執行:
??? addf CNC.DAC.write thread
??? 將DAC的寫函數加入到前面創建的線程thread,使之以與thread相同的執行周期被調用。然后使可通過控制DAC的引腳來輸出相應的電壓。如:
??? setp CNC.DAC.0.value 1
??? 該語句將使電路板上的DAC輸出端子輸出1 V的電壓。
??? 用類似的方法將其他軟件模塊通過與HAL的引腳連接,便實現了其他軟件對HAL的調用。
7 HAL在ClassicLadder中的調用
??? 以從DAC輸出5 V為例,將classicladder的一個名為“classicladder.0.s320ut-00”的有符號32位整型Pin賦值為5。該值經過HAL中的一個類型轉換Component“s32tofloat”變為浮點數,再連接到hal_CNC中的DAC單元的引腳“CNC.DAC.0.value”,便在實際硬件電路板的DAC輸出端輸出5 V的電壓。引腳連接如表1所列。
??? 其中“→”和“←”表示引腳之間的連接,用HAL中的Sig-nal實現。
??? 在軟PLC中設置變量W10的值為5,則在DA輸出端子引腳上用萬用表測到5 V的電壓。軟PLC中的操作輸出如圖3所示。
??? 其中4個窗口表示DAC的4個通道,分別令DAC輸出5 V、2 V、3 V、4 V的電壓。
8 結 論
??? 實踐證明,HAL的引入可極大提高嵌入式軟件實現的硬件無關性。從軟件的角度來看,其面向的硬件具有同質的接口,對硬件的操作具有相似的方法與架構,極大地簡化了軟件對硬件的控制,方便了同類軟件在不同硬件平臺間的移植。這就為軟硬件同步設計、分工協作奠定了良好的基礎。該架構已成功應用在文中所述的鋰電池卷繞恒張力控制器中,取得了良好效果。
評論
查看更多