日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于Simulink模型的嵌入式代码生成与实际工程应用

發(fā)布時(shí)間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于Simulink模型的嵌入式代码生成与实际工程应用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔

文章目錄

  • 前言
  • 一、工程創(chuàng)建
  • 二、代碼生成
    • 1.搭建模塊
    • 2.設(shè)置參數(shù)
    • 3.自動(dòng)生成
  • 三、代碼整合
  • 總結(jié)


前言

在嵌入式開發(fā)中,利用Simulink的相關(guān)功能模塊搭建邏輯流程以后,一個(gè)非常重要的步驟就是利用代碼生成功能將我們搭建的功能轉(zhuǎn)化為代碼,并且和嵌入式平臺(tái)的芯片軟件工程融合,使我們開發(fā)的功能在單片機(jī)上跑起來,從而實(shí)現(xiàn)產(chǎn)品的功能要求。


一、工程創(chuàng)建

這次使用Simulink搭建的工程的目標(biāo)產(chǎn)品是車載智能保險(xiǎn)盒,前兩篇文章中的CAN模塊、雨刮模塊等都是其中的功能,這些功能組裝起來通過一個(gè)完整的simulink project進(jìn)行管理。以功能為文件夾,把相關(guān)的功能文件進(jìn)行統(tǒng)一歸類。我的理解這樣創(chuàng)建的工程類似于代碼編輯時(shí)在編譯器中創(chuàng)建的工程。
就像KEIL或者IAR中可以進(jìn)行編譯,運(yùn)行操作一樣,simulink項(xiàng)目也可以進(jìn)行model test、依存關(guān)系查看、運(yùn)行檢查等操作。版本管理也集成了SVN或git,只需要進(jìn)行簡單的設(shè)置也可以實(shí)現(xiàn)。我用的就是SVN進(jìn)行版本管理,但是習(xí)慣上還是直接拷貝文件夾進(jìn)行update和commit。

二、代碼生成

1.搭建模塊

生成代碼每個(gè)模塊的操作是一樣的,設(shè)置參數(shù)和操作。本文采用近光燈模塊進(jìn)行解釋,主要因?yàn)榻饽K功能比較簡單。信號量較少,且邏輯簡單。主要信號如下:
輸入信號:
1、點(diǎn)火開關(guān)IGN信號
2、大燈供電信號
3、近光燈開關(guān)信號
4、短路判斷信號
5、開路判斷信號
6、報(bào)文刷新標(biāo)志
輸出信號:
1、近光燈繼電器的控制信號
2、CAN報(bào)文信號
3、報(bào)文發(fā)送標(biāo)志位
其中報(bào)文刷新標(biāo)志和報(bào)文發(fā)送標(biāo)志是系統(tǒng)內(nèi)部的判斷信號,不作為對外的輸出,相當(dāng)于寫代碼時(shí)設(shè)置的標(biāo)志位是一個(gè)局部變量。
工能邏輯結(jié)構(gòu)如下:

一 整體結(jié)構(gòu)

二 內(nèi)部結(jié)構(gòu)

三 stateflow

功能搭建完成以后,點(diǎn)擊RUN圖標(biāo),若未報(bào)錯(cuò)證明語法上結(jié)構(gòu)正確是符合了生成代碼的前提條件,至于控制邏輯是否正確可以通過dashboard搭建指示燈進(jìn)行仿真,仿真的方法可參考前文《Simulink模型實(shí)現(xiàn)汽車雨刮基本功能并仿真》。

2.設(shè)置參數(shù)

點(diǎn)擊工具欄上面model setting的齒輪圖標(biāo),進(jìn)入設(shè)置參數(shù)界面

以本項(xiàng)目生成嵌入式代碼為例,主要需要調(diào)節(jié)的參數(shù)設(shè)置如下:

solver解算器下,Solever selection解算器選擇,type選fixed-step(定步長),solver選discrete(離散型)
細(xì)節(jié)選項(xiàng)fixed-step size設(shè)置為0.01,采樣步長為0.01s,這個(gè)參數(shù)關(guān)系到在嵌入式工程中多久調(diào)用一次功能循環(huán),以本項(xiàng)目為例,設(shè)置為0.01s也就意味著,每10ms調(diào)用一次功能函數(shù),要是不按照設(shè)定值進(jìn)行定時(shí)中斷,那么會(huì)影響模塊中的計(jì)時(shí)操作。


