Main Content

管理编译过程文件

要应用从编译过程生成的代码源和头文件,了解编译过程生成的文件以及控制文件生成的条件会很有帮助。这些信息提供对生成的代码资源的访问,例如:

  • 模型入口点的公共接口

  • 与内置数据类型对应的枚举类型

  • 描述模型信号、状态和参数的数据结构体

代码生成器会在代码生成和编译过程中创建 model.* 文件。您可以自定义生成的头文件、源文件和数据文件的文件名。有关详细信息,请参阅Customize Generated File Names。代码生成器还会创建其他文件夹和依赖项文件以支持共享实用工具和模型引用。有关编译过程创建的文件夹的详细信息,请参阅管理编译过程文件夹。有关说明如何使用工程来管理编译过程文件夹的示例,请参阅在工程中生成代码并进行模型仿真

根据模型架构和代码生成选项,在基于 GRT 的系统目标文件的编译过程中,可能会生成一些在基于 ERT 的系统目标文件的编译过程中不会生成的文件。此外,对于基于 ERT 的系统目标文件,编译过程对生成的文件的打包方式也与基于 GRT 的系统目标文件不同。请参阅Manage File Packaging of Generated Code Modules

注意

默认情况下,编译过程会删除编译文件夹中的外部(非生成的)源文件。可以按照在编译文件夹中保留外部代码文件中的规范在编译文件夹中保留外部源文件。

下表描述了生成的主要文件。在表中显示的生成的文件名中,model 表示要为其生成代码的模型的名称。subsystem 表示模型中子系统的名称。选择创建代码生成报告参数时,代码生成器会生成一组 HTML 文件。对于每个源文件以及编译文件夹内 html 子文件夹中的 model_contents.html 索引文件,都有一个对应的 HTML 文件。表中的源文件和头文件具有依存关系。有关其他文件依存关系的描述,请参阅Manage Build Process File DependenciesAdd Build Process Dependencies

文件描述

builtin_typeid_types.h

定义与内置数据类型对应的枚举类型。

当满足下列一个或多个条件时,模型编译会生成此文件:

  • 模型包含使用消息的 Stateflow 图。

  • 模型配置启用 MAT 文件记录

  • 模型配置在代码生成 > 接口中启用 C API 选项。

model.bat

包含 Windows® 批处理文件命令,用于设置编译器环境和调用 make 实用工具。

有关使用此文件的详细信息,请参阅 model.bat

model.c

model.cpp

对应于模型文件。

目标语言编译器生成此 C 或 C++ 源代码文件。该文件包含:

  • 包含文件 model.hmodel_private.h

  • 数据,但 model_data.c 中的数据除外

  • 特定于模型的调度器代码

  • 特定于模型的求解器代码

  • 模型注册码

  • 算法代码

  • 可选的 GRT 包装函数

model.exe(Windows 平台)

model(UNIX®Macintosh 平台)

可执行程序文件。

模型编译生成此文件,除非您显式指定代码生成器仅生成代码。编译会在开发系统的 make 实用工具的控制下,在当前文件夹(而不是编译文件夹)中生成可执行文件。

model.h

定义模型数据结构体和对接模型入口点和数据结构体的公共接口。通过访问宏提供与实时模型数据结构体 (model_rtM) 的接口。

模型中的子系统 .c.cpp 文件包括 model.h。该文件包括:

有关详细信息,请参阅 model.h

model.mk

生成的联编文件,它通过开发系统的 make 实用工具控制对生成的代码进行编译并将其链接到最终二进制文件中。

如果设置 MAKEFLAGS 环境变量,请不要选择使用此变量且与编译过程使用的当前 make 实用工具冲突的选项。

model.rtw

表示已编译的模型。

默认情况下,编译过程完成时,会删除此 ASCII 文件。您可以选择保留该文件以供检查。

model_capi.h

model_capi.c

包含描述模型信号、状态和参数的数据结构体(不使用外部模式)。

有关详细信息,请参阅使用 C API 在生成的代码和外部代码之间交换数据

model_data.c

包含参数数据结构体和常量模块 I/O 数据结构体的声明(在满足条件时生成),以及模型使用的结构体数据类型的零表示。

当模型使用这些数据结构体时,模型编译便会生成此文件。结构体的 extern 声明显示在 model.h 中。如果此文件存在,它会包含:

  • 常量模块 I/O 参数

  • 包含文件 model.hmodel_private.h

  • 模型使用的用户定义结构体数据类型的零表示的定义

  • 常量参数

model_dt.h

声明包含生成的模型数据结构体的数据类型和数据类型转换信息的结构体,以支持外部模式。

