主要内容

为模型入口点函数配置生成的C函数接口

什么是入口函数?

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

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

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

生成的入口点函数的类型

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

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

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

配分函数 分区:slIdentifier,在那里slIdentifier是由模型中的块显式创建并显示在Simulink®Schedule Editor(例如,P1)中的分区,还是并发执行对话框中的任务名称万博1manbetx 模型_stepn,在那里n唯一标识为一个模型样本周期生成的函数 对于模型分区,输出和更新代码。型号配置参数单输出/更新功能被选中(默认值)。
分区更新功能 PartitionUpdate:slIdentifier,在那里slIdentifier是由模型中的块显式创建并显示在Simulink®Schedule Editor(例如,P1)中的分区,还是并发执行对话框中的任务名称万博1manbetx 模型_outputn而且模型_updaten,在那里n唯一标识为一个模型样本周期生成的函数 对于一个模型分区,在不同的函数中输出和更新代码。型号配置参数单输出/更新功能清除。
周期性多任务功能 周期:slIdentifier在哪里slIdentifier是一个注释,对应于多任务模型的周期或连续速率的采样时间段(例如D1)。 模型_stepn,在那里n唯一标识为一个模型样本周期生成的函数 对于配置为多任务处理、输出和更新代码的基于速率的模型中的块。代码生成器为每个样本周期生成一个函数。型号配置参数单输出/更新功能被选中(默认值)。
定时多任务更新功能 PeriodicUpdate:slIdentifier在哪里slIdentifier是一个注释,对应于多任务模型的周期或连续速率的采样时间段(例如D1)。 模型_outputn而且模型_updaten,在那里n唯一标识为一个模型样本周期生成的函数 对于配置为多任务处理的基于速率的模型中的块,在单独的函数中输出和更新代码。代码生成器为每个示例周期生成输出和更新函数。型号配置参数单输出/更新功能清除。
周期性单任务功能 周期 模型_step 对于配置为单任务、输出和更新代码的基于速率的模型中的块。型号配置参数单输出/更新功能被选中(默认值)。
定时单任务更新功能 PeriodicUpdate 模型_output而且模型_update 对于配置为单任务的基于速率的模型中的块,在单独的函数中输出和更新代码。型号配置参数单输出/更新功能清除。
重置功能 重置:slIdentifier在哪里slIdentifier重置函数的名称是否在模型中 模型_reset-function-name

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

万博1manbetx仿真软件的功能 万博1manbetx仿真软件功能:slIdentifier在哪里slIdentifier是名字吗万博1manbetx仿真软件的功能模型中的块 函数名对于一个全局万博1manbetx仿真软件的功能块或模型_函数名对于有范围的万博1manbetx仿真软件的功能 对于导出函数模型,a的导出函数万博1manbetx仿真软件的功能块。
终止函数 终止 模型_terminate

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

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

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

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

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

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

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

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

  • 创建不带参数的执行函数(void-void).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

对于配置了服务接口的模型,您可以配置:

  • 函数名

  • 表示为Simulink函数块的子组件中的函数和组件模型中的函数的函数参数万博1manbetx

  • 记忆的部分

配置 更多的信息
跨模型的函数类别(初始化/终止、执行和共享实用程序)的默认命名规则 配置函数的默认代码生成
单个入口点函数的名称(重写默认命名规则) 为各个C入口点函数配置名称
步骤函数接口(函数名、返回值和参数C类型限定符、名称和顺序)交互用于基本速率步骤入口点函数 为各个步骤函数配置名称和参数
交互式地为Simulink函数和函数调用者块提供函数接口(函数名、返回值和参数C类型限定符、名称和顺序)万博1manbetx 为Simulink函数和函数调用方块配置入口点函数接口万博1manbetx

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

配置功能类别的默认代码生成设置

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

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

功能分类 描述
初始化和终止 初始化和关闭系统的函数
执行 初始化执行和重置的函数
共享效用 共享实用程序函数代码

属性为函数配置默认代码映射代码映射编辑器- 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函数原型字段或单击好吧命令,退出对话框,并在文件中查看函数名称预览功能列的代码映射编辑器。

    类的名称初始化函数fcnprotoctrl_init

  5. 保存模型。

  6. 生成的代码。

  7. 验证生成代码中的更改。在代码视图,查找函数名的实例fcnprotoctrl_init.函数名出现在生成的文件中rtwdemo_fcnprotoctrl.h而且rtwdemo_fcnprotoctrl.c

    • rtwdemo_fcnprotoctrl.h

      fcnprotoctrl_init(void);
    • rtwdemo_fcnprotoctrl.c

      Void fcnprotoctrl_init(Void){…}

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

为了使生成的C代码符合代码标准和准则,或者更容易地将代码与外部代码集成,您可以配置为Simulink周期函数生成的各个步长函数的名称和参数。万博1manbetx你可以自定义阶跃函数的这些方面:

  • 函数名

  • 参数名称

  • 论证的顺序

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

  • 参数的缓冲优化

