主要内容

从顶级模特生成重入代码

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

对于可以从重用中受益并要求代码的每个使用或实例维护其自己的唯一数据的应用程序,配置一个模型,使代码生成器生成可重入代码。要生成可重入代码,请设置模型配置参数代码接口封装可重用的功能.如果您使用的是嵌入式编码器®生成c++代码,或者,您也可以将参数设置为C++类.在这两种情况下,代码生成器:

  • 在实时模型数据结构中打包模型数据,例如块I/O、数据工作向量和参数(rtModel)。

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

  • 将根级别的输入和输出参数作为单个参数传递给生成的模型入口点函数。

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

  • 在生成的头文件中导出实时模型数据结构模型.h

通过设置以下模型配置参数,应用额外的诊断和代码生成控制:

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

  • 要控制生成的代码如何将根级别模型输入和输出传递给可重用执行(step)函数(需要嵌入式编码器),请设置参数将根级I/O传递为(嵌入式编码器)个人论点,结构参考模型数据结构的一部分

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

  • 要通过从实时模型数据结构(需要Embedded Coder)中删除错误状态字段来减少内存使用,请选择模型配置参数去除实时模型数据结构中的错误状态字段

  • 在生成的文件中包含函数的步骤模型.c使用malloc动态分配存储器,用于模型实例数据(需要嵌入式编码)中,选择模型的配置参数对模型初始化使用动态内存分配. 如果不选择此参数,生成的代码将静态地为模型数据结构分配内存。

生成再入式,多实例代码

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

打开模型

打开模型rtwdemo_reusable.该模型包含两个根import块和一个根Outport块。

模型=“rtwdemo_可重用”; 开放式系统(模型);

将模型副本保存到可写位置。

currentDir = pwd;[~, cgDir] = rtwdemodir ();

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

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

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

3.模型配置参数系统目标文件被设定为ert.tlc. 尽管您可以为配置为的模型生成可重入代码系统目标文件设置为grt.tlc基于ERT-ERT和系统目标文件提供更多的控制权的代码是如何通过根级I / O。

4.打开代码生成>接口窗格并浏览相关的模型配置参数设置。

  • 代码接口封装被设定为可重用的功能.此参数设定指令码生成器生成可重复使用的,多实例代码。

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

  • 将根级I/O传递为被设定为模型数据结构的一部分.此设置包根级模型的输入和输出到实时模型数据结构(rtModel),这是一种优化的数据结构,可替代西姆斯特雷特作为模型的顶级数据结构。

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

生成并检查代码

rtwbuild(模型);
###开始构建过程为:构建过程的rtwdemo_reusable ###成功完成了:rtwdemo_reusable制作摘要顶级车型的目标建:示范行动重建原因================================================================================================= rtwdemo_reusable代码生成和编译的代码生成信息文件不存在。内置1款1(0型号已经是最新的)建造时间:0小时0米12.089s

检查生成的代码。

  • ert_main.c是模型的示例主程序(执行框架)。此代码通过调用入口点函数来控制模型代码的执行rtwdemo_reusable_step.使用这个文件作为编写执行框架的起点。

  • rtwdemo_reusable.c包含实现模型算法的代码的入口点。此文件包括费率计划代码。

  • rtwdemo_reusable.h声明模型数据结构和一个公共接口模型入口点和数据结构。

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

代码接口

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

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

2.将输入数据写入模型输入块的生成代码。

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

4.从生成的代码中读取模型Outport块的数据。

输入端口:

  • /In1的数据real_T维数为1

  • /In2的数据real_T维数为1

入口点函数:

  • 初始化入口点函数,void rtwdemo\u可重用\u初始化(RT\u模型*常量rtM).在启动时,调用此函数一次。

  • 输出和更新(step)入口点函数,无效rtwdemo_reusable_step(RT_MODEL * const的RTM).以模型中最快的速度周期性地调用这个函数。对于这个模型,每秒钟调用一次函数。为了实现实时执行,将此功能附加到计时器上。

输出端口:

  • < Root > /着干活数据类型的real_T维数为1

检查步骤功能

检查| rtwdemo_reusable_step |rtwdemo_reusable.c |在功能代码|。
cfile=fullfile(cgDir,“rtwdemo_reusable_ert_rtw”,'rtwdemo_reusable.c'); rtwdemodbtype(cfile,“/ *型号阶梯函数”,/*初始化函数,1,0);
/* void rtwdemo_reusable_step(RT_MODEL *const rtM) {D_Work *rtDWork = rtM->dwork;ExternalInputs *rtU = (ExternalInputs *) rtM->inputs;ExternalOutputs *rtY = (ExternalOutputs *) rtM->outputs;/* Outport: '/Out1'合并:* UnitDelay: '/Delay' */ rtY->Out1 = rtDWork->Delay_DSTATE;/* Gain: '/Gain'合并:* Inport: '/In1' * Inport: '/In2' * Sum: '/Sum' * UnitDelay: '/Delay' */ rtDWork->Delay_DSTATE = (rtU->In1 + rtU->In2) * rtP.k1;}

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

关闭模型并报告

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

bdclose rtwdemoclean(模型);cd (currentDir)

在实例之间共享数据

当你的代码调用一个折返模型入口点函数多次,每次调用代表模型的实例。默认情况下,代码生成器生成,它假定每个实例从读取和写入的信号,块状态,并且在该模型参数的单独副本的代码。

  • 要在实例之间共享一段参数数据(例如,共享可重用PID控制算法的设定值),可以使用一个参数对象,例如金宝app仿真软件。参数.然后,配置参数比其他存储类汽车或者在代码映射编辑器中,为相应类别的参数数据设置默认存储类默认的(默认设置),以模型的默认.参数对象以全局符号的形式出现在代码中,比如函数直接访问的全局变量。有关更多信息,请参见模型接口元素的C代码生成配置

  • 要共享一块实例之间非参数数据(例如,共享一个故障指示或蓄电池)中,使用的数据存储。您可以配置数据存储出现在代码作为一个全球性的符号,比如一个全局变量,该功能直接访问。通过使用创建全球数据存储金宝appSimulink.Signal反对或使用数据存储内存块,并选择块参数跨模型实例共享. 有关详细信息,请参阅通过创建数据存储为全局数据建模数据存储内存

相关话题