徐旭
?
Simulink 環(huán)境下的TCU代碼集成方法
徐旭
(陜西法士特汽車傳動(dòng)工程研究院智能傳動(dòng)研究所,陜西 西安 710119)
將Simulink環(huán)境下搭建的模型轉(zhuǎn)化為C代碼,通過(guò)調(diào)用MCU(微處理器)的編譯器將這些C代碼進(jìn)行編譯,并封裝為庫(kù)文件,ECU基礎(chǔ)軟件在IDE環(huán)境下也封裝為庫(kù)文件,最終在Simulink環(huán)境下通過(guò)調(diào)用MCU編譯器的鏈接器進(jìn)行兩個(gè)庫(kù)文件的合并,最終生成MCU可執(zhí)行的二進(jìn)制文件。
Simulink;編譯器;庫(kù)文件;鏈接
隨著Simulink建模技術(shù)在汽車行業(yè)中的的應(yīng)用,越來(lái)越多的算法工程師開(kāi)始在Simulink下進(jìn)行控制邏輯的模型搭建,以便提高控制算法的設(shè)計(jì)及驗(yàn)證周期,Simulink環(huán)境本身具有強(qiáng)大的軟件模型庫(kù),可供軟件工程師根據(jù)自己的需求從庫(kù)中提取需要的模塊進(jìn)行任意邏輯的組合,在該環(huán)境下可通過(guò)仿真輸入驗(yàn)證整個(gè)控制過(guò)程的動(dòng)態(tài)響應(yīng)。
驗(yàn)證完的算法需要運(yùn)行在ECU(Electronic Control Uint)控制器上才能真正的將工程師的設(shè)計(jì)運(yùn)用到實(shí)踐中來(lái)。
這就提出了將Simulink模型轉(zhuǎn)化為控制器認(rèn)識(shí)的 – 可執(zhí)行文件的問(wèn)題,控制器內(nèi)部是由MCU(微處理器)及外設(shè)驅(qū)動(dòng)(CAN驅(qū)動(dòng)、輸入、輸出驅(qū)動(dòng))組成的一個(gè)電控單元,其主體是類似于人類大腦的MCU在接收外界的輸入信號(hào),根據(jù)內(nèi)部提前設(shè)計(jì)好的運(yùn)算邏輯,進(jìn)行計(jì)算后再輸出,從而讓執(zhí)行機(jī)構(gòu)產(chǎn)生相應(yīng)的動(dòng)作。
MCU內(nèi)部運(yùn)行的是編譯器編譯后生成的二進(jìn)制文件 – Interl格式的Hex文件,編譯器類似于一個(gè)翻譯者的角色,將人們?cè)谟?jì)算機(jī)上書(shū)寫(xiě)的高級(jí)語(yǔ)言(C語(yǔ)言)翻譯成MCU可讀懂的機(jī)器語(yǔ)言。
這就需要我們?cè)赟imulink環(huán)境下調(diào)用MCU的編譯器對(duì)Simulink生成的C代碼進(jìn)行編譯,并與ECU的基礎(chǔ)軟件進(jìn)行鏈接,從而最終生成Hex文件。
Simulink本身是MATLAB軟件中的一個(gè)功能模塊,主要用來(lái)進(jìn)行基于模型的開(kāi)發(fā),從MATLAB的軟件環(huán)境來(lái)看,其隸屬關(guān)系如圖1。
圖1 MATLAB軟件開(kāi)發(fā)環(huán)境示意圖
Simulink內(nèi)置Embedded Coder工具可實(shí)現(xiàn)將Simulink模型生成符合嵌入式系統(tǒng)使用的C代碼功能,其內(nèi)置的命令 rtwbuild ( model ),可一鍵式將模型轉(zhuǎn)化為C代碼,參數(shù)model是需要生成C代碼的模型名。
在實(shí)際中我們常使用的命令是rtwbuild (subsystem, ‘Mode’,‘ExportFunctionCalls’),該命令可針對(duì)模型( model )中的某一個(gè)子系統(tǒng)(Subsystem)進(jìn)行C代碼的生成,將模型中的子系統(tǒng)生成一個(gè)獨(dú)立的函數(shù)(model.c文件)。
所以我們可通過(guò)RTW命令實(shí)現(xiàn)模型轉(zhuǎn)化為C代碼的過(guò)程。
大型的Simulink模型生成的C文件往往不止一兩個(gè),隨著模型中子系統(tǒng)數(shù)量的增加,生成的C文件常多達(dá)幾十個(gè),如何將這些文件準(zhǔn)確、可靠的與ECU基礎(chǔ)軟件進(jìn)行“合并”是我們?cè)谶M(jìn)行代碼集成過(guò)程中需要考慮的,這里我們通過(guò)庫(kù)文件的形式來(lái)將Simulink生成的C代碼進(jìn)行封裝。
所謂的庫(kù)文件也就是一系列工程文件的集合,而工程文件也就是原始C文件經(jīng)過(guò)編譯后生成的文件。
圖2展示的C代碼的典型編譯工程(以hello.c文件為例),該文件會(huì)先后經(jīng)過(guò)預(yù)編譯、編譯、匯編三個(gè)步驟,匯編后生成的hello.o文件就是工程文件,該文件已經(jīng)將C語(yǔ)言書(shū)寫(xiě)的高級(jí)語(yǔ)言轉(zhuǎn)化了MCU可認(rèn)識(shí)的機(jī)器語(yǔ)言,我們將這些工程文件進(jìn)行打包合并后可以生成庫(kù)文件hello.lib(可類比理解為壓縮文件)。
圖2 C文件典型編譯過(guò)程示意圖
ECU基礎(chǔ)軟件的開(kāi)發(fā)通常是在MCU專屬的編譯器環(huán)境下進(jìn)行的(俗稱的IDE – 集成開(kāi)發(fā)環(huán)境),軟件開(kāi)發(fā)工程師在該環(huán)境下進(jìn)行手工代碼的編寫(xiě)與功能的開(kāi)發(fā),IDE環(huán)境下本身就支持C代碼的編譯功能,可通過(guò)一鍵式的“BUILD”功能按鍵將工程路徑下的C代碼進(jìn)行編譯,并通過(guò)前期的編譯選項(xiàng)設(shè)置,將工程文件生成為基礎(chǔ)軟件庫(kù)文件 – BSW.lib。
合并也就是將上述的兩個(gè)庫(kù)文件進(jìn)行鏈接的過(guò)程,鏈接器(linker)是編譯器軟件中的一個(gè)子軟件,是專門(mén)用來(lái)實(shí)現(xiàn)代碼鏈接的工具,代碼鏈接的過(guò)程類似于積木的拼接過(guò)程,將hello.lib與BSW.lib中的外部符號(hào)進(jìn)行查找,然后將符號(hào)的地址填充到對(duì)應(yīng)的代碼中,當(dāng)所有的符號(hào)都可準(zhǔn)確定位和填充后,則可以生成Hex文件。
綜上所述,為了將Simlink模型轉(zhuǎn)化為Hex文件,先需要通過(guò)RTW命令將模型轉(zhuǎn)化為C代碼,并調(diào)用MCU編譯器將C代碼封裝為庫(kù)文件,ECU基礎(chǔ)軟件開(kāi)發(fā)人員則并行在MCU IDE環(huán)境下進(jìn)行基礎(chǔ)軟件的開(kāi)發(fā)工作,并也封裝為庫(kù)文件,最終在Simulink環(huán)境下通過(guò)調(diào)用MCU的連接器將上下層的庫(kù)文件進(jìn)行合并,生成Hex文件。
圖3 Simulink環(huán)境下的代碼集成方法示意圖
[1] 孫忠瀟.Simulink仿真及代碼生成技術(shù)入門(mén)到精通[M].北京航空航天大學(xué)出版社,2015.
Binary Code Generation of TCU Embedded System In Simulink
Xu Xu
( Shaanxi Fast Auto Drive Engineering Research Insitute, Shaanxi Xi’an 710119 )
Convert the Simulink model to C code, invoke MCU compiler to compile the C code into static library, and compile the ECU basic software into static libraty under the IDE, link both library in Simulink and generate the final binary code.
Simulink; Complier; Library file; Link
U467
A
1671-7988(2019)07-73-02
徐旭,電器工程師,中級(jí)工程師,就職于陜西法士特汽車傳動(dòng)研究院智能傳動(dòng)研究所,主要從事嵌入式系統(tǒng)軟件開(kāi)發(fā),AutoSAR平臺(tái)下的底層軟件開(kāi)發(fā),Simulink代碼集成等方面的研究工作。
U467
A
1671-7988(2019)07-73-02
10.16638/j.cnki.1671-7988.2019.07.024