code generation選項(xiàng)中主要需要注意的是兩個(gè)參數(shù),一個(gè)是System target file要選為ert.tlc,另一個(gè)就是Language要選C語言。


Report選項(xiàng)中選擇生成代碼報(bào)告,一般勾選前兩項(xiàng)分別是生成報(bào)告和自動(dòng)打開,第三個(gè)web view可選可不選。


根據(jù)所用單片機(jī)型號我們要在Hardware Implementation中選擇相對應(yīng)的單片機(jī)廠商和內(nèi)核類型,本項(xiàng)目所用的是NXP,cortexM4內(nèi)核S32k148芯片,選擇相應(yīng)選項(xiàng)。這里選擇不像Keil這類編譯器那么詳細(xì),主要作用就是確定單片機(jī)一些數(shù)據(jù)類型定義的位數(shù),以及是否支持長整型等,點(diǎn)開detail可以看到詳細(xì)。

3.自動(dòng)生成

在完成以上步驟以后,就可以進(jìn)行生成代碼操作了。首選在APP選項(xiàng)中選擇embedded coder功能卡,如下:

選擇以后進(jìn)入embedded coder APP

點(diǎn)擊Build按鈕,生成嵌入式C代碼


代碼生成以后會(huì)自動(dòng)出現(xiàn)在右側(cè),方便我們查看。


因?yàn)槲覀児催x了生成Report選項(xiàng),所以還會(huì)出現(xiàn)一個(gè)報(bào)告對話框,在報(bào)告里面可以查看本模塊生成代碼的相關(guān)內(nèi)容,包括代碼預(yù)覽,模型信息,占用內(nèi)存多少等信息。


我們在生成的代碼中可以看到很多文件,但又用的主要就是功能相關(guān)的 LowBeam.c 和 LowBeam.h 這兩個(gè)文件,其他的文件除了ert_main以外的可以不用管,直接拷貝放到我們自己的代碼工程目錄下。ert_main不用,我們用自己的main函數(shù),不過可以參考ert_main中對功能函數(shù)的調(diào)用方法。

三、代碼整合

按照上述的方法自動(dòng)生成了代碼以后,離成功使用還有最后一步操作,那就是將這些文件添加到工程并且與驅(qū)動(dòng)代碼相配合。針對這款芯片,其他同事已經(jīng)進(jìn)行了平臺(tái)化的開發(fā),提供了相關(guān)的接口,包括ADC、GPIO、CAN等資源都已經(jīng)進(jìn)行了封裝,我們所需要做的就是接口對應(yīng)。還是以本近光燈功能模塊為例,LowBeam.c文件,幾乎可以不用去管,那是Matlab軟件根據(jù)我們搭建的Simulink邏輯自動(dòng)生成的代碼,可讀性不是很強(qiáng),但功能肯定是實(shí)現(xiàn)的。我們進(jìn)行接口對應(yīng),關(guān)注LowBeam.h文件就好。
在.h文件中找到如下代碼:

/* External inputs (root inport signals with default storage) */ typedef struct {IGN IG; /* '<Root>/IGN' */uint8_T Front_Power_Supply; /* '<Root>/Front_Power_Supply' */uint8_T Work_Cmd; /* '<Root>/Work_Cmd' */uint8_T IS_Opencircuit; /* '<Root>/DILAMP_Open' */uint8_T IS_Shortcircuit; /* '<Root>/DILAMP_Short' */uint8_T New_Can_Flag; /* '<Root>/New_Can_Flag' */ } ExtU_LowBeam_T;/* External outputs (root outports fed by signals with default storage) */ typedef struct {uint8_T Low_Beam_On; /* '<Root>/Low_Beam_On' */uint8_T Can_Send_Flag; /* '<Root>/Can_Send_Flag' */CAN_MESSAGE_BUS CAN_Msg_HighBeam; /* '<Root>/CAN_Msg_HighBeam' */ } ExtY_LowBeam_T;

ExtU_LowBeam_T代表輸入信號的結(jié)構(gòu)體;ExtY_LowBeam_T代表輸出信號的結(jié)構(gòu)體。都是以全局變量的形式進(jìn)行賦值。
我們自己寫一個(gè)賦值函數(shù):

