【Simulink专题】Simulink模型设置(三):代码生成
前言
Simulink中模型設置是關乎著整個模型的運行模式以及代碼生成樣式,不同的設置關乎著不同的結果,今天就給大家講解下作者對整個模型設置的理解,有疑問的地方還需要大家多多指出,謝謝
使用版本:MATLAB 2022a
相關文章:
【Simulink專題】Simulink模型設置(一):求解器、數據導入/導出、數學和數據類型的設置
【Simulink專題】Simulink模型設置(二):診斷、硬件實現、模型引用、仿真目標
代碼生成
目標選擇
整個界面中關鍵的設置選項是控制整個代碼生成過程的系統文件目標System Target File, ert.tlc文件是Embedded Coedr提供的能生成專門用于嵌入式系統C代碼的系統目標文件。在Code Generation頁面中,點擊瀏覽即可進入先擇系統目標文件的設置其中包含眾多架構類型的選項
編譯過程
此部分主要是針對于代碼的設置與工具鏈設置,分別針對于僅生成代碼和打包代碼與工件,工具鏈的設置主要分構建配置與工具鏈詳細信息
這里建議只生成代碼,因為與底層軟件集成在一塊,然而只需要底層調用app就可以了,編譯的話的話會額外花費時間去集成代碼
代碼生成目標
此部分主要是針對于代碼生成目標設置,選擇模型代碼生成的最優先目標,右邊按鍵設置目標中選擇其中選項作為代碼生成的最優項
生成代碼檢查模型:在代碼生成前,查看模型是否運行且無異常
優化
1、默認參數行為:生成代碼時常量參數的形式。
該配置中包含兩個選項:可調和內聯。如果選可調,意為可調式,生成的代碼就會以StorageClass中
的Auto類來表現常數參數。如果選內聯,意為內聯式,會把參數“內聯”到代碼中,表現為直接的數值。
舉例
下圖是默認參數行為是可調式:
大家可以看到參數1000這個數值不是直接出現在.c文件中的,值通過其他文件調用的,這個參數會存放在data.c中
下圖是默認參數行為是內聯式:
這里能清除的看到參數1000值是直接存在到.c文件中的,不是通過調用其他文件來實現計算的
注意:
兩種情況對代碼運行都不會出現影響,但是可調式會占用RAM資源,最終可能會導致資源溢出;
2、可重用子系統輸出的傳遞方式:指定可重用子系統如何傳遞輸出。
默認的是 單個參數,指的是輸出為局部變量。還有一個選項是結構體引用,他會生成一個全局結構體變量,然后可復用子系統對應的函數會調用這個結構體的指針,當使用結構體引用時,會生成一個結構體的全局變量、同上文一樣,會出現RAM資源緊張問題,個人推薦使用單個參數
3、刪除根級I/O零初始化:這個設置就是設置在初始化子系統后所有的輸入輸出會不會默認為0
舉例
在勾選刪除根級I/O零初始化時,代碼生成如下
在不勾選刪除根級I/O零初始化時,代碼生成如下
兩個結果清除的能看到代碼生成后的區別,設值不勾選刪除根級I/O零初始化時,會生成接口默認值為0的代碼,同理,這部分代碼也會占用RAM資源,作者建議直接勾選此設置,除了一種特殊的情況,如果控制器因為某種原因,復位后沒有將RAM中的數值清零。這時候就需要這部分的初始化函數。
4、刪除內部數據零初始化
好多模塊可能存在內部變量存儲,以及默認存儲值。Unit Delay為例子
在不勾選刪除內部數據零初始化,這里會對Unit Delay模塊內部的全局變量初始化為0
在勾選了刪除內部數據零初始化的時候,初始化函數中就不會把Unit Delay模塊內部的全局變量初始化為0。
5、優化級別:選擇要應用于生成代碼的優化級別。
這部分時選擇優化程度,可以選擇強化級別和優先級,也可以先擇指定自定義優化
報告
此頁面主要是打開設置關于生成代碼報告的頁面,也可以選擇是否創建HTML格式的代碼生成報告,通過勾選設置是否在模型編譯結束后打開,指標中的S生成靜態代碼指標勾選時會在代碼生成報告中包含靜態代碼的參數指標,推薦只勾線創建代碼生成報告和自動打開報告兩個選項模型生成完代碼后會走動彈出報告
注釋
注釋子標簽中對代碼生成中注釋內容的配置,其對話框如上圖所示,包括選項的勾選決定是否在代碼生成中添加Siumlink自帶的注釋,啟動此選項后,自動生成的注釋組以及自定義注釋組的選項便會被激活,我們可以根據選擇希望生成的注釋內容
標識符
標識符子標簽頁用于設置ert.tlc系統目標文件控制下的diamante生成不規定規則,如上圖所示。這些符號包括數據變量和數據類型的定義、常用宏、子系統方法、模塊的輸出變量、局部臨時變量及命名的最長字符數等。
這些標示符的具體意義如下表所示:
| $R | 表示根模型的名字,將C語言不支持的字符替換為下劃線 |
| $N | 表示Siumlink對象;模塊、信號或信號對象、參數、狀態等的名字 |
| $M | 為了避免命名沖突,必要時追加在后綴以示區分 |
| $A | 表示數據類型 |
| $H | 表示系統層級標示符。對于根層次模塊,root_,;對于子系統模塊:sN_,N是Siumlink分配的系統編號 |
| $F | 表示函數名,如表示更新函數時使用_Update |
| $C | 校驗和標示符,用于防止命名沖突 |
| $ I | 表示輸入/輸出標示符,輸入端口使用u表示,輸出端口則使用y表示 |
通過上表各種標示符的不同組合,即可規定生成代碼中各個部分(變量、常量、函數名、結構體及對象)的名稱的生成規則。
Simulink提供的這些標示符生成的變量名雖然可讀性不強,但是不會引起代碼編譯錯誤。推薦使用默認方式,以免造成不必要的錯誤。
自定義代碼
自定義代碼子標簽頁主要用于添加用戶自定義的或者編程模型時必須的源文件、頭文件、文件夾或者文件庫等,頁面如上圖所示
1、include headers:
如果需要simulink調用自定義的.h文件的話。需要在這里填寫相應的頭文件,例如:#include "Dsp_Interface.h"格式,這個時候生成代碼后,你的頭文件會在.h文件中顯示
這里作者是做了個枚舉的.h文件,讀者們可以根據其他需求定義其他文件,這里不詳細說明
2、源文件:
源文件中都是.C文件,在使用simulink調用外部函數時可能或使用外部的c文件,這是就需要在其中聲明c文件使用,例如:Dtc_MonitorHdl.c格式,這個時候生成代碼,你的c文件會在代碼生成文件中的Other files中顯示
接口
軟件環境的參數中提供CPL(代碼替換庫)的選擇,CPL中定義一個表,根據表格將Simulink模塊與所對應目標語言的數學函數以及操作函數庫掛接,以便從模型生成代碼。Embedded Coder提供默認的CPL。
支持參數由6個選擇構成,如下:
每個選擇框代表一種嵌入式編碼器對代碼生成的支持功能,其中一些功能是需要Simulink提供的頭文件來支持才能編譯為木匾文件的,這些頭文件一部分儲存在路徑為MATAB/Broot/simulink/include的文件夾中,一部分是在模型生成diamante過程中自動發生成的(rt開頭的頭文件)
| 浮點數 | rtw_solver.h |
| 非有限數 | Rt_nonfinite.h |
| 復數 | – |
| 絕對時間 | – |
| 連續時間 | Rt_continuous.h |
| 可變大小信號 | Fixedpoint.h |
代碼與數據交換接口參數組用來配置生成代碼的接口及數據記錄的方式,如無特殊要求建議使用默認配置
代碼樣式
代碼樣式子標簽頁面提供了一些關于生成代碼風格的選擇框選項,如if else分支的完整性確保,if else與swith case語句的選用,生成括號的頻度,是否保留函數聲明中的extern關鍵字等,
驗證
此處建議默認設置
模板
模板子標簽頁面內嵌入式編碼器提供了一組默認的代碼生成模板,如上圖所示:
ert_code_template.cgt中主要規定了代碼段的順序,section包含了源文件從注釋到變量再到函數體各種分段。依次為:文件說明的注釋(File Banner)、頭文件包含(Includes)、宏定義(Defines)、數據結構類型的定義(Types)和枚舉類型的定義(Enum)、各種變量的定義(Definitions),以及函數體的聲明(Declarations)和閑數圖體定義(Functions)。我們可以在相鄰的段中插入自定義內容,但是不要打亂寄存段的相對順序
生成代碼主程序
這里如果選中的話,會在生成代碼時生成發一個main函數,這里不建議勾選,因為其他代碼的原因
代碼布局
代碼布局子標簽提供的選項將影響代碼生成的文件組織方式和數據存儲方式及頭文件包含的分隔符選擇等,常用的選項是文件打包格式,便是生成文件的組織方式,對應生成文件的個數不同,內容緊湊度也不同,具體如下:
| 模塊化 | model.c 、 subsystem files(optional)、 model.h、model_types.h、 model_private.h、 model_data.c(conditional) | |
| 緊湊 | model.c、model.h | model_data.c 、 model_private.h 、 model_types.h |
| 緊湊(具有單獨的數據文件) | model.c、model.h、model_data.c(conditional) | model_types.h、model_private.h |
省去的只是文件的個數,但是內容被合并到其他文件中,具體內容如下:
| model_data.c | model.c |
| model_private.h | model.c、model.h |
| model_types.h | model.h |
在這里推薦使用默認設置,如果希望生成代碼文件列表中的文件減少,可以考慮其他設置
模塊化:
模塊化會在model中多出兩個文件,這兩個文件主要時存放
緊湊(具有單獨的數據文件):
緊湊:
數據類型替換
數據類型替換子標簽默認情況下僅提供一個選擇選項,勾選之后則彈出3列數據類型列表,分別是simulink name,code generation name和replacement。前兩列按照數據類型的對應關系給出了每種數據類型在Simulink和嵌入式編碼器生成代碼中的類型名,第3列則供給用戶設置,填入自定義的類型名之后,生成代碼時將使用自定義的類型名替換為Code generation name
用戶填人的自定義類型名稱不僅是一個別名字符串,還必須在Base Workspace中定義作為siumlink.Alias Type類型對象才可以。如定義U16數據類型別名對象倆替換uint16_T這個內部類型。第3列的edit框不必全部填入自定義類型名,可以根據應用場合選擇部分或全部來使用。丙炔可以使用同一個數據類型名替代多個內建數據類型,如使用U8同時替換uint8_T和Boolean_T類型。
覆蓋率
覆蓋分析使能和覆蓋范圍選擇:
1、Entire System:整個系統
2、Referenced Models:參考模型,可選擇
3、SubSystem:子系統,可選擇
包含的分析項:
默認勾選MATLAB files C/C++ S-Functions
模型覆蓋的類型:
1、序復雜性
序復雜性是指模型結構復雜性的度量,為了計算對象的序復雜性,模型覆蓋用下面的公式:
N是對象表示的決策點數,On是第N個決策點的輸出數。
2、決策覆蓋(DC)
決策覆蓋分析模型中表示決策點的要素,比如開關模塊或者狀態流狀態,對于這些項,,模型覆蓋確定模擬測試時實際通過這些路徑的百分率。
3、條件覆蓋(CC)
條件覆蓋分析組合邏輯(比如邏輯操作)和狀態轉移,條件覆蓋分析報告是否模型中的每個模塊被完全覆蓋了。
當收集模型覆蓋,可能達不到100%的條件覆蓋,比如如果確定短路邏輯模塊(一種處理方式),就達不到100%的覆蓋率。
4、改進條件/決策覆蓋(MCDC)
改進的條件/決策覆蓋分析擴展了決策和條件的覆蓋能力,它確定測試實驗測試邏輯模塊輸入和轉移條件獨立性的程度。
一個測試實驗達到模型的完全覆蓋,當改變模塊的一個獨立于其他輸入,引起了模塊輸出的改變。
一個測試實驗達到狀態轉移的完全覆蓋,也就是每個轉移條件在一個條件觸發時,狀態至少轉移一次。
MCDC也不保證100%的決策覆蓋和條件覆蓋。
5、查表條件覆蓋
查表覆蓋用表實體的輸入、輸出、內插、外推信息來分析模塊,它記錄每個內插間隙被使用的頻率,要達到完全覆蓋,每個內插和外插間隙至少被執行一次。
6、信號范圍覆蓋
信號范圍覆蓋是在模擬期間記錄模型中每個模塊的最大值、最小值。
7、信號寬度覆蓋
信號寬度覆蓋記錄可變信號寬度信號的最大值、最小值。
8、目標和約束
通過Simulnk的 Design Verifier blocks,可以在模型中指定目標和約束。為了檢查這些目標是否得到滿足,首先只用這些模塊生成測試用例。也可以在原始模型上執行這些測試用例,并記錄指定目標是否至少滿足一次。要記錄此覆蓋率,請啟用此參數。
9、在整數溢出覆蓋率上啟用飽和
對于某些模塊,例如Abs模塊,可以指定其在整數溢出時飽和,如果啟用此參數,將記仿真期間這些模塊飽和的次數。
10、關系邊界覆蓋
某些模塊(如關系運算模塊或if模塊)使用關系操作。如果啟用此參數,覆蓋率分析將檢查這些操作是使用相等(整數)值還是幾乎相等(浮點)值執行的
Advanced parameters
1、 限制覆蓋記錄間隔:
僅在指定的時間間隔內記錄覆蓋率。
例如,如果模型在仿真初期時有瞬態效果,或者僅為特定模型操作報告模型覆蓋率,則
可能需要限制模型覆蓋率記錄。
僅在指定時間間隔內記錄覆蓋率。要指定時間間隔,請使用以下參數:
Coverage interval recording start time
Coverage interval recording stop time
2、強制‘折疊模塊’關閉
報告覆蓋率支持的模型中每個模塊的覆蓋率。
記錄模型中每個受支持的模塊的覆蓋率。配置參數模塊縮減的值將被忽略。
3、 將Simulink邏輯塊視為短路
指定覆蓋率必須考慮執行邏輯運算模塊(例如邏輯運算符模塊)中操作數的順序。
例如,如果考慮到邏輯AND模塊的兩個輸入的順序,當第一個輸入為false時,第二個輸入時冗余的。因此,對于第一個輸入為假的情況,不考慮通向第二個輸入的路徑覆蓋范圍。
4、 MCDC mode:
指定覆蓋率分析期間使用的修改條件/決策覆蓋率(MCDC)的定義。
Masking:使用封裝MCDC分析。為了確定輸入的獨立性,封裝MCDC分析不要求在一個輸入變化時所有其他輸入嚴格保持不變。因此,封裝MCDC分析允許在給定仿真中滿足更多的目標。
Unique-Cause:獨特原因的MCDC分析。
5、 模型中存在不支持模塊時發出警告
6、 指定過濾器文件,以便在模擬期間從覆蓋率分析中排除某些模型對象。
可以使用命令行API為模塊創建過濾規則。篩選的選擇標準包括按單個ID篩選、篩選相同類型的所有模塊、篩選模塊的某些決策、條件和結果等。還可以通過代碼覆蓋結果過濾S函數C++代碼。
總結
以上是生活随笔為你收集整理的【Simulink专题】Simulink模型设置(三):代码生成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [读书笔记]自控力
- 下一篇: NodeJs ES6 写简单爬虫 爬小说