<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > Matlab/RTW EC面向MC9S12D64的自動代碼生成

          Matlab/RTW EC面向MC9S12D64的自動代碼生成

          作者: 時間:2016-09-12 來源:網(wǎng)絡 收藏

          摘要:傳統(tǒng)的電控軟件開發(fā)模式已無法滿足日益龐大、復雜的汽車電控系統(tǒng)的開發(fā)要求,基于模型的開發(fā)方法以及自動技術(shù)在汽車嵌入式軟件開發(fā)中得到越來越廣泛的應用。本文介紹使用Matlab/Real-Time Workshop Embedded Coder(Matlab/)將Simulink控制模型生成C代碼以及生成代碼與Freescale MC9S12D64單片機底層代碼的集成方法,通過測試驗證了生成代碼的有效性。

          本文引用地址:http://www.ex-cimer.com/article/201609/305079.htm

          引言

          隨著汽車電子控制系統(tǒng)的日益復雜化,以及用戶對產(chǎn)品安全性、可靠性的要求,嵌入式應用的開發(fā)難度與代碼量都在迅速增加。目前,一臺中高檔汽車的軟件控制代碼就超過了500萬行,通用雪佛蘭Volt整車的代碼量超過1 000萬行,而一輛功能先進的醫(yī)療急救車甚至需要超過5 000萬行的軟件代碼,而且隨著設(shè)計內(nèi)容的增加、多變的新特征、模糊的設(shè)計參數(shù)以及用戶不斷增加的需求,程序員的勞動量大大增加,傳統(tǒng)的手工編程方式越來越不能適應現(xiàn)代汽車電控系統(tǒng)的設(shè)計開發(fā)要求。

          Matlab/Real-Time Workshop Embedded Coder(Matlab/RTW EC)是MathWorks公司提供的嵌入式代碼自動生成工具,它能夠快速地將Matlab/Simulink控制器模型自動生成優(yōu)化的、可移植的產(chǎn)品級C代碼,并根據(jù)特定的目標配置自動生成實時應用程序,從而大大減輕軟件工程師的工作量,縮短的開發(fā)周期,提高開發(fā)效率。本文以Freescale MC9S12D64單片機為目標芯片,說明從Simulink控制模型生成目標嵌入式代碼的方法。

          1 基于模型的設(shè)計

          基于模型的設(shè)計是利用計算機建模仿真技術(shù),快速完成嵌入式產(chǎn)品等產(chǎn)品開發(fā)過程中核心算法的開發(fā)和驗證工作,利用自動技術(shù)快速完成產(chǎn)品開發(fā)中的邏輯功能、處理算法的實現(xiàn),同時利用模型的方法構(gòu)造出被控對象,方便、快捷、大量重復地進行產(chǎn)品控制效果的驗證工作。相比于傳統(tǒng)的開發(fā)模式,基于模型的設(shè)計開發(fā)流程具有以下一些優(yōu)點:

          ①在統(tǒng)一的開發(fā)測試平臺上,讓設(shè)計從需求分析階段就開始驗證與確認,并做到持續(xù)不斷地驗證與測試,讓設(shè)計的缺陷盡量暴露在開發(fā)的初級階段。

          ②讓工程師把主要精力放在算法和測試用例的研究上,嵌入式C代碼的生成與驗證留給計算機去自動完成。

          ③模型的復用性好,易于維護和移植。

          ④大大縮短開發(fā)周期并降低開發(fā)成本。

          Matlab/RTW EC面向MC9S12D64的自動代碼生成

          圖1為基于模型的設(shè)計開發(fā)流程。在基于模型的設(shè)計方法中,系統(tǒng)工程師首先要建立一個系統(tǒng)模型來精確、無歧義地描述用戶的需求,創(chuàng)建一個可執(zhí)行、可跟蹤的技術(shù)規(guī)范,并在系統(tǒng)模型與需求之間建立雙向鏈接。在整個開發(fā)過程中,工程師利用測試用例追蹤系統(tǒng)級模型和需求,了解系統(tǒng)模型的功能覆蓋度。這些測試通常包括以下三種:

          ①軟件在環(huán)測試(Software-in-the-Loop,SIL)是對模型生成的代碼或者手寫代碼進行非實時仿真,目的是為了驗證生成的代碼和模型在功能上的等效性。

          ②處理器在環(huán)測試(Processor-in-the-Loop,PIL)是將自動生成的C代碼下載到目標處理器中,與被控對象一起進行非實時的聯(lián)合仿真,目的是為了測量模型生成的代碼在目標處理器上的運行時間,即檢查運行速度和資源消耗。

          ③硬件在環(huán)測試(Hardware-in-the-Loop,HIL)是把被控對象的模型生成C代碼并編譯成可執(zhí)行的文件放到工控機上運行,然后把控制器和工控機通過線|連接,實現(xiàn)閉環(huán)控制,檢查整個系統(tǒng)功能。

          顯然,算法的實現(xiàn)是聯(lián)系系統(tǒng)模型和在環(huán)測試驗證的重要紐帶,這其中所涉及的代碼自動生成技術(shù)是基于模型開發(fā)方法的關(guān)鍵技術(shù)之一。自動的基本流程包括:運行Model Advisor進行模型檢查、配置代碼生成選項、生成代碼、檢查生成的代碼及報告以及測試生成的代碼等5個環(huán)節(jié)。

          Matlab/RTW EC面向MC9S12D64的自動代碼生成

          生成代碼的過程如圖2所示。用戶在Matlab/Simulink/Stateflow建立的算法模型經(jīng)過Simulink編譯器生成rtw中間文件;rtw文件是一個描述整個模型的結(jié)構(gòu)體文本,包含模型中的參數(shù)、變量、模塊名稱以及為代碼生成所做的各種配置,rtw文件經(jīng)過目標語言編譯器(Target Lang uage Compiler,TLC)生成C語言代碼,最后通過C編譯器得到最終的可執(zhí)行程序。

          2 流水燈模型建立及嵌入式代碼生成

          流水燈Simulink功能驗證模型,通過設(shè)置脈沖發(fā)生函數(shù)的周期和占空比,使LED燈按照一定的時間間隔順時針方向輪流點亮。示意圖略一一編者注。

          將流水燈功能驗證模型中的脈沖生成器和Goto模塊分別使用In、Out模塊替換后得到的自動代碼生成模型如圖3所示。

          Matlab/RTW EC面向MC9S12D64的自動代碼生成

          在Configuration Parameters中對代碼生成過程進行相關(guān)的配置并指定變量的數(shù)據(jù)類型后,Matlab/RTW EC依據(jù)上述的流水燈控制模型自動生成了ert_ main.c、LightsCtr.c、LightsCtr.h、LightsCtr_private.h、LightsCtr_types.h、LightsCtr_private.h、rt wty pes.h等6個文件。其中,ert_main.c提供了算法函數(shù)調(diào)用的樣例程序,它包括main()、rt_OneStep()函數(shù)。LightsCtr.c包含了Lights Ct rinitialize()、LightsCtrstep()、LightsCtr_terminate()函數(shù),是整個模型的算法實現(xiàn)代碼。

          3 應用層底層代碼集成

          Matlab/RTW EC生成的應用層代碼和特定芯片的驅(qū)動代碼集成目前主要有兩種方式:一種方式是在建模過程中,將驅(qū)動程序封裝為S函數(shù)模塊,代碼自動生成的過程中建立相應芯片的TLC模板文件,實現(xiàn)一鍵從模型到編澤代碼下載到控制器芯片中。第二種方式是在集成開發(fā)環(huán)境(Integrated Development Environment,IDE)中手工進行代碼集成。

          在產(chǎn)品化的項目開發(fā)中,采用第一種方式集成代碼,需要對底層驅(qū)動建模,存在以下的困難:①底層驅(qū)動在Simulink環(huán)境下不能仿真;②底層驅(qū)動建模需要熟悉TLC腳本語言;③產(chǎn)品化項目的底層軟件往往很大,開發(fā)一個安全、可靠的底層模塊庫,針對特定的目標板定制TLC文件等,都需要大量的時間投入,不易操作。


          上一頁 1 2 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();