主要内容

从顶层模型生成可重入代码

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

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

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

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

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

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

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

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

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

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

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

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

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

生成可重入的多实例代码

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

打开模型

打开模型rtwdemo_reusable.该模型包含两个根导入块和一个根输出块。

模型=“rtwdemo_reusable”;open_system(模型);

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

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

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

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

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

3.型号配置参数系统目标文件设置为ert.tlc.尽管您可以为配置的模型生成可重入代码系统目标文件设置为grt.tlc, ERT和基于ERT的系统目标文件对代码如何传递根级I/O提供了更多的控制。

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

  • 代码接口打包设置为可重用的功能.此参数设置指示代码生成器生成可重用的多实例代码。

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

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

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

生成和审查代码

slbuild(模型);
###开始构建过程:rtwdemo_reusable构建过程成功完成:rtwdemo_reusable构建摘要构建的顶级模型目标:模型动作重建原因================================================================================================= rtwdemo_reusable生成和编译的代码生成信息文件不存在。构建1 / 1模型(0个模型已经更新)构建持续时间:0h 0m 19.724s

检查生成的代码

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

  • rtwdemo_reusable.c包含实现模型算法的代码的入口点。该文件包括速率调度代码。

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

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

代码接口

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

1.通过添加指令来包含生成的头文件# include rtwdemo_reusable.h

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

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

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

输入端口:

  • < Root > /三机一体的数据real_T维数为1

  • < Root > / In2的数据real_T维数为1

入口点函数:

  • 初始化入口点函数,void rtwdemo_reusable_initialize(RT_MODEL * rtM).在启动时,调用此函数一次。

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

输出端口:

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

检查阶跃函数

检查|rtwdemo_reusable_step|中的|rtwdemo_reusable_step|函数代码。
cfile = fullfile(cgDir,“rtwdemo_reusable_ert_rtw”“rtwdemo_reusable.c”);rtwdemodbtype(用'/*模型阶跃函数'/*模型初始化函数, 1, 0);
/*模型步长函数*/ void rtwdemo_reusable_step(RT_MODEL *const rtM) {D_Work *rtDWork = rtM->dwork;外部输入*rtU =(外部输入*)rtM->输入;ExternalOutputs *rtY = (ExternalOutputs *) rtM->outputs;* UnitDelay: '/Delay' */ rtY->Out1 = rtDWork->Delay_DSTATE;/*增益:'<根>/增益'合并:*输入:'<根>/In1' *输入:'<根>/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代码生成配置

  • 要在实例之间共享一段非参数数据(例如,共享故障指示或累加器),请使用数据存储。可以配置数据存储,使其在代码中显示为全局符号(例如函数直接访问的全局变量)。创建全局数据存储金宝app仿真软件。信号对象或使用数据存储内存块和选择块参数跨模型实例共享.有关更多信息,请参见通过创建数据存储对全局数据建模而且数据存储内存

相关的话题