主要内容

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

什么是入口点功能?

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

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

代码生成报告的代码接口报告部分列出了代码生成器为模型生成的入口点函数。有关更多信息,请参见分析生成的代码接口

生成的入口点函数的类型

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

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

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

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

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

金宝appSimulink函数 金宝appSimulink功能:滑块标识符,在哪里滑块标识符是什么名字金宝appSimulink函数模型块 函数名为全球金宝appSimulink函数阻止或模型_函数名对于一个作用域金宝appSimulink函数 对于导出函数模型,导出函数为金宝appSimulink函数
终止函数 终止 模型_终止

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

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

配置入口点功能是否可重用

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

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

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

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

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

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

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

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

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

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

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

  • 打包模型根级别的值轮廓尺寸块和外埠块成实时模型数据结构。通过引用将该结构作为参数传递给执行函数。

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

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

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

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

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

  • 使用动态内存分配初始化模型数据结构。选择对模型初始化使用动态内存分配

  • 填充模型根级的值轮廓尺寸块成结构,打包根级的值外埠块进入第二个结构,并通过引用将结构作为参数传递给执行函数。集将根级I/O传递为结构参考

  • 填充模型根级的值轮廓尺寸块和外埠块插入实时模型数据结构,并通过引用将该结构作为参数传递给执行函数。设置将根级I/O传递为模型数据结构的一部分

选择配置生成的C函数接口的方法

为了便于集成外部代码和生成的代码,并实现对代码标准和准则的遵从性,可以使用代码映射编辑器或代码映射API来配置代码生成器如何从模型或子系统生成函数接口。

配置 更多信息
模型间函数类别(初始化/终止、执行和共享实用程序)的默认命名规则 配置函数的默认代码生成
单个入口点函数的名称(替代默认命名规则) 为单个C入口点函数配置名称
基本速率步骤入口点函数的步骤函数接口(函数名、返回值和参数C类型限定符、名称和顺序) 为各个步骤函数配置名称和参数
Simulink函数和函数调用程序块的函数接口(函数名、返回值和参数C类型限定符、名称和顺序)交互金宝app 配置Simulink函数和函数调用程序块的入口点函数接口金宝app

您可以使用软件在环(SIL)测试来验证为定制入口点函数生成的代码。使用生成的代码创建一个SIL块。然后,将SIL块集成到模型中,以验证生成的代码是否提供了与原始模型或非虚拟子系统相同的结果。有关更多信息,请参见选择SIL或PIL方法

配置函数类别的默认代码生成设置

通过为跨模型的函数类别指定默认配置,可以减少为C代码生成准备模型的工作。例如,可以配置函数名称规则和函数代码在内存段中的位置。应用默认配置可以节省时间并降低在代码中引入错误的风险,特别是对于具有大量函数的模型。

代码生成器为以下类型的模型函数生成入口点函数:

功能类别 描述
初始化/终止 初始化和关闭系统的函数
处决 启动执行和重置的函数
共享效用 共享实用函数代码

属性配置函数的默认代码映射代码映射编辑器或代码映射API函数setFunctionDefault.使用这些接口,您可以将函数类别与模型的Embedded Coder Dictionary中定义的函数定制模板关联起来。

如果您的应用程序需要配置入口点函数在内存中的位置,例如,为特定硬件优化生成的代码,您可以跨模型对一类函数应用默认内存部分。在代码映射编辑器中,将函数类别映射到定义为使用特定内存段的函数定制模板。看到的。

如果函数自定义模板不存在,则可以使用嵌入式编码器字典创建一个模板(请参见为软件架构定义存储类、内存段和函数模板).

有关如何为函数类别配置默认配置的示例,请参见配置数据元素和函数类别的默认C代码生成

为单个C入口点函数配置名称

为了使生成的C代码符合代码标准和指导方针,或者使代码更容易与外部代码集成,您可以配置单个入口点函数的名称。例如,您可以命名为模型生成的初始化函数myInitFunc

如果你的模型至少满足其中一个条件,考虑单独配置函数的名称:

  • 使用具有唯一命名要求的多个函数。

  • 使用一些功能。

  • 具有函数类别的默认配置,您需要覆盖特定函数的配置。

通过使用代码映射编辑器或代码映射API函数setFunction,为各个步骤函数配置函数名。使用这些接口,您可以将函数与模型的Embedded Coder Dictionary中定义的函数定制模板关联起来,并指定函数名。

