欧美人与禽2O2O性论交,秋霞免费视频,国产美女视频免费观看网址,国产成人亚洲综合网色欲网

嵌入式 開發(fā) 軟件(嵌入式開發(fā)軟件有哪些)

提示:文章撰寫完成后,可以自動生成目錄,如何生成請參考右側幫助文檔。

目錄

前言

嵌入式開發(fā)中,利用Simulink的相關功能模塊搭建好邏輯流程之后,很重要的一個步驟就是利用代碼生成功能將我們搭建好的函數轉換成代碼,并與嵌入式平臺的芯片軟件工程進行融合,使得我們開發(fā)出來的函數能夠在單片機上運行,??從而實現產品的功能需求。

1. 項目創(chuàng)建

本次用Simulink搭建的項目目標產品是車載智能保險絲盒,前兩篇文章中的CAN模塊、雨刮器模塊都是該項目的函數,這些函數通過一個完整的Simulink項目進行組裝和管理,函數之間以文件夾的形式,將相關的函數文件統(tǒng)一歸類,我的理解是這樣建立的工程和編輯代碼時在編譯器中建立的工程類似。

嵌入式 開發(fā) 軟件(嵌入式開發(fā)軟件有哪些)

和在KEIL或者IAR中編譯運行一樣,simulink工程也可以進行模型測試、依賴檢查、運行檢查等。版本管理也集成了SVN或者git,簡單設置即可實現。我使用SVN進行版本管理,不過一般都是直接復制文件夾進行更新、提交即可。

2. 代碼生成 1. 構建模塊

各個模塊的操作都一樣,設置參數和操作。本文以近光模塊為例進行說明,主要是因為近光模塊功能比較簡單,信號量小,邏輯簡單,主要信號如下:

輸入信號:

1. 點火開關IGN信號

2. 大燈電源信號

3. 近光燈開關信號

4.短路判斷信號

5.開路判斷信號

6. 消息刷新標志

輸出信號:

1.近光繼電器控制信號

2. CAN 報文信號

3. 消息發(fā)送標志

消息刷新標志和消息發(fā)送標志是系統(tǒng)內部判斷信號,不作為對外輸出,相當于寫代碼時設置的標志位是局部變量。

功能邏輯結構如下:

總體結構

嵌入式 開發(fā) 軟件(嵌入式開發(fā)軟件有哪些)

2. 內部結構

嵌入式 開發(fā) 軟件(嵌入式開發(fā)軟件有哪些)

三狀態(tài)流

嵌入式 開發(fā) 軟件(嵌入式開發(fā)軟件有哪些)

函數搭建完成后點擊RUN圖標,若無報錯則證明語法結構正確,滿足生成代碼的前提條件。至于控制邏輯是否正確,可以通過搭建儀表盤上的指示燈進行仿真,仿真方法請參考上一篇文章《Simulink模型實現汽車雨刮器基本功能并仿真》。

2.設置參數

點擊工具欄模型設置的齒輪圖標,進入參數設置界面

嵌入式 開發(fā) 軟件(嵌入式開發(fā)軟件有哪些)

以本項目中嵌入代碼的生成為例,主要需要調整的參數設置如下:

嵌入式 開發(fā) 軟件(嵌入式開發(fā)軟件有哪些)

在求解器下,選擇求解器選擇,類型選擇固定步長,求解器選擇離散

細節(jié)選項fixed-step size設置為0.01,采樣步長為0.01s。這個參數和嵌入式工程中函數循環(huán)調用的頻率有關,以本工程為例,設置為0.01s表示每10ms調用一次該函數。如果不按照設置值進行定時中斷,將會影響模塊中的定時操作。

嵌入式 開發(fā) 軟件(嵌入式開發(fā)軟件有哪些)

代碼生成選項中主要有兩個參數需要注意,一是System target file選擇為ert.tlc,二是Language選擇為C語言。

嵌入式 開發(fā) 軟件(嵌入式開發(fā)軟件有哪些)

在Report選項中選擇Generate Code Report,一般前兩項分別是Generate Report和Automatically Open,第三項Web View是可選的。

嵌入式 開發(fā) 軟件(嵌入式開發(fā)軟件有哪些)

