在 Simulink 环境之外编译集成的代码
标识在外部编译过程中调用生成的代码所需的文件和接口。
了解如何:
收集在 Simulink® 之外编译集成的代码所需的文件。
与外部变量和函数对接。
有关示例模型和相关示例的信息,请参阅为 C 代码生成准备控制算法模型。
收集和编译所需的数据和文件
Embedded Coder® 生成的代码需要 MathWorks® 提供的支持文件。要将生成的代码转移到另一个开发环境(如专用编译系统)中,您必须转移这些支持文件。您可以使用 packNGo
实用工具将这些文件打包成一个 zip 文件。该实用工具会查找您编译可执行映像文件所需的文件并将这些文件打包。该实用工具使用工具来自定义代码生成后的编译过程,其中包括 buildinfo_data
结构体和 packNGo
函数。这些文件包括您在“模型配置参数”对话框的代码生成 > 自定义代码窗格中标识的外部文件。该实用工具将 buildinfo
MAT 文件保存在 model
_ert_rtw
文件夹中。
打开示例模型 rtwdemo_PCG_Eval_P5
。
该模型配置为在代码生成后运行 packNGo
。
要手动生成 zip 文件,请执行下列操作:
加载文件
buildInfo.mat
(位于rtwdemo_PCG_Eval_P5_ert_rtw
子文件夹中)。在命令提示符下,输入命令
packNGo(buildInfo)
。
zip 文件中的文件数量取决于 Embedded Coder 的版本以及您使用的模型的配置。编译器可能需要 zip 文件中的部分文件。编译的可执行文件的大小 (RAM/ROM) 取决于链接过程。链接器很可能只包含必要的目标文件。
将生成的代码集成到现有系统中
此示例说明如何将生成的代码集成到现有代码库中。该示例使用 Eclipse™ IDE 和 Cygwin™/gcc 编译器。所需的集成任务对于集成环境是通用的。
集成环境概述
完整的嵌入式控制系统由多个硬件和软件组件组成。控制算法只是一种类型的组件。其他组件可以是:
操作系统 (OS)
调度层
物理硬件 I/O
低级硬件设备驱动程序
通常,您不会在这些组件中使用生成的代码。但是,生成的代码包含用于连接这些组件的接口。MathWorks 为许多常见的嵌入式控制器提供了硬件接口模块库。有关示例,请参阅 Embedded Targets 模块库。
此示例提供了说明如何编译完整系统的文件。主文件是 example_main.c
,其中包含一个简单的主函数,该主函数只执行基本操作来运行代码。
文件:
定义函数接口(函数原型)。
包括声明外部数据的文件。
定义
extern
数据。初始化数据。
调用仿真硬件。
调用算法函数。
函数执行顺序与测试框架模型中和 rtwdemo_PCG_Eval_P5.h
中的子系统执行顺序相匹配。如果在 example_main.c
中更改执行顺序,可执行映像文件产生的结果会与仿真结果不同。
匹配系统接口
要进行集成,需要对生成的代码和现有系统代码的数据和函数接口进行匹配。在此示例中,example_main.c
文件通过 #include
语句和 extern
声明导入和导出数据。该文件还从生成的代码中调用函数。
连接输入数据
系统有三个输入信号:pos_rqst
、fbk_1
和 fbk_2
。生成的代码通过直接引用导入的全局变量(存储类 ImportedExtern
)访问两个反馈信号。代码通过导入的指针(存储类 ImportedExternPointer
)访问位置信号。
人工文件 defineImportedData.c
定义变量和指针。生成的代码不定义变量和指针,因为它们由人工代码定义。但是,生成的代码在文件 rtwdemo_PCG_Eval_P5_Private.h
中声明导入的数据 (extern
)。在实际系统中,数据通常来自其他软件组件或硬件设备。
查看 rtwdemo_PCG_Eval_P5_Private.h
。
连接输出数据
在此示例中,您不需要直接访问系统的输出数据。示例 测试生成的代码 显示如何将输出数据保存到一个标准的日志文件。您可以通过引用文件 rtwdemo_PCG_Eval_P5.h
来访问输出数据。
访问其他数据
生成的代码包含存储常用数据的几个结构体,这些数据包括:
模块状态值(积分器、传递函数)
局部参数
时间
下表列出了常用数据结构体。根据模型的配置,生成的代码中将显示这些结构体的某种组合。数据在文件 rtwdemo_PCG_Eval_P5.h
中进行声明,但在此示例中,您不会访问这些数据。
Data Type Data Name Data Purpose
Constants |model_cP| Constant parameters Constants |model_cB| Constant block I/O Output |model_U| Root and atomic subsystem input Output |model_Y| Root and atomic subsystem output Internal data |model_B| Value of block output Internal data |model_D| State information vectors Internal data |model_M| Time and other system level data Internal data |model_Zero| Zero-crossings Parameters |model_P| Parameters
匹配函数调用接口
默认情况下,代码生成器生成的函数有一个 void
Func
(void)
接口。如果将模型或原子子系统配置为生成可重入代码,则代码生成器会创建更复杂的函数原型。在本示例中,example_main
函数使用有效的输入参数调用生成的函数。
调用函数 PI_Cntrl_Reusable
需要混合使用单独的、非结构化的全局变量和 Simulink Coder™ 数据结构体。这些变量由人工代码定义。结构体类型在 rtwdemo_PCG_Eval_P5.h
中定义。
在 Eclipse 环境中编译工程
本示例使用 Eclipse IDE 和 Cygwin GCC 调试器编译嵌入式系统。示例提供了针对这两个程序的安装文件。软件组件和版本号为:
Eclipse SDK 3.2
Eclipse CDT 3.3
Cygwin/GCC 3.4.4-1
Cygwin/GDB 20060706-2
要安装和使用 Eclipse 及 GCC,请参阅 安装和使用 Cygwin 及 Eclipse。
您可以通过点击以下超链接为此示例安装文件:
或者,通过执行下列操作手动安装文件:
创建编译文件夹 (
Eclipse_Build_P5
)。将文件
rtwdemo_PCG_Eval_P5.zip
解压缩到编译文件夹中。删除文件
rtwdemo_PCG_Eval_P5.c
、ert_main.c
和rt_logging.c
,它们由example_main.c
替换。
您可以使用 Eclipse 调试器来详细了解和评估生成的 C 代码的执行行为。请参阅示例 安装和使用 Cygwin 及 Eclipse。
要使用输入数据运行模型,请参阅 测试生成的代码。