model_private.h

包含模型和子系统的局部 define 常量和局部数据。

模型编译中生成的源文件包含此文件。将外部代码与从模型生成的代码集成时,请包含 model_private.h。该文件包含:

  • 导入的 Simulink 数据符号

  • Stateflow® 入口点

  • Simulink Coder™ 详细信息(代码专用的各种宏、enum 等)

有关详细信息,请参阅Manage Build Process File Dependencies

model_reference_types.h

包含计时桥的类型定义。

模型编译为引用模型或包含模型引用模块的模型生成此文件。

model_targ_data_map.m

包含外部模式用于初始化外部模式连接的 MATLAB® 语言命令。

model_types.h

提供实时模型数据结构体和参数数据结构体的前向声明。

从模型编译中生成的头文件包含此文件。可重用函数的函数声明可以使用这些结构体。

multiword_types.h

包含多字宽数据类型及其字长块的类型定义。如果您的代码使用多字数据类型,请包含此头文件。

当满足下列一个或多个条件时,模型编译会生成此文件:

  • 模型使用多字数据类型。

  • 模型配置启用 MAT 文件记录

  • 模型配置启用代码生成 > 接口 > 外部模式

rtGetInf.c

rtGetInf.h

rtGetNaN.c

rtGetNaN.h

rt_nonfinite.c

rt_nonfinite.h

inf、负 infnan 声明并初始化全局非有限值。提供非有限比较函数。

当满足下列一个或多个条件时,模型编译会生成这些文件:

  • 模型包含 S-Function。

  • 从模型生成的代码需要非有限数。

  • 模型配置启用 MAT 文件记录

rtmodel.h

包含静态主程序模块(如 rt_main.c)所需的 #include 指令。

编译过程不会在代码生成时创建这些模块。模块包括 rtmodel.h 以访问特定于模型的数据结构体和入口函数。如果您创建自己的主程序模块,请确保包含 rtmodel.h

rtwtypes.h

提供类型定义、#define 语句和枚举。

对于 ERT 系统目标文件,仅当满足以下条件之一时,代码生成器才会创建 rtwtypes.h

  • Data type replacement 设置为使用代码生成器 typedef

  • Data type replacement 设置为对定宽整数使用 C 数据类型,并且Coder typedefs compatibility处于选中状态。如果您使用需要 Simulink Coder 数据类型定义的旧自定义代码或静态源文件(在 matlabroot 下),这些设置会强制生成 rtwtypes.h

对于不生成 GRT 接口且没有非内联 S-Function 的基于 ERT 的系统目标文件,rtwtypes.h 不包括 simstruc_types.h

有关详细信息,请参阅rtwtypes.hManage Build Process File Dependencies

rtw_proj.tmw

sl_proj.tmw

标记文件。

编译过程会生成这些文件以帮助 make 实用工具确定何时重新编译和链接生成的代码。

rt_defines.h

包含特殊数学常量(例如 π 和 e)的类型定义并定义 UNUSED_PARAMETER 宏。

当生成的代码需要数学常量定义或函数体不访问所需的模型函数参量时,模型编译会生成此文件。

rt_sfcn_helper.h

rt_sfcn_helper.c

提供非内联 S-Function 在模型中使用的函数。

非内联 S-Function 使用函数 rt_CallSysrt_enableSysrt_DisableSys 来调用下游函数调用子系统。

subsystem.c

包含当子系统配置为将代码放在单独的文件中时每个非内联非虚拟子系统的 C 源代码。

subsystem.h

包含非内联非虚拟子系统的导出符号。

model.bat

此文件包含 Windows 批处理文件命令,这些命令用于设置编译器环境和调用 make 实用工具。

如果您在编译过程中使用工具链方法,则还可以使用此批处理文件从生成的联编文件 model.mk 中提取信息。该信息包括出现在联编文件中的宏定义和值、例如 CFLAGS(C 编译器标志)和 CPP_FLAGS(C++ 编译器标志)。选择包含 model.bat 的文件夹作为当前工作文件夹,并在命令行窗口中键入:

>> system('model.bat info')

在 UNIX 和 Macintosh 平台上,代码生成器不会创建 model.bat 文件。要从在这些系统上生成的联编文件中提取工具链方法编译的信息,请在命令行窗口中键入:

>> system('gmake -f model.mk info')

model.h

