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