主要内容

为模型入口点函数配置C代码生成

什么是入口点函数?

入口点是代码中发生程序控制(执行)转移的位置。主要功能(main())是C/C++程序的入口点,在应用程序开始执行时调用。对其他函数的调用,例如从主要的函数,提供函数代码的入口点。程序控制转移到被调用的函数。函数代码执行,完成后,将控制权返回给主要的或其他调用函数。

为模型生成代码时,代码生成器定义了一组入口点函数,您可以调用这些函数来执行生成的代码。您可以从外部代码调用生成的函数,也可以从您修改的生成的主函数的版本调用生成的函数。

代码生成报告的“代码接口报告”部分列出了代码生成器为模型生成的入口点函数。有关详细信息,请参阅分析生成的代码接口(嵌入式编码)

生成的入口点函数的类型

代码生成器为这些类型的模型函数生成入口点函数。

模型功能类型 模型名称来源 默认生成的函数名 描述
导出函数(需要嵌入式编码器® ExportedFunction:slIdentifier,在那里slIdentifier模型中函数调用的名称是import块吗 function-call-inport-block-namesignal-label(如果指定了的话) 对于导出函数模型,导出子系统的函数。
初始化函数 初始化 模型_初始化

模型的初始化代码。在应用程序代码的开头,调用该函数一次. 请勿使用此功能重置实时模型数据结构(rtM).

配分函数 分区:slIdentifier,在那里slIdentifier是一个分区,是从模型中的一个块显式创建的,并显示在Simulink®Schedule Editor中(例如,P1)金宝app 模型_stepn,在那里n唯一标识为一个模型样本周期生成的函数 对于模型分区,输出和更新代码。模型配置参数单输出/更新功能为默认值。
分区更新功能 PartitionUpdate:slIdentifier,在那里slIdentifier是一个分区,是从模型中的一个块显式创建的,并显示在Simulink®Schedule Editor中(例如,P1)金宝app 模型_输出n模型_updaten,在那里n唯一标识为一个模型样本周期生成的函数 对于模型分区,在单独的函数中输出和更新代码。模型配置参数单输出/更新功能清除。
周期多任务函数 定期:slIdentifier在哪里slIdentifier是一个注释,对应于多任务模型的周期或连续速率的采样时间周期(例如,D1)。 模型_stepn,在那里n唯一标识为一个模型样本周期生成的函数 用于配置用于多任务、输出和更新代码的基于速率的模型中的块。代码生成器为每个示例周期生成一个函数。模型配置参数单输出/更新功能为默认值。
定期多任务更新功能 定期更新:slIdentifier在哪里slIdentifier是一个注释,对应于多任务模型的周期或连续速率的采样时间周期(例如,D1)。 模型_输出n模型_updaten,在那里n唯一标识为一个模型样本周期生成的函数 对于基于速率的模型中为多任务配置的块,在单独的功能中输出和更新代码。代码生成器为每个采样周期生成输出和更新函数。模型配置参数单输出/更新功能清除。
周期单任务函数 周期 模型_step 对于配置为单任务、输出和更新代码的基于速率的模型中的块。模型配置参数单输出/更新功能为默认值。
周期性单任务更新功能 PeriodicUpdate 模型_输出模型_update 对于配置为单任务的基于速率的模型中的块,在单独的函数中输出和更新代码。模型配置参数单输出/更新功能清除。
重置功能 重置:slIdentifier在哪里slIdentifier模型中是否有复位函数的名称 模型_reset-function-name

如果模型包含重置功能块,重置生成的代码。要重置条件或状态,请从应用程序代码调用函数。

金宝app仿真软件的功能 金宝app仿真软件功能:slIdentifier在哪里slIdentifier是什么名字金宝app仿真软件的功能模型块 函数名全球金宝app仿真软件的功能块或模型_函数名对于一个作用域金宝app仿真软件的功能 对于导出的函数模型,为金宝app仿真软件的功能块。
终止函数 终止 模型_terminate

关闭系统的代码。对于基于ert的模型,可以通过清除模型配置参数来抑制该功能的生成终止功能要求(嵌入式编码)(默认设置)。

如果您有Embedded Coder软件,为了促进外部和生成代码的集成,并实现对代码标准和指南的遵从,您可以配置代码生成器如何从模型或子系统生成功能接口。

配置入口点函数是否可重用

默认情况下,对于顶级模型,代码生成器生成不可重用或不可重入的代码。入口点函数有虚空接口。代码通过直接访问驻留在共享内存中的全局数据结构与其他代码通信。

如果应用程序需要可重用的多实例入口点函数代码,则可以配置代码生成器以使用唯一数据调用每个函数(实例)。在这种情况下,代码是可重入的。

您可以通过模型配置参数配置入口点函数是否可重用代码接口包装以及相关参数。选择的参数设置取决于系统目标文件、编程语言和参数接口的配置选择等因素。

单实例C入口点函数的默认配置

默认情况下,对于基于GRT和ert的系统目标文件,代码生成器生成单实例C入口点函数。生成的代码:

  • 创建一个没有参数的执行函数(虚空).

  • 静态地(在编译时)为模型数据结构分配内存。

配置单实例入口点函数代码的默认模型配置参数设置为:

生成可重用的多实例C入口点函数

您可以配置代码生成器,为基于GRT或基于ert的系统目标文件生成C语言中可重用的入口点函数。但是,代码生成器默认生成的函数接口是不同的。假设模型配置参数语言设置为C代码接口包装设置为可重用函数,代码生成器为每个系统目标文件场景生成入口点函数代码。

系统目标文件 接口
GRT-based
  • 可重入的可重用的、多实例的C入口点函数。

  • 将模型根级导入块和输出块的值打包到实时模型数据结构中。通过引用将该结构作为参数传递给执行函数。

  • 在运行时为模型实例的数据动态分配内存。通过调用函数来分配内存,例如malloc

基于ERT的
  • 可重入的可重用的、多实例的C入口点函数。

  • 将每个模型根级的import块和Outport块的值作为单独的参数传递给执行函数。

  • 为模型数据结构静态分配内存。

如果你正在使用基于ert的系统目标文件,并且想要生成可重用的、多实例的、可重入的C入口点函数,请考虑:

  • 使用动态内存分配初始化模型数据结构。选择对模型初始化使用动态内存分配(嵌入式编码)

  • 将模型根级输入端口块的值打包到结构中,将根级输出端口块的值打包到第二个结构中,并通过引用将结构作为参数传递给执行函数。设置将根级I/O传递为(嵌入式编码)结构参考

  • 将模型根级的import块和Output块的值打包到实时模型数据结构中,并通过引用将该结构作为参数传递给执行函数。集将根级I/O传递为(嵌入式编码)模型数据结构的一部分

生成可重用的,多实例c++入口点函数

c++类接口将模型数据封装为类属性,将入口点函数封装为类方法。该接口可用于基于ert的系统目标文件。要使用该接口,请设置语言c++并设置代码接口包装c++类. 你可以:

  • 通过单击预览和定制c++类接口配置c++类接口(嵌入式编码).定制意味着您可以生成与外部代码集成的代码,并验证代码是否符合编码标准。

  • 通过指定是将块参数结构生成为公有、私有还是受保护的数据成员,配置类继承的可见性。集参数可见性(嵌入式编码)公众的私人,或受保护的

  • 为满足代码执行速度或可调性要求的模型块参数生成c++接口代码。代码可以是内联的或内联的访问方法。集参数访问(嵌入式编码)方法内联法

  • 为满足代码执行速度、数据可调性或数据封装要求的模型根级输入和输出块集生成C++接口代码。代码可以是这些类型的访问方法之一。

    对于访问方法类型 外部I / O访问(嵌入式编码)
    Noninlined 方法
    内联 内联法
    基于非线性结构的 基于结构的方法
    内联structured-based 内联基于结构的方法
  • 通过指定是将根级I/O结构生成为公共、私有还是受保护的数据成员,配置类继承的可见性。集外部I / O的可见性(嵌入式编码)公众的私人,或受保护的

如何与生成的入口点函数接口

  1. 在为模型生成代码之后,使用代码查看以审查生成的入口点函数,如果适用,代表外部输入和输出端口的变量。

  2. 添加# include外部代码的语句,包括生成的声明模型入口点函数的头文件。

  3. 添加一个# include语句,该语句包含生成的文件rtwtypes.h.该文件提供类型定义,#定义语句和枚举。

  4. 初始化特定于目标的数据结构和硬件,如ADC或DAC。

  5. 如果适用,为可重用模型的每个实例初始化数据。

  6. 如果适用,将输入数据写入生成的表示模型导入块的变量中。

  7. 调用生成的入口点函数或设置使用的一步到位函数。

  8. 如果适用,从生成的代表模型Outport块的变量中读取数据。

有关更多信息,请参见将生成的独立可执行程序部署到目标硬件(嵌入式编码)

C函数接口自定义限制

这些限制适用于生成的C函数接口的定制:

  • 您必须选择模型配置参数单输出/更新功能

  • 支持多速率模型,但必须为单任务配置模型。金宝app

  • 必须配置根级导入和输出端口才能使用默认的存储类。

  • 如果选择自定义函数接口,则必须提供自己的自定义主要的程序。该功能接口不能配置静态rt_main.c, MathWorks®提供。指定非默认的函数接口配置会在生成的代码和默认静态代码之间产生不匹配rt_main.c

  • 除非由不可重用函数实现的子系统使用了一个或多个导入的值,否则代码生成器将删除模型的根导入的数据结构。

  • 代码生成器删除模型根输出的数据结构,除非启用MAT文件日志记录,或者一个或多个输出的采样时间不是基本基本速率(包括恒定速率)。

  • 如果复制一个子系统块以在新模型或相同模型中创建一个块,则原始子系统块的功能接口信息不会复制到新的子系统块。

  • 如果你有statflow®,对于使用模型根输入值或调用使用模型根输入值的子系统的状态流程图,请执行以下操作之一以生成代码:

    • 清除在初始化时执行(输入)图表复选框。

    • 使statflow函数成为不可重用的函数。

    • 插入一个仿真软件金宝app®信号转换在根输入端口之后立即阻塞。在信号转换块参数对话框中,选择将此块从“块减少”优化中排除

  • 如果模型根输入值连接到Simscape™ 转换块,插入Simulink金宝app信号转换根输入端口和Simscape转换块之间的块。在信号转换块参数对话框中,选择将此块从“块减少”优化中排除

  • 构建配置有功能接口的参考模型时,不要将虚拟总线用作参考模型的输入或输出。改用非虚拟总线。

  • 如果C函数接口不是默认值,则忽略模型配置参数的值为代码生成传递固定大小的标量根输入值.有关更多信息,请参见为代码生成传递固定大小的标量根输入值

另请参阅

|

相关话题