陳 攀,張承瑞,羅 映
1(山東大學(xué) 機(jī)械工程國家級實(shí)驗教學(xué)示范中心,濟(jì)南 250061) 2(山東建筑大學(xué) 機(jī)電工程學(xué)院,濟(jì)南 250101) E-mail:sduchenpan@163.com
隨著軟件工具的發(fā)展,自動代碼生成技術(shù)在工業(yè)控制[1]、汽車電子[2]、航天和導(dǎo)彈制導(dǎo)[3]等領(lǐng)域得到廣泛的應(yīng)用.自動代碼生成相比于手工編程,能夠減少偶然的bug,減少重復(fù)勞動的時間,提高嵌入式系統(tǒng)的可靠性[4].在MATLAB/Simulink下,8051、飛思卡爾DSP563XX、英飛凌C166和ARM系列等芯片都有對應(yīng)的toolbox支持,在創(chuàng)建MATLAB/Simulink模型后,通過RTW工具,可直接生成控制代碼.而外圍器件選型或布置等設(shè)計變化可能導(dǎo)致用戶不能直接通過工具生成代碼.為了滿足不同項目的嵌入式控制器的設(shè)計需求,需要根據(jù)MATLAB/Simulink和RTW的工作原理,結(jié)合實(shí)際需求設(shè)計代碼生成工具,進(jìn)而使代碼的生成符合預(yù)期,同時提高代碼質(zhì)量.本文從RTW的工作原理出發(fā),以飛思卡爾S12X系列單片機(jī)為例,利用COM技術(shù)連接MATLAB/Simulink與CodeWarrior IDE,整合驅(qū)動層與應(yīng)用層,最后實(shí)現(xiàn)自動代碼生成,并且代碼無需手動修改,能夠直接下載到目標(biāo)板上.
RTW(Real-Time Workshop)是基于Simulink的代碼自動生成環(huán)境.Simulink軟件生成一個包含框圖執(zhí)行語義的高級表示文件——model.rtw文件.model.rtw文件是一個ASCII格式數(shù)據(jù)庫,其中的內(nèi)容描述了Simulink模型中的各個塊的包括屬性名稱和屬性值等.目標(biāo)語言編譯器(TLC)讀取model.rtw文件并將其轉(zhuǎn)換為內(nèi)部表示,并根據(jù)其他模塊TLC文件等修改最初的model.rtw文件.在RTW下能直接從Simulink的模型中產(chǎn)生優(yōu)化的、可移植的和個性的代碼,并根據(jù)目標(biāo)配置自動生成多種環(huán)境下的程序[5].RTW環(huán)境下的代碼生成過程有如下四個部分:
1)RTW讀取模型文件model.mdl,生成模型的描述文件model.rtw,該文件以ASCII碼存儲;
2)TLC讀取model.rtw,并根據(jù)的系統(tǒng)TLC與模塊TLC文件,生成指定目標(biāo)的代碼,如ANSI C/C++代碼;
3) RTW代碼生成器根據(jù)給定的模型,將makefile模板生成具體的makefile文件(model.mk),該文件可修改用于生成可執(zhí)行文件的C/C++編譯器及編譯選項;
4)連接model.mk與運(yùn)行時的接口支持文件,將代碼編譯成可執(zhí)行的文件[6].
圖1 RTW工作過程Fig.1 RTW working process
MATLAB通過ActiveX自動化管理其他ActiveX組件或者被其他ActiveX組件所控制.ActiveX是Microsoft公司推出的基于組件對象模型(Component Object Model,COM)的一種技術(shù),他使各種軟件組件可以在網(wǎng)絡(luò)環(huán)境中相互作用,而不管這種組件是使用什么語言編寫的.當(dāng)MATLAB受到其他ActiveX組件控制時,充當(dāng)了自動化服務(wù)器,ActiveX組件則是自動化客戶機(jī)[7].而實(shí)際上ActiveX是商標(biāo)名稱,COM才是技術(shù)名稱.
COM是微軟公司提出的以組件為發(fā)布對象的軟件開發(fā)技術(shù).組件對象模型(COM)是Windows對象的二進(jìn)制標(biāo)準(zhǔn).為Windows提供了統(tǒng)一地、面向?qū)ο蟮?、可擴(kuò)充的通訊協(xié)議.這意味著描述一個對象的可執(zhí)行代碼(.dll或.exe文件的代碼)可以被其他對象執(zhí)行[7].得益于COM具有與語言、平臺無關(guān)的特征,MATLAB的m函數(shù)可以基于COM標(biāo)準(zhǔn)與CodeWarrior IDE通訊,然后控制程序生成的過程.
在MATLAB下編寫m函數(shù)使用COM技術(shù),可通過MATLAB的ActiveX支持調(diào)用必要的方法來調(diào)用CodeWarrior IDE.通過COM技術(shù),可以實(shí)現(xiàn)調(diào)用CodeWarrior(例如,啟動一個新的CodeWarrior會話);打開CodeWarrior MCP項目文件;刪除舊的目標(biāo)文件;構(gòu)建項目以創(chuàng)建二進(jìn)制文件;下載并執(zhí)行目標(biāo)板上的二進(jìn)制文件.
嵌入式軟件架構(gòu)的設(shè)計,可以按如圖2分為三層:微控制器層、設(shè)備接口層、邏輯應(yīng)用層.微控制器層負(fù)責(zé)硬件的初始化和頭文件定義等內(nèi)容;設(shè)備接口層,封裝驅(qū)動接口,供邏輯應(yīng)用層調(diào)用.這兩層都在CodeWarrior IDE編寫,根據(jù)需要用C語言編寫IO驅(qū)動和通信驅(qū)動,封裝接口并測試,作為工程模板;最后的邏輯應(yīng)用層在MATLAB/Simulink下編寫.邏輯應(yīng)用層通過相關(guān)的UI模塊處理設(shè)備驅(qū)動層的接口,同時負(fù)責(zé)邏輯與應(yīng)用的搭建.
圖2 軟件框架設(shè)計Fig.2 Design of software framework
在MATLAB/Simulink中,驅(qū)動UI模塊與設(shè)備驅(qū)動一一對應(yīng).驅(qū)動UI模塊的功能是在RTW程序創(chuàng)建過程中將驅(qū)動程序內(nèi)嵌到模型源代碼中.驅(qū)動UI驅(qū)動的建立有兩種思路:一種是用TLC語言處理寄存器配置等底層硬件驅(qū)動,后生成C代碼;另一種是通過MATLAB配置相關(guān)的參數(shù),后調(diào)用相關(guān)的驅(qū)動函數(shù),生成階段只負(fù)責(zé)整合.采用第二種思路編寫驅(qū)動,可以在IDE編寫底層驅(qū)動庫[8],便于對已有的產(chǎn)品代碼進(jìn)行重構(gòu),更能適應(yīng)新的需求[9],而TLC文件處理相關(guān)的接口即可.對于TLC語言不熟悉的硬件工程師而言,采用第二種方式能減少編寫TLC文件的工作量,提高效率.
驅(qū)動模塊的建立需要先創(chuàng)建代表硬件的S函數(shù),通過在與S函數(shù)對應(yīng)的UI模塊上定義參數(shù),例如外設(shè)寄存器地址、采樣時間等,將這些參數(shù)傳遞到RTW文件中去.實(shí)際的驅(qū)動接口相關(guān)的函數(shù)寫在S函數(shù)同名的TLC文件中.驅(qū)動模塊的建立可以分為兩個部分,第一步,模型階段,處理模型相關(guān)的模塊noninlined C MEX S-Function,此時創(chuàng)建的S函數(shù)模塊只能用于仿真而不能用于生成代碼;第二步,RTW階段,編寫TLC文件,用來定制RTW,為系統(tǒng)模型生成實(shí)時C代碼.最后通過MEX指令生成Inlined S-function(內(nèi)聯(lián)S函數(shù)).
對于I/O驅(qū)動模塊的設(shè)計,具體的過程包含如下四個階段:
1.UI模塊界面設(shè)計,根據(jù)模塊參數(shù)及輸入輸出來設(shè)計模塊的配置參數(shù),對于AI模塊可以設(shè)計電壓、電阻、電流模式參數(shù),分辨率參數(shù)、通道參數(shù)等配置選項,UI界面的參數(shù)會傳遞到接下來編寫的S-Function中;
2.編寫模塊S-Function,通過修改Simulink Library提供的S-Fuction Example中提供的合適的S-Function模板,使得在RTW的程序創(chuàng)建過程中能將自定義的模塊程序嵌入到模型源代碼中,注意,此時創(chuàng)建的S函數(shù)模塊只能用于仿真而不能用于生成代碼;
3.編寫TLC文件,需設(shè)計模塊TLC文件用于定制模塊程序,TLC文件通過獲取模塊中的參數(shù)值來定制驅(qū)動程序并將其嵌入到自動生成的模型源代碼中,一般TLC文件負(fù)責(zé)制定的I/O宏定義、變量定義、code庫等內(nèi)容和硬件初始化等,按照本文的軟件結(jié)構(gòu),TLC文件以接口處理為主.
4.模塊整合,調(diào)用命令mex生成內(nèi)聯(lián)S函數(shù),最后將目標(biāo)硬件驅(qū)動程序封裝成靜態(tài)庫:調(diào)用sblock函數(shù),封裝并加入Simulink庫,供系統(tǒng)邏輯應(yīng)用調(diào)用.
系統(tǒng)設(shè)計不僅僅負(fù)責(zé)main主函數(shù)生成,還為COM技術(shù)的使用和整個自動代碼過程服務(wù).目標(biāo)系統(tǒng)通過系統(tǒng)文件(TLC)和hook文件把mdl轉(zhuǎn)換成c/h文件,而其余文件輔助這個過程.系統(tǒng)級設(shè)計包含系統(tǒng)目標(biāo)文件、hook文件和腳本文件[10],過程如圖1所示.
1) 系統(tǒng)目標(biāo)文件用于設(shè)置代碼生成的參數(shù)及目標(biāo)硬件相關(guān)的專用數(shù)據(jù).可以設(shè)置一些最基本的內(nèi)容,配置代碼生成格式、類型、語言等內(nèi)容,一般用于對目標(biāo)系統(tǒng)的各種參數(shù)進(jìn)行默認(rèn)配置;
2) hook 文件用于對代碼生成的各個階段對自定義操作的處理.hook文件的設(shè)計用于在代碼生成過程中hook文件的執(zhí)行分為表1六個階段,貫穿了整個RTW的程序創(chuàng)建過程.根據(jù)實(shí)際需要可設(shè)計與修改各階段的內(nèi)容.
表1 RTW 創(chuàng)建過程
Table 1 RTW creation process
階段創(chuàng)建過程entry自定義目標(biāo)進(jìn)行預(yù)配置,參數(shù)配置檢驗before_tlc調(diào)用目標(biāo)語言編譯器TLC自動生成模型源代碼after_tlc自動生成創(chuàng)建目錄的信息文件,并將其放在創(chuàng)建的文件夾中before_make生成程序創(chuàng)建過程必須的庫文件after_make更新創(chuàng)建信息對象exit調(diào)用COM組件來處理代碼整合
3)腳本文件用于創(chuàng)建訪問實(shí)例,通過COM組件在MATLAB中實(shí)現(xiàn)對編譯器的操作.首先用MATLAB注冊函數(shù)actxserver(′CodeWarrior.CodeWarriorApp′)創(chuàng)建CodeWarrior的COM對象,返回句柄,然后再通過COM接口來執(zhí)行將基于模型的.c和.h文件添加到CodeWarrior的工程中,接著進(jìn)行編譯,最后根據(jù)設(shè)置執(zhí)行程序下載等命令.
項目開發(fā)一款飛思卡爾S12X系列MC9S12XEP100為主控芯片的控制器,具備AD采集、數(shù)字DA、電流測量、時間測量、PWM輸出、高低邊功率輸出、CAN、LIN、RS232和RS485,10種通用I/O功能.以AD采集模塊為例,說明硬件模塊在MATLAB/Simulink下程序整合的過程.對無操作系統(tǒng)的嵌入式系統(tǒng)主要有兩種實(shí)現(xiàn)方式:循環(huán)輪轉(zhuǎn)和前后臺系統(tǒng),程序是基于時間的循環(huán)輪轉(zhuǎn)系統(tǒng).AD5V代表最大量程5V.按照圖2的分層思路,AD5V在底層進(jìn)行封裝,并留出初始化接口函數(shù)和獲取電壓接口函數(shù):
ret_t ecmad5VddiInit (uint16_t Channel,int mode);
int32_t ecmAI5ddiGetVol(uint16_t Channel);
以初始化為例,在TLC文件中將如圖3的AD模塊中的配置參數(shù)(Supply項為標(biāo)記不與形參對應(yīng))傳遞給接口函數(shù)
%assign Channel=CAST("Number",SFcnParamSettings.Channel)
%assign Mode=CAST("Number",SFcnParamSettings.Mode)
%assign Supply=CAST("Number",SFcnParamSettings.Supply)
/* S-Function "INIT_ad5V" initialization Block:%
ecmad5VddiInit(%
圖3 AD 模塊Fig.3 AD module
配置面板中選擇創(chuàng)建的系統(tǒng)TLC文件作為System target file,代碼生成的默認(rèn)選項與系統(tǒng)TLC設(shè)置對應(yīng).通過系統(tǒng)TLC設(shè)置,可提供代碼生成后編譯、下載或無操作的選項.
圖4 MATLAB/Simulink測試模型Fig.4 Test model in MATLAB/Simulink
搭建如圖5所示MATLAB/Simulink測試模型,通過PIT定時模塊設(shè)置定時任務(wù)[11],I/O模塊采集信號并進(jìn)行邏輯運(yùn)算并輸出.硬件驅(qū)動模塊在底層IDE工具中完成,在MATLAB/Simulink模型初始化時,獲取工程模板文件路徑;系統(tǒng)編寫通過修改對應(yīng)部分的系統(tǒng)TLC文件和M文件完成,利用COM技術(shù),實(shí)現(xiàn)對CodeWarrior的生成控制.
圖5 自動代碼生成的工程文件Fig.5 Project of automatic code generation
運(yùn)行“build model”,新生成的工程會新增如圖5“Sources”文件夾下的多個文件,其中s12x100_main,程序的main文件;model.h/c包含模型數(shù)據(jù)模型算法邏輯,是程序入口與核心,其他文件與宏定義結(jié)構(gòu)體等有關(guān).“model”代表模型的實(shí)際命名,工程目錄中為“Interrrupt_led”.另外,若需要進(jìn)一步優(yōu)化代碼,提高模塊重用性,提升代碼簡潔性等,需要在配置參數(shù)界面內(nèi)設(shè)置.
MATLAB作為現(xiàn)在重要的工具軟件,深入探究其RTW工作的原理,結(jié)合COM技術(shù),成功實(shí)現(xiàn)代碼的生成代碼與底層的整合.合適的軟件結(jié)構(gòu)設(shè)計,合理的工作分工,能夠提升開發(fā)的效率,并減少了TLC代碼的工作量,更加符合一般硬件工程師開發(fā)習(xí)慣.對于自動代碼生成的研究,對于快速原型開發(fā)和V流程設(shè)計有較好的借鑒意義.
[1] Guo Xiao-qiang,Zhao Gang,Huang Kun.Auto-generation of TI C2000 DSP code on MATLAB/simulink bench[J].Science Technology & Engineering,2011,11(13):2941-2944.
[2] Hong Xiao-jun,Zhu Lei.Vehicle controller rapid prototype based on the automatic code generation technology on MATLAB/RTWEC [J].Mecha Tronics,2014,20(8):47-52.
[3] Yang Xiang,An Jin-wen,Cui Wen-ge.The research on application of embedded auto code generation[J].Journal of Projectiles Rockets Missiles & Guidance,2008,28(3):250-253.
[4] Guo Wen-sheng,Wang Yong,Yang Xia,et al.Codecomb:automated test case generation and defect detecting for embedded software based on symbolic execution[J].Journal of Chinese Computer Systems,2017,38(6):1250-1255.
[5] Yang Di.The environment and application of system real time simulation and development[M].Beijing:Tsinghua University Press,2002:32-37.
[6] Liu Jie,Weng Gong-yu,Zhou Yu-bo.The design of the model-MCU[M].Beijing:Beihang University Press Based on,2011:152-218.
[7] Zhang De-feng.MATLAB and external programming interface programming [M].Beijing:Machinery Industry Press,2009:192-209.
[8] Ren Jia-li,Cao Hai-yan.Research of code auto-generation and integration for the embedded software[J].Journal of Taiyuan University of Technology,2013,44(4):518-521.
[9] Zhang Wei,Wu Yi-jian,Shen Li-wei,et al.Software product line evolution driven by source code changes[J].Journal of Chinese Computer Systems,2017,38(5):919-924.
[10] Feng Hui-zong,Zhu Peng,Jiang Jian-chun,et al.Research on driver code quick generation technology based on real-time workshop[J].Computer Application and Software,2016,33(3):226-228.
[11] Gong Wei-wei,Wang Rui,Li Xiao-juan.Modeling and validation of cognitive robot control behavior using uppaal [J].Journal of Chinese Computer Systems,2016,37(6):1279-1283.
附中文參考文獻(xiàn):
[1] 郭小強(qiáng),趙 剛,黃 昆.基于MATLAB/Simulink平臺下TI C2000 DSP代碼的自動生成[J].科學(xué)技術(shù)與工程,2011,11(13):2941-2944.
[2] 洪曉君,朱 磊.基于MATLAB/RTWEC自動代碼生成技術(shù)整車控制器快速原型開發(fā)[J].機(jī)電一體化,2014,20(8):47-52.
[3] 楊向忠,安錦文,崔文革.嵌入式自動代碼生成技術(shù)應(yīng)用研究[J].彈箭與制導(dǎo)學(xué)報,2008,28(3):250-253.
[4] 郭文生,汪 勇,楊 霞,等.Codecomb:基于符號執(zhí)行的嵌入式軟件測試案例自動生成與缺陷檢測[J].小型微型計算機(jī)系統(tǒng),2017,38(6):1250-1255.
[5] 楊 滌.系統(tǒng)實(shí)時仿真開發(fā)環(huán)境與應(yīng)用[M].北京:清華大學(xué)出版社,2002:32-37.
[6] 劉 杰,翁公羽,周宇博.基于模型的設(shè)計—MCU篇[M].北京:北京航空航天大學(xué)出版社,2011:152-218.
[7] 張德豐.MATLAB與外部程序接口編程[M].北京:機(jī)械工業(yè)出版社,2009:192-209.
[8] 任佳麗,曹海燕.嵌入式軟件自動代碼生成和代碼整合方法研究[J].太原理工大學(xué)學(xué)報,2013,44(4):518-521.
[9] 張 薇,吳毅堅,沈立煒,等.代碼變更驅(qū)動的軟件產(chǎn)品線演化方法[J].小型微型計算機(jī)系統(tǒng),2017,38(5):919-924.
[10] 馮輝宗,朱 澎,蔣建春,等.基于RTW的驅(qū)動代碼快速生成技術(shù)研究[J].計算機(jī)應(yīng)用與軟件,2016,33(3):226-228.
[11] 鞏衛(wèi)衛(wèi),王 瑞,李曉娟.基于UPPAAL的認(rèn)知機(jī)器人控制行為建模與驗證[J].小型微型計算機(jī)系統(tǒng),2016,37(6):1279-1283.