/*近光燈模塊*/LowBeam_U.New_Can_Flag = (uint8_T)can_status_store.bit.store_Newflag_LowBeam;LowBeam_U.Front_Power_Supply = (FrontLampTogether_Y.Left_Together_ON & FrontLampTogether_Y.Right_Together_ON);LowBeam_U.Work_Cmd = CAN_Receive_Model_Y.LowBeam_WorkCmd;LowBeam_U.IG = CAN_Receive_Model_Y.IGN_Sig;LowBeam_U.IS_Opencircuit = (Output_Current_U.DILamp_FL_DRV < LOWBEAM_CURRENT_MIN) || (Output_Current_U.DILamp_FR_DRV < LOWBEAM_CURRENT_MIN) ? 1: 0;LowBeam_U.IS_Shortcircuit = (Output_Current_U.DILamp_FL_DRV > LOWBEAM_CURRENT_MAX) ||(Output_Current_U.DILamp_FR_DRV > LOWBEAM_CURRENT_MAX) ? 1: 0;

其中涉及到其他模塊的一些信號,但這些都是獨(dú)立的全局變量,可以直接拿來進(jìn)行邏輯判斷。

輸出信號:

if(LowBeam_Y.Low_Beam_On == 1){HSD_SET_LEFT_LOWBEAM_ON; //打開左近光燈HSD_SET_RIGHT_LOWBEAM_ON; //打開又近光燈} else{HSD_SET_LEFT_LOWBEAM_OFF; //關(guān)閉左近光燈HSD_SET_RIGHT_LOWBEAM_OFF; //關(guān)閉右近光燈}

對輸出函數(shù)進(jìn)行了封裝,這里直接調(diào)用即可。

針對總線信號,寫一個(gè)賦值函數(shù):

void set_can_LowBeam_output(void) {if(LowBeam_Y.Can_Send_Flag){if(can_send_output_set(CAN_INSTANCE_SET, &LowBeam_Y.CAN_Msg_HighBeam) == CAN_EOK) //發(fā)送報(bào)文{LowBeam_Y.Can_Send_Flag = 0;}} }

這里直接用了can_send_output_set()這個(gè)發(fā)送報(bào)文用的接口函數(shù)。

最后是在main函數(shù)中調(diào)用功能函數(shù),我們在生成的LowBeam.h文件中可以看到三個(gè)函數(shù)申明:

/* Model entry point functions */ extern void LowBeam_initialize(void); extern void LowBeam_step(void); extern void LowBeam_terminate(void);

實(shí)際我們需要用到的只有LowBeam_step(void)這個(gè)函數(shù),在main函數(shù)的主循環(huán)中每10ms調(diào)用一次該函數(shù)即可:

if(Get1MsTickInterval(modeldely) >= 10{ modeldely = Get1MsTickVal(); LowBeam_step(); //近光燈 }

其他的功能模塊都可以按照這樣的方法把_step函數(shù)添加在近光燈函數(shù)的下面。


總結(jié)

以上就是今天要講的內(nèi)容,本文簡單介紹了通過Simulink搭建的邏輯框圖如何生成嵌入式代碼,并且將生成的代碼添加到已有的單片機(jī)工程中實(shí)現(xiàn)近光燈模塊的功能。

當(dāng)然,自動(dòng)代碼生成在工程的調(diào)用需要多一層封裝,占用了一定的資源。且對于一些業(yè)務(wù)熟練的工程師來說,一些簡單的邏輯手寫可以用很精簡的C代碼量實(shí)現(xiàn)同樣的功能。不過,我們采用自動(dòng)代碼生成技術(shù)也有相應(yīng)的好處,比如在功能邏輯較為復(fù)雜時(shí)可以更清楚的理清思路,而且simulink可方便的進(jìn)行功能仿真,驗(yàn)證功能步驟可以放在生成代碼之前,而手寫代碼則必須在編譯通過以后燒錄到樣件中利用硬件設(shè)備進(jìn)行功能測試。這樣一來,自動(dòng)利用simulink進(jìn)行功能仿真和代碼自動(dòng)生成,就省去了反復(fù)的燒錄過程。

當(dāng)然,simulink的代碼生成功能遠(yuǎn)不止本文所提到的部分,筆者還會(huì)在項(xiàng)目中探索,在以后的文章中和大家進(jìn)一步探討。

總結(jié)

以上是生活随笔為你收集整理的基于Simulink模型的嵌入式代码生成与实际工程应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。