此示例显示如何更改初始化模型函数rtwdemo_fcnprotoctrl

  1. 打开并保存模型的副本rtwdemo_fcnprotoctrl在可写的位置。

  2. 打开嵌入式编码器应用程序。

  3. C代码选项卡上,选择代码接口>单个元素代码映射

  4. 在代码映射编辑器中,功能选项卡上,使用以下方法之一更改函数名:

    • 函数名列,输入函数的名称。

    • 预览功能列,单击函数原型超链接打开配置对话框。在C初始化函数名字段,输入函数名。点击申请要验证中的更改,请执行以下操作:C函数原型字段或点击好啊退出对话框并在中查看函数名的步骤预览功能代码映射编辑器的列。

    对于本例,更改初始化作用于fcnprotoctrl_init

  5. 保存模型。

  6. 生成的代码。

  7. 验证生成的代码中的更改。在密码查看,查找函数名的实例fcnprotoctrl_init. 函数名显示在生成的文件中rtwdemo_fcnprotoctrl.hrtwdemo_fcnprotoctrl.c

    • rtwdemo_fcnprotoctrl.h:

      外部无效fcnprotoctrl_init(无效);
    • rtwdemo_fcnprotoctrl.c:

      Void fcnprotoctrl_init(Void){…}

为各个步骤函数配置名称和参数

为了使生成的C代码符合代码标准和指导方针,或者更容易地将代码与外部代码集成,您可以配置为Simulink周期性函数生成的各个步骤函数的名称和参数。金宝app您可以自定义步骤功能的以下方面:

  • 函数名

  • 参数名称

  • 参数的顺序

  • 返回值和参数数据限定符

  • 参数的缓冲优化

如果模型满足这些标准中的至少一个,则考虑单独配置步骤函数的名称和参数:

  • 是一种周期性的单任务模型,代码生成器为其生成单步函数。

  • 具有的默认配置处决函数类别,您需要覆盖特定步骤函数的配置。

使用代码映射编辑器或代码映射API函数为单个步骤函数配置代码映射setFunction。使用这些接口,您可以将函数与模型的嵌入式编码器字典中定义的函数自定义模板相关联,并完全自定义step函数原型。

此示例演示如何为基于速率的单任务模型自定义步骤函数名和参数。

打开配置对话框

1.打开并保存模型的副本rtwdemo_fcnprotoctrl到一个可写的位置。

2.打开嵌入式编码器应用程序。

3.在街上C代码选项卡上,选择代码接口>单个元素代码映射

4.在代码映射编辑器中,单击功能选项卡。

5.对于阶跃函数行,在预览功能列中,单击原型超链接,打开“配置C步骤功能接口”对话框。

在“配置C步骤功能界面”对话框中,单击C函数原型字段显示对函数原型所做更改的预览。

有关配置为生成多实例代码的模型,请参见从顶级模型生成可重入代码

自定义函数名

1.2 .在“配置C步骤功能界面”对话框中设置C步进函数名称fcnprotoctrl\u运行.函数预览被更新以反映新的函数名。

2.点击申请,关闭对话框,然后保存模型。

3.生成代码并验证名称更改。

  • 单击密码表中的密码查看文件列表,选择文件rtwdemo_fcnprotoctrl.h.在搜索字段,验证代码元素列表是否包含函数名fcnprotoctrl\u运行.要查看声明,请选择函数名。

该声明在代码中突出显示:

  • 在文件中验证名称更改rtwdemo_fcnprotoctrl.c。要查看源代码(定义),请在搜索字段中,选择fcnprotoctrl\u运行

有关更多示例,请参见为单个C入口点函数配置名称

自定义函数参数

配置全局数据结构

默认情况下,顶部或参照模型使用void-void步进函数传递数据。这种类型的函数通过访问作为驻留在共享内存中的数据结构存储的全局数据,使生成的代码能够与外部代码通信。

将模型配置为具有void-void步骤功能,打开“配置C步骤功能界面”对话框并清除为步骤函数原型配置参数复选框。的更改验证C函数原型预览。

配置参数

基于速率的模型步骤函数可以使用参数来传递数据。你可以自定义这些参数设置:

  • 返回值

  • 类型限定符

  • 的名字

  • 订单

例子

1.2 .打开“配置C步骤功能界面”对话框。在代码映射编辑器中,单击功能标签。然后,单击步骤函数的函数预览。

2.在配置C步骤功能界面对话框中,选择为步骤函数原型配置参数

3.点击得到默认。对话框展开显示一个用于配置函数返回值的字段和一个列出带有默认设置的输入和输出参数的表。

4.自定义步骤函数的返回值。集返回参数要么无效的或者输出参数之一。对于本例,请选择无效的

5.为每个参数指定一个C类型限定符

