Embedded Coder? 生成的代碼需要 MathWorks? 提供的支持文件。要將生成的代碼轉(zhuǎn)移到另一個開發(fā)環(huán)境(如專用編譯系統(tǒng))中,您必須轉(zhuǎn)移這些支持文件。您可以使用 packNGo
實用工具將這些文件打包成一個 zip 文件。該實用工具會查找您編譯可執(zhí)行映像文件所需的文件并將這些文件打包。該實用工具使用工具來自定義代碼生成后的編譯過程,其中包括 buildinfo_data
結(jié)構(gòu)體和 packNGo
函數(shù)。這些文件包括您在 Model Configuration Parameters 對話框的 Code Generation > Custom Code 窗格中標識的外部文件。該實用工具將 buildinfo
MAT 文件保存在 model_ert_rtw
文件夾中。
打開示例模型 rtwdemo_PCG_Eval_P5
。
該模型配置為在代碼生成后運行 packNGo
。
要手動生成 zip 文件,請執(zhí)行下列操作:
加載文件 buildInfo.mat
(位于 rtwdemo_PCG_Eval_P5_ert_rtw
子文件夾中)。
在命令提示符下,輸入命令 packNGo(buildInfo)
。
zip 文件中的文件數(shù)量取決于 Embedded Coder? 的版本以及您使用的模型的配置。編譯器可能需要 zip 文件中的部分文件。編譯的可執(zhí)行文件的大小 (RAM/ROM) 取決于鏈接過程。鏈接器很可能只包含必要的目標文件。
此示例說明如何將生成的代碼集成到現(xiàn)有代碼庫中。該示例使用 Eclipse? IDE 和 Cygwin?/gcc 編譯器。所需的集成任務對于集成環(huán)境是通用的。
完整的嵌入式控制系統(tǒng)由多個硬件和軟件組件組成??刂扑惴ㄖ皇且环N類型的組件。其他組件可以是:
操作系統(tǒng) (OS)
調(diào)度層
物理硬件 I/O
低級硬件設備驅(qū)動程序
通常,您不會在這些組件中使用生成的代碼。但是,生成的代碼包含用于連接這些組件的接口。MathWorks? 為許多常見的嵌入式控制器提供了硬件接口模塊庫。有關(guān)示例,請參閱 Embedded Targets 模塊庫。
此示例提供了說明如何編譯完整系統(tǒng)的文件。主文件是 example_main.c
,其中包含一個簡單的主函數(shù),該主函數(shù)只執(zhí)行基本操作來運行代碼。
文件:
定義函數(shù)接口(函數(shù)原型)。
包括聲明外部數(shù)據(jù)的文件。
定義 extern
數(shù)據(jù)。
初始化數(shù)據(jù)。
調(diào)用仿真硬件。
調(diào)用算法函數(shù)。
函數(shù)執(zhí)行順序與測試框架模型中和 rtwdemo_PCG_Eval_P5.h
中的子系統(tǒng)執(zhí)行順序相匹配。如果在 example_main.c
中更改執(zhí)行順序,可執(zhí)行映像文件產(chǎn)生的結(jié)果會與仿真結(jié)果不同。
要進行集成,需要對生成的代碼和現(xiàn)有系統(tǒng)代碼的數(shù)據(jù)和函數(shù)接口進行匹配。在此示例中,example_main.c
文件通過 #include
語句和 extern
聲明導入和導出數(shù)據(jù)。該文件還從生成的代碼中調(diào)用函數(shù)。
系統(tǒng)有三個輸入信號:pos_rqst
、fbk_1
和 fbk_2
。生成的代碼通過直接引用導入的全局變量(存儲類 ImportedExtern
)訪問兩個反饋信號。代碼通過導入的指針(存儲類 ImportedExternPointer
)訪問位置信號。
人工文件 defineImportedData.c
定義變量和指針。生成的代碼不定義變量和指針,因為它們由人工代碼定義。但是,生成的代碼在文件 rtwdemo_PCG_Eval_P5_Private.h
中聲明導入的數(shù)據(jù) (extern
)。在實際系統(tǒng)中,數(shù)據(jù)通常來自其他軟件組件或硬件設備。
查看 rtwdemo_PCG_Eval_P5_Private.h
。
在此示例中,您不需要直接訪問系統(tǒng)的輸出數(shù)據(jù)。示例 測試生成的代碼 顯示如何將輸出數(shù)據(jù)保存到一個標準的日志文件。您可以通過引用文件 rtwdemo_PCG_Eval_P5.h
來訪問輸出數(shù)據(jù)。
生成的代碼包含存儲常用數(shù)據(jù)的幾個結(jié)構(gòu)體,這些數(shù)據(jù)包括:
模塊狀態(tài)值(積分器、傳遞函數(shù))
局部參數(shù)
時間
下表列出了常用數(shù)據(jù)結(jié)構(gòu)體。根據(jù)模型的配置,生成的代碼中將顯示這些結(jié)構(gòu)體的某種組合。數(shù)據(jù)在文件 rtwdemo_PCG_Eval_P5.h
中進行聲明,但在此示例中,您不會訪問這些數(shù)據(jù)。
Data Type Data Name Data Purpose
Constants |model_cP| Constant parametersConstants |model_cB| Constant block I/OOutput |model_U| Root and atomic subsystem inputOutput |model_Y| Root and atomic subsystem outputInternal data |model_B| Value of block outputInternal data |model_D| State information vectorsInternal data |model_M| Time and other system level dataInternal data |model_Zero| Zero-crossingsParameters |model_P| Parameters
默認情況下,代碼生成器生成的函數(shù)有一個 void Func(void)
接口。如果將模型或原子子系統(tǒng)配置為生成可重入代碼,則代碼生成器會創(chuàng)建更復雜的函數(shù)原型。在本示例中,example_main
函數(shù)使用有效的輸入?yún)?shù)調(diào)用生成的函數(shù)。
調(diào)用函數(shù) PI_Cntrl_Reusable
需要混合使用單獨的、非結(jié)構(gòu)化的全局變量和 Simulink? Coder? 數(shù)據(jù)結(jié)構(gòu)體。這些變量由人工代碼定義。結(jié)構(gòu)體類型在 rtwdemo_PCG_Eval_P5.h
中定義。
本示例使用 Eclipse? IDE 和 Cygwin? GCC 調(diào)試器編譯嵌入式系統(tǒng)。示例提供了針對這兩個程序的安裝文件。軟件組件和版本號為:
Eclipse? SDK 3.2
Eclipse? CDT 3.3
Cygwin?/GCC 3.4.4-1
Cygwin?/GDB 20060706-2
要安裝和使用 Eclipse? 及 GCC,請參閱 安裝和使用 Cygwin 及 Eclipse。
您可以通過點擊以下超鏈接為此示例安裝文件:
或者,通過執(zhí)行下列操作手動安裝文件:
創(chuàng)建編譯文件夾 (Eclipse_Build_P5
)。
將文件 rtwdemo_PCG_Eval_P5.zip
解壓縮到編譯文件夾中。
刪除文件 rtwdemo_PCG_Eval_P5.c
、ert_main.c
和 rt_logging.c
,它們由 example_main.c
替換。
您可以使用 Eclipse? 調(diào)試器來詳細了解和評估生成的 C 代碼的執(zhí)行行為。請參閱示例 安裝和使用 Cygwin 及 Eclipse。
要使用輸入數(shù)據(jù)運行模型,請參閱 測試生成的代碼。