头文件 model.h 声明模型数据结构体和对接模型入口点和数据结构体的公共接口。此头文件还通过使用访问宏提供与实时模型数据结构体 (model_M) 的接口。如果您的代码要与模型函数或模型数据结构体对接,请包含 model.h

  • 导出的全局信号

    extern int32_T INPUT;    /* '<Root>/In' */
  • 全局结构体定义

    /* Block parameters (auto storage) */
    extern Parameters_mymodel mymodel_P;
  • 实时模型 (RTM) 宏定义

    #ifndef rtmGetSampleTime
    # define rtmGetSampleTime(rtm, idx) 
    ((rtm)->Timing.sampleTimes[idx])
    #endif
  • 模型入口函数(ERT 示例)

    extern void mymodel_initialize(void);
    extern void mymodel_step(void);
    extern void mymodel_terminate(void);

要在 model.hmodel.c 之外的文件中生成模型入口函数,请使用 Embedded Coder 字典中的函数自定义模板。有关详细信息,请参阅Configure Default C Code Generation for Categories of Data Elements and Functions

main.c(或 .cpp)文件包含 model.h。如果模型编译从 TLC 脚本生成 main.c(或 .cpp)文件,则 TLC 源可以包括 model.h

#include "%<CompiledModel.Name>.h"

如果 main.c 是静态源文件,则可以使用固定的头文件名 rtmodel.h。该文件包含 model.h 头文件:

#include "model.h"     /* If main.c is generated */

#include "rtmodel.h"   /* If static main.c is used */

其他外部源文件可能要求包含 model.h 以对接模型数据,例如导出的全局参数或信号。由于生成的代码的要求,model.h 文件本身可能具有其他头文件依存关系。请参阅System Header FilesCode Generator Header Files

要减少依存关系并减少包含的头文件的数目,请参阅Manage Build Process File Dependencies

rtwtypes.h

当配置参数数据类型替换设置为使用代码生成器 typedef 时,生成的代码包括 rtwtypes.h。头文件 rtwtypes.h 定义生成的代码所需的数据类型、结构体和宏。

通常,生成的代码要求整数运算在特定值上溢或下溢。例如,当代码需要 16 位整数时,代码不接受 8 位或 32 位整数类型。C 语言没有为 charint 等类型中的位数设置标准。

注意

在创建 C99 语言标准之前,没有普遍接受的可表示定长整数的数据类型。C99 标准提供头文件 stdint.hstdbool.hstdint.h 文件包含以前不可用的特定字长整数实现。

为了适应 C 语言的这一特性,生成的代码使用固定大小的整数类型,例如 int8_Tuint32_T,它们不是标准的 C 类型。在 rtwtypes.h 中,生成的代码使用配置参数对话框的硬件实现窗格中的信息将这些固定大小的整数类型映射到对应的 C 关键字基类型。

如果模型不包含非内联 S-Function,代码生成器会为基于 ERT 的系统目标文件生成一个优化版本的 rtwtypes.h。优化的 rtwtypes.h 文件包含特定于模型硬件配置的定义。

rtwtypes.h 的位置取决于编译过程是否使用共享实用工具位置。如果它使用共享位置,代码生成器将 rtwtypes.h 放在 slprj/target/_sharedutils 中。否则,它会将 rtwtypes.h 放在编译文件夹 (model_target_rtw) 中。请参阅Specify Generated Code InterfacesControl Placement of rtwtypes.h for Shared Utility Code

在源文件使用代码生成器类型名称或其他代码生成器定义时,源文件包括 rtwtypes.h 头文件。例如,使用代码生成器数据类型声明变量的文件:

uint32_T myvar

在某些情况下,首先通过 mex 命令,然后通过代码生成编译来编译 S-Function 自定义源文件。在 mex 编译期间,rtwtypes.h 通常不可用。为了获得通常由 rtwtypes.h 提供的定义,自定义源文件可以有条件地(通过 MATLAB_MEX_FILE 宏定义)包括 tmwtypes.h

#ifdef  MATLAB_MEX_FILE
#include "tmwtypes.h"
#else
#include "rtwtypes.h"
#endif

代码生成器 main.c(或 .cpp)文件的源文件包含 rtwtypes.h,但不进行预处理器检查。

#include "rtwtypes.h"

目标语言编译器生成的自定义源文件还可以将 include 语句发送到其生成的文件中。

如果数据类型替换配置参数设置为对定宽整数使用 C 数据类型,则代码生成器不会创建 rtwtypes.h,因为生成的代码不需要 rtwtypes.h 中的定义。如果生成的代码使用 matlabroot 下需要 Simulink Coder 数据类型定义的静态文件,软件将生成 rtwtypes.h 的简化版本。如果您有包含 rtwtypes.h 的自定义代码,则可以通过选中代码生成器 typedef 兼容性复选框来强制生成 rtwtypes.h 的简化版本。

 简化的 rtwtypes.h

相关主题