主要内容

生成可重入的代码从上模型

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

应用程序也可以受益于重用和每次使用要求或实例的代码保持自己独特的数据,配置模型,代码生成器产生可重入的代码。生成可重入代码,设置模型配置参数代码接口包装可重用的功能。如果您使用的是嵌入式编码器®生成c++代码,或者,您可以设置参数c++类。在这两种情况下,代码生成器:

  • 包模型数据,如块I / O, DWork向量,和参数,实时模型数据结构(rtModel)。

  • 通过实时模型数据结构作为输入参数,通过引用,生成的模型入口点函数。

  • 通过根级的输入和输出参数入口点函数作为单独的参数生成模型。

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

  • 出口数据结构的实时模型生成的头文件模型。h

申请额外的诊断和代码生成控制通过设置这些模型配置参数:

  • 选择诊断消息的严重性级别代码生成器显示当一个模型不满足要求多实例代码,设置参数多实例代码错误诊断没有一个,警告,或错误。将参数设置为错误除非你需要改变的严重程度诊断时显示一个模型生成多实例代码违反了要求。

  • 控制生成的代码通过根级模型输入和输出可执行(步骤)函数(需要嵌入式编码器),设置参数通过根级I / O个人观点,结构参考,或模型数据结构的一部分

    当您设置代码接口包装可重用的功能代码生成器包模型数据(如块I / O、Dwork和参数)到实时模型数据结构,并将模型结构传递到入口点函数生成的模型。如果你设置通过根级I / O模型数据结构的一部分代码生成器包根级模型输入和输出到实时模型的数据结构。

  • 减少内存使用省略了错误状态字段从实时模型数据结构(需要嵌入式编码器),选择模型配置参数删除错误状态字段在实时模型的数据结构

  • 在生成的文件包含一个函数模型。c使用malloc动态分配内存模型实例数据(需要嵌入式编码器),选择模型配置参数使用动态内存分配模型初始化。如果你不选择这个参数,生成的代码静态分配的内存模型的数据结构。

生成可重入,多实例的代码

这个例子向您展示如何配置一个可重入模型,多实例代码生成。多个程序可以同时使用可重入的代码。当您配置一个可重入性模型,执行(步骤)入口点函数使用root输入和输出参数,而不是全局数据结构。检查配置设置后,生成的代码生成和审查。

打开模型

打开模型可重用的。模型包含两根和根外港块尺寸块。

模型=可重用的;open_system(模型);

检查相关的模型配置参数设置

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

2。打开模型配置参数对话框。

3所示。模型配置参数系统目标文件被设置为ert.tlc。虽然您可以生成一个模型的可重入代码和配置系统目标文件设置为grt.tlc,ERT ERT-based系统目标文件提供更多的控制代码如何通过根级I / O。

4所示。打开代码生成>界面面板和探索相关的模型配置参数设置。

  • 代码接口包装被设置为可重用的功能。这个参数设置指示代码生成器生成可重用,多实例的代码。

  • 设置可重用的功能显示参数多实例代码错误诊断。参数设置为错误,这表明代码生成器中止如果模型生成多实例代码违反了要求。

  • 通过根级I / O被设置为模型数据结构的一部分。这个设置包根级模型输入和输出到实时模型数据结构(rtModel),这是一个优化的数据结构,取代SimStruct作为顶级数据结构模型。

  • 删除错误状态字段在实时模型的数据结构被选中。以减少内存使用省略此参数设置错误状态字段生成的实时模型的数据结构。

生成和检查代码

slbuild(模型);
# # #开始构建过程:可重用的# # #成功完成构建过程:可重用模型建立目标:总结构建模型重建行动的原因= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =可重用的代码生成和编译。代码生成信息文件不存在。1 1模型的建立(0模型已经更新)构建持续时间:0 h 0米28.532秒

检查生成的代码

  • ert_main.c是一个主程序(执行框架)模型。这段代码控制模型代码执行调用的入口点函数Reusable_step。使用这个文件作为起点编码执行框架。

  • Reusable.c包含代码的入口点,实现了模型的算法。这个文件包括调度代码。

  • Reusable.h声明模型数据结构和模型入口点的公共接口和数据结构。

  • rtwtypes.h定义数据类型、结构和宏生成的代码需要。

代码接口

打开和检查接口的代码报告。使用该报告中的信息来编写的界面代码执行框架。

1。通过添加指令包括生成的头文件# include Reusable.h

2。写输入数据生成的代码模型尺寸块。

3所示。调用生成的入口点函数。

4所示。读取数据模型生成代码的输出港。

输入端口:

  • < Root > /三机一体的数据real_T1的尺寸

  • < Root > / In2的数据real_T1的尺寸

入口点函数:

  • 初始化入口点函数,空白Reusable_initialize (RT_MODEL * const rtM)。在启动时,调用这个函数一次。

  • 输出和更新(步骤)入口点函数,空白Reusable_step (RT_MODEL * const rtM)。调用这个函数定期在最快的速度模型。对于这个模型,每秒钟调用该函数。实现实时执行,这个函数附加到一个计时器。

输出端口:

  • < Root > /着干活的数据类型real_T1的尺寸

检查阶跃函数

检查| Reusable_step | |函数代码Reusable.c |。
用= fullfile (“Reusable_ert_rtw”,“Reusable.c”);rtwdemodbtype(用“/ *模型阶跃函数”,/ *模型初始化函数的1 0);
/ *模型阶跃函数* /空白Reusable_step (RT_MODEL * const rtM) {D_Work * rtDWork = rtM - > dwork;ExternalInputs * rtU = (ExternalInputs *) rtM - >输入;ExternalOutputs *而= (ExternalOutputs *) rtM - >输出;/ *输出港:“< Root > /着干活”包含:* UnitDelay: < Root > /延迟的* /而无- >着干活= rtDWork - > Delay_DSTATE;/ *获取:“< Root > /增益”包含:*金额:< Root > /笔的* UnitDelay: < Root > /延迟的* / rtDWork - > Delay_DSTATE = (rtU - > In1 + rtU - > In2) * rtP.k1;}

代码生成器模型数据Reusable_step函数作为实时模型数据结构的一部分。尝试不同的设置模型配置参数代码接口包装通过根级I / O并重新生成代码。观察函数原型如何变化。

关闭模型和报告

关闭模型和代码生成报告。

bdclose(模型)

实例之间共享数据

当你的代码调用一个凹模型入口点函数多次,每次调用表示模型的一个实例。默认情况下,代码生成器生成的代码假定每个实例读取和写入到一个单独的信号副本,阻塞状态,模型中的参数。

  • 分享一块之间的参数数据实例(例如,共享一个定位点为一个可重用的PID控制算法),使用一个参数对象,如金宝appSimulink.Parameter。然后,配置参数以外的存储类汽车或在代码映射编辑器,设置默认为相应类别的参数存储类数据默认的(默认设置)模型的默认。代码中的参数对象出现全局符号,如一个全局变量,函数直接访问。有关更多信息,请参见界面元素C代码生成配置模型

  • 分享一块nonparameter数据之间的实例(例如,共享一个故障显示或蓄电池),使用一个数据存储。您可以配置数据存储在代码中出现全局符号,如一个全局变量,函数直接访问。创建一个全局数据存储使用金宝appSimulink.Signal对象或使用数据存储内存块,选择块参数分享跨模型实例。有关更多信息,请参见通过创建数据存储模型全局数据数据存储内存

相关的话题