类型限定符:

  • 价值:值,例如,参数

  • 常数:值与常量例如,限定符常量参数

  • 指向常量的指针:值与常量限定符,并由指针引用,例如,常量*参数

  • 指针:指针引用,例如,*参数

  • 指向Const的Const指针:值与常量限定符,指针引用,指针本身,例如,常量*常量参数

包含引用模型的模型

  • 对于引用的模型,步骤函数接口中的根输入参数的类型限定符被设置为汽车.代码生成器通过生成类型强制转换来使用接口规范常量限定符来自源信号。

  • 对于引用模型的父类,源信号的类型限定符被设置为非汽车。若要覆盖此行为,请添加常量引用模型的类型限定符。

对于本例,不更改C类型限定符。

6.属性中的值可以自定义参数名称C标识符名称列。

对于本例,通过删除下划线来更改参数的名称,例如,将arg_In1更改为argIn1。

7.通过将表行拖动到新的位置来自定义参数顺序。

对于本例,将Out1移动到第一个位置。向外移动2到第三个位置。

8.验证、应用更改、关闭对话框并保存模型。

9.生成代码并验证密码看法

  • 在文件中验证您的更改rtwdemo_fcnprotoctrl.h通过检查搜索领域包括函数fcnprotoctrl\u运行。要查看函数声明,请选择函数名称。

  • 在文件中验证您的更改rtwdemo_fcnprotoctrl.c.要查看函数的定义,请选择函数名fcnprotoctrl\u运行

原型不同于预览

在Configure C Step Function Interface对话框中,参考模型的函数原型预览显示的参数比生成代码中的函数原型少。

例如,考虑一个名为mdlref_计数器与进口(arg_输入)、外埠(arg_输出),以及具有限制的饱和块,这些限制具有工作空间参数参数名称lower_saturation_limit饱和上限.配置C步骤函数界面对话框显示函数原型预览如下:

mdlref_counter_custom (arg_input arg_output)

在生成的代码中,原型包括参数参数:

mdlref_计数器_自定义(实参数输入、实参数输出、实参数rtp_饱和下限、实参数rtp_饱和上限)

优化参数的缓冲

您可以在模型的step函数中优化I/O参数所需的缓冲。如果在配置导入和输出端口对时遵循这些要求,代码生成器将合并相应的参数并重用相关的缓冲区。

  • import和Outport块必须具有相同的属性,包括数据类型、维度和抽样率。

  • import和Outport块的抽样率必须与模型的基础率相同。

  • 有条件执行的子系统不能驱动Outport块。

  • 单个非虚拟块输出必须驱动输出端口块。例如,合并多个缓冲区的Mux块不能驱动输出端口块。

  • 在“配置C步骤功能接口”对话框中,需要配置具有相同C类型限定符和标识符名称的import和Outport。

此示例显示如何合并端口的参数In3Out2例如模型rtwdemo_fcnprotoctrl

1.打开模型的“配置C步骤功能界面”对话框rtwdemo_fcnprotoctrl

2.通过选择打开参数的显示为步骤函数原型配置参数

3.港口In3Out2设置C类型限定符指针C标识符名称沙尔达格

4.验证预览是否显示了的合并参数argIn3argOut2

5.验证、应用更改、关闭对话框并保存模型。

6.生成并查看代码。在密码查看,搜索fcnprotoctrl\u运行功能,并检查功能接口。对于本例,共享参数显示在输入端口块的读取代码和输出端口块的写入代码中。

以编程方式配置C入口点函数的代码生成设置

要自动配置模型函数以生成C代码,请使用代码映射的编程接口。例如,在创建自定义块库或应用程序测试环境的一部分时,使用编程接口自动进行功能配置。

这些功能的典型用法包括:

  • 创建一个函数接口。

  • 修改现有的功能接口。

  • 从模型的默认配置信息开始创建函数接口。

  • 重置模型功能接口为默认的ERT功能配置。

有关如何以编程方式配置C入口点函数的代码生成设置的示例,请参见以编程方式配置默认数据和函数代码生成。该示例显示了如何配置功能类别和单个功能的默认设置。

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

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

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

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

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

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

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

  7. 调用生成的入口点函数或设置使用的rt_OneStep作用

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

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

C函数接口自定义限制

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

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

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

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

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

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

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

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

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

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

    • 使Stateflow函数成为不可使用的函数。

    • 插入Simulin金宝appk®信号转换在根导入之后立即阻塞。在信号转换块参数对话框中,选择从“块缩减”优化中排除此块

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

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

  • 如果C函数接口不是默认的,则模型配置参数的值将被忽略按值传递固定大小的标量根输入以生成代码。有关详细信息,请参阅按值传递固定大小的标量根输入以生成代码

另见

|

相关话题