分享

在 Simulink 环境之外编译集成的代码

 dudubao821 2019-10-18

Embedded Coder® 生成的代码需要 MathWorks® 提供的支持文件。要将生成的代码转移到另一个开发环境(如专用编译系统)中,您必须转移这些支持文件。您可以使用 packNGo 实用工具将这些文件打包成一个 zip 文件。该实用工具会查找您编译可执行映像文件所需的文件并将这些文件打包。该实用工具使用工具来自定义代码生成后的编译过程,其中包括 buildinfo_data 结构体和 packNGo 函数。这些文件包括您在 Model Configuration Parameters 对话框的 Code Generation > Custom Code 窗格中标识的外部文件。该实用工具将 buildinfo MAT 文件保存在 model_ert_rtw 文件夹中。

打开示例模型 rtwdemo_PCG_Eval_P5

该模型配置为在代码生成后运行 packNGo

从整个模型生成代码。

要手动生成 zip 文件,请执行下列操作:

  1. 加载文件 buildInfo.mat(位于 rtwdemo_PCG_Eval_P5_ert_rtw 子文件夹中)。

  2. 在命令提示符下,输入命令 packNGo(buildInfo)

zip 文件中的文件数量取决于 Embedded Coder® 的版本以及您使用的模型的配置。编译器可能需要 zip 文件中的部分文件。编译的可执行文件的大小 (RAM/ROM) 取决于链接过程。链接器很可能只包含必要的目标文件。

将生成的代码集成到现有系统中

此示例说明如何将生成的代码集成到现有代码库中。该示例使用 Eclipse™ IDE 和 Cygwin™/gcc 编译器。所需的集成任务对于集成环境是通用的。

集成环境概述

完整的嵌入式控制系统由多个硬件和软件组件组成。控制算法只是一种类型的组件。其他组件可以是:

  • 操作系统 (OS)

  • 调度层

  • 物理硬件 I/O

  • 低级硬件设备驱动程序

通常,您不会在这些组件中使用生成的代码。但是,生成的代码包含用于连接这些组件的接口。MathWorks® 为许多常见的嵌入式控制器提供了硬件接口模块库。有关示例,请参阅 Embedded Targets 模块库。

此示例提供了说明如何编译完整系统的文件。主文件是 example_main.c,其中包含一个简单的主函数,该主函数只执行基本操作来运行代码。

查看 example_main.c

文件:

  • 定义函数接口(函数原型)。

  • 包括声明外部数据的文件。

  • 定义 extern 数据。

  • 初始化数据。

  • 调用仿真硬件。

  • 调用算法函数。

函数执行顺序与测试框架模型中和 rtwdemo_PCG_Eval_P5.h 中的子系统执行顺序相匹配。如果在 example_main.c 中更改执行顺序,可执行映像文件产生的结果会与仿真结果不同。

匹配系统接口

要进行集成,需要对生成的代码和现有系统代码的数据函数接口进行匹配。在此示例中,example_main.c 文件通过 #include 语句和 extern 声明导入和导出数据。该文件还从生成的代码中调用函数。

连接输入数据

系统有三个输入信号:pos_rqstfbk_1fbk_2。生成的代码通过直接引用导入的全局变量(存储类 ImportedExtern)访问两个反馈信号。代码通过导入的指针(存储类 ImportedExternPointer)访问位置信号。

人工文件 defineImportedData.c 定义变量和指针。生成的代码不定义变量和指针,因为它们由人工代码定义。但是,生成的代码在文件 rtwdemo_PCG_Eval_P5_Private.h 中声明导入的数据 (extern)。在实际系统中,数据通常来自其他软件组件或硬件设备。

查看 defineImportedData.c

查看 rtwdemo_PCG_Eval_P5_Private.h

连接输出数据

在此示例中,您不需要直接访问系统的输出数据。示例 测试生成的代码 显示如何将输出数据保存到一个标准的日志文件。您可以通过引用文件 rtwdemo_PCG_Eval_P5.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

您可以通过点击以下超链接为此示例安装文件:

设置编译文件夹。

或者,通过执行下列操作手动安装文件:

  1. 创建编译文件夹 (Eclipse_Build_P5)。

  2. 将文件 rtwdemo_PCG_Eval_P5.zip 解压缩到编译文件夹中。

  3. 删除文件 rtwdemo_PCG_Eval_P5.cert_main.crt_logging.c,它们由 example_main.c 替换。

您可以使用 Eclipse™ 调试器来详细了解和评估生成的 C 代码的执行行为。请参阅示例 安装和使用 Cygwin 及 Eclipse

要使用输入数据运行模型,请参阅 测试生成的代码

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多