如果你的模型至少满足这些条件之一,考虑分别配置阶跃函数的名称和参数:

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

  • 是否有默认配置执行函数类别,您需要覆盖特定步骤函数的配置。

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

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

打开“配置”对话框

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

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

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

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

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

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

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

自定义函数名

1.在“配置C步骤功能接口”对话框中,设置C步骤功能接口C步骤功能名称fcnprotoctrl_run.函数预览被更新以反映新的函数名。

2.点击应用,关闭对话框,保存模型。

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

  • 单击代码选项卡。在代码查看文件列表,选择文件rtwdemo_fcnprotoctrl.h.在搜索字段,验证代码元素列表是否包含函数名fcnprotoctrl_run.要查看声明,请选择函数名。

声明在代码中突出显示:

  • 验证文件中的名称更改rtwdemo_fcnprotoctrl.c.若要查看源代码(定义),请在搜索字段中,选择fcnprotoctrl_run

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

自定义函数参数

配置全局数据结构

默认情况下,顶部或引用模型使用void-void步骤函数传递数据。这种类型的函数允许生成的代码通过访问存储在共享内存中的数据结构的全局数据与外部代码通信。

将模型配置为具有void-void步骤功能,打开“配置C步骤功能接口”对话框为Step函数原型配置参数复选框。中的更改C函数原型预览。

配置参数

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

  • 返回值

  • 类型限定符

  • 的名字

  • 订单

例子

1.进入“配置C步骤功能接口”对话框。在代码映射编辑器中,单击功能选项卡。然后,单击步骤函数的功能预览。

2.在“配置C步骤功能接口”对话框中,选择为Step函数原型配置参数

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

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

5.对于每个参数,指定aC类型限定符

类型限定符:

  • 价值:值,例如:参数

  • 常量:具有常量比如限定符,常量参数

  • 指向const的指针:值为常量限定符和指针引用,例如,常量参数

  • 指针:通过指针引用,例如:参数

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

包含引用模型的模型

  • 对于引用的模型,将阶跃函数接口中根输入参数的类型限定符设置为汽车.类的类型强制转换,从而使用接口规范常量来自源信号的限定符。

  • 对于引用模型的父类,源信号的类型限定符被设置为汽车.若要重写此行为,请添加常量将限定符输入引用的模型。

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

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

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

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

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

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

9.中生成代码并验证更改代码视图。

  • 验证文件中的更改rtwdemo_fcnprotoctrl.h通过检查搜索字段包含函数fcnprotoctrl_run.要查看函数声明,请选择函数名。

  • 验证文件中的更改rtwdemo_fcnprotoctrl.c要查看函数的定义,请选择函数名fcnprotoctrl_run

原型与预览不同

在“配置C步骤函数接口”对话框中,引用模型的函数原型预览可以比生成代码中的函数原型显示更少的参数。

例如,考虑一个名为mdlref_counter通过导入(arg_input)、外港(arg_output),以及一个具有工作区参数参数名称的限制的饱和块lower_saturation_limit而且upper_saturation_limit.“配置C步骤函数接口”对话框显示了一个函数原型预览:

mdlref_counter_custom (arg_input arg_output)

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

mdlref_counter_custom(real_T arg_input, real_T arg_output, real_T rtp_lower_saturation_limit, real_T rtp_upper_saturation_limit)

优化参数缓冲

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

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

  • import和Outport块的采样速率必须与模型的基本速率相同。

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

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

  • 在“配置C步骤功能接口”对话框中,必须使用相同的C类型限定符和标识符名称配置导入和输出端口。

这个例子展示了如何合并端口的参数In3而且Out2例如模型rtwdemo_fcnprotoctrl

1.打开模型的“Configure C Step Function Interface”对话框rtwdemo_fcnprotoctrl

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

3.对港口In3而且Out2,设置C类型限定符指针而且C标识符名称sharedArg

4.验证预览显示的合并参数argIn3而且argOut2

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

6.生成并查看代码。在代码视图,搜索fcnprotoctrl_run功能和检查功能界面。对于本例,共享参数出现在Inport块的读代码和Outport块的写代码中。

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

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

这些函数的典型用法包括:

  • 创建一个函数接口。

  • 修改已有的功能接口。

  • 从一个模型的默认配置信息开始创建一个功能接口。

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

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

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

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

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

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

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

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

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

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

  8. 如果适用,从表示模型输出端口块的生成变量中读取数据。

有关更多信息,请参见将应用程序部署到目标硬件

C函数接口自定义限制

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

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

  • 支持多速率模型,但必须为单个任务配置模型。万博1manbetx

  • 属性的根级导入和输出端口必须配置默认的存储类。

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

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

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

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

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

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

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

    • 插入Simulin万博1manbetxk®信号转换在根导入后立即阻塞。在信号转换块参数对话框中,选择从“减少块”优化中排除此块

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

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

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

另请参阅

|

相关的话题