根據使用的MCU型號,我們需要在Hardware Implementation中選擇對應的MCU廠商和內核類型。本工程采用的是NXP,cortexM4核心的S32k148芯片,選擇對應的選項即可。這里的選擇不像Keil等編譯器那么詳細,主要就是確定MCU的一些數據類型定義的位數,是否支持長整型等,點擊detail可以查看詳細信息。

3.自動生成

完成以上步驟后,就可以生成代碼了,首先在APP選項中選擇內嵌的coder功能卡,如下圖:

嵌入式 開發(fā) 軟件(嵌入式開發(fā)軟件有哪些)

選擇進入嵌入式編碼器APP

嵌入式 開發(fā) 軟件(嵌入式開發(fā)軟件有哪些)

單擊“Build”按鈕生成嵌入式 C 代碼

嵌入式 開發(fā) 軟件(嵌入式開發(fā)軟件有哪些)

代碼生成之后會自動出現在右側,方便我們查看。

嵌入式 開發(fā) 軟件(嵌入式開發(fā)軟件有哪些)

因為我們勾選了生成報告選項,所以會出現一個報告對話框,在報告中可以查看此模塊生成的代碼的相關內容,包括代碼預覽,模型信息,內存使用情況等信息。

嵌入式 開發(fā) 軟件(嵌入式開發(fā)軟件有哪些)

在生成的代碼中我們可以看到很多文件,但是主要用到的是LowBeam.c和LowBeam.h這兩個文件,除了ert_main之外的其他文件大家可以忽略,直接復制到我們自己的代碼工程目錄下即可。我們不需要ert_main,使用我們自己的main函數,但是大家可以參考ert_main中函數函數的調用方法。

3. 代碼集成

按照上面的方法自動生成代碼之后,還差最后一步就能成功使用了,就是把這些文件添加到工程中,并與驅動代碼進行匹配。針對這個芯片,其他同事已經進行了平臺開發(fā),并提供了相關接口,包括ADC、GPIO、CAN等資源都已經封裝好了,我們需要做的就是接口對應。以近光功能模塊為例,LowBeam.c文件幾乎可以忽略不計,它是Matlab軟件根據我們搭建的Simulink邏輯自動生成的代碼,可讀性不是很強,但是功能肯定是實現了的,我們會對應好接口,只關注LowBeam.h文件就行。

在.h文件中找到以下代碼:

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

ExtU_LowBeam_T表示輸入信號的結構體,ExtY_LowBeam_T表示輸出信號的結構體,均以全局變量的形式賦值。

我們自己寫一個賦值函數:

/*近光燈模塊*/ 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;

涉及到一些其他模塊的信號,但這些都是獨立的全局變量,可以直接用于邏輯判斷。

輸出信號:

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

輸出函數已經封裝好了,這里直接調用就可以。

對于總線信號,編寫一個賦值函數:

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ā)送報文 { LowBeam_Y.Can_Send_Flag = 0; } }}

這里我們直接使用發(fā)送消息的接口函數can_send_output_set()。

最后在main函數中調用該函數,我們可以在生成的LowBeam.h文件中看到三個函數聲明:

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

實際上,我們唯一需要的函數是 LowBeam_step(void),它可以在主函數的主循環(huán)中每 10ms 調用一次:

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

其它功能模塊可以按照同樣的方法在近光燈函數下面添加_step函數。

總結

以上就是我們今天要講的內容,本文簡單介紹了如何通過Simulink搭建的邏輯框圖生成嵌入式代碼,并將生成的代碼添加到現有的MCU項目中,實現近光燈模塊的功能。

當然,自動代碼生成需要在項目調用時多一層封裝,占用一定的資源。而且對于一些精通業(yè)務的工程師來說,一些簡單的手寫邏輯,用很簡潔的C代碼量就可以實現同樣的功能。但是我們使用自動代碼生成技術也有相應的優(yōu)勢,比如當功能邏輯比較復雜時,我們可以更清晰地理清思路,使用simulink可以很方便地進行功能仿真。驗證功能步驟可以放在代碼生成之前,而手寫代碼必須在編譯通過后,使用硬件設備進行功能測試后,才能燒錄到sample中。這樣,使用simulink進行功能仿真和自動代碼生成,就省去了重復燒錄的過程。

當然,Simulink 的代碼生成功能遠不止本文所提到的這些,作者會在項目中進行探索,并在后續(xù)的文章中與大家進一步探討。

相關新聞

聯系我們
聯系我們
公眾號
公眾號
在線咨詢
分享本頁
返回頂部