主要内容

执行从模型生成的代码

代码生成器生成算法代码定义的模型。你可以包括外部(例如,定制或遗留)代码模型通过使用技术的解释选择一个外部代码集成工作流

代码生成器还提供了一个接口,执行生成的模型代码。接口和模型代码编译在一起来创建一个可执行程序。下一个图显示一个可执行的高级面向对象的视图。

实时程序的面向对象的视图

在一般情况下,模型的概念设计执行驱动程序不会改变之间的快速原型和嵌入式的生成的代码风格。以下部分描述模型执行单一任务和多任务环境模拟(非实时)和实时。对于大多数模型代码,执行多任务环境提供了最有效的模型(即最快的采样率)。

下面的概念是有用的在描述如何执行模型代码。

  • 初始化:模型_initialize初始化代码和模型代码的接口。

  • ModelOutputs:电话在您的模型中,有一个样品在当前时间和他们产生输出。模型_output可以做在或大或小的时间步长。主要时间步骤,输出是一个给定的模拟时间步。在较小的时间步长,界面集成了衍生品更新连续状态。

  • ModelUpdate:模型_update调用块有一个样品在当前时间点,有他们更新离散状态或类似的对象类型。

  • ModelDerivatives:调用块在你的模型连续状态和更新他们的衍生品。模型_derivatives只有较小的时间步长。

  • ModelTerminate:模型_terminate终止这个项目如果是设计运行一个有限的时间。它破坏了实时模型数据结构,重新分配内存,并且可以写入数据到一个文件。

程序执行

实时程序不需要100%的CPU时间。这一需求提供了一个机会来运行后台任务在空闲时间。

后台任务包括操作,比如数据写入缓冲区或文件,允许访问程序数据通过第三方数据监测工具,或更新程序参数。

是很重要的,然而,程序能够抢占后台任务的实时模型代码可以执行。

项目管理任务的方式取决于环境的能力在其运作。

项目时间

实时程序需要仔细定时任务的调用(使用一个中断或一个实时操作系统任务原始)的模型代码执行完成另一项任务调用之前发生。时间包括时间读写数据和从外部硬件。

下一个图展示了中断时间。

任务时间

取样间隔必须足够长的时间来允许代码执行任务之间的调用模型。

在上面的图中,两个相邻垂直箭头之间的时间间隔取样间隔。上面图中的空盒子显示的一个例子程序,可以完成一个步骤在间隔和后台任务仍然允许时间。低图中的灰色框表明如果取样间隔太短了。另一个任务调用发生在任务完成之前。这样的计时结果执行错误。

如果永远实时程序被设计为运行(即最后一次是0或无限的循环永不退出),然后关闭代码不执行。

更多信息在计时引擎是如何工作的,看到的绝对和运行时间计算

外部模式的沟通

外部模式允许之间的通信模型金宝app®框图和独立的程序,由生成的代码。在这种模式下,实时程序函数作为一个进程间通信服务器,响应请求的仿真软件引擎。金宝app

数据记录在单一任务和执行多任务模型

为调试配置模型解释了如何保存系统状态,输出,和时间MAT-file在完成模型的执行。的LogTXY函数,该函数执行数据记录,经营不同单一任务和多任务环境中。

如果你检查LogTXY叫做单一任务和多任务环境中,注意到单一任务吗LogTXY被称为后ModelOutputs。在这ModelOutputs电话,块有一个时刻t执行,而在多任务处理,LogTXY被称为后ModelOutputs (tid = 0),这只执行打击的块t和有任务标识符(0)。这将导致不同的单一任务之间的值和多任务日志记录。具体来说,考虑模型与两次样品,样品越快时间有一段1.0秒和样品时间越慢有一段10.0秒。在时间t = k * 10 k = 0、1、2……快(tid = 0)和慢速(tid = 1)块执行。当执行多任务处理模式下,当LogTXY被调用时,执行缓慢的街区,但记录的前一个值,而在单一任务的当前值记录。

另一个区别发生在测井资料在一个子系统启用。考虑一个启用子系统有慢速信号驱动使港口和快速块内启用子系统。在这种情况下,评价使信号的发生在一个缓慢的任务,和快速块看到一个样品的延迟期;因此,记录值将显示这些差异。

总结记录单一任务,多任务之间的数据差异,差异会被当

  • 根外港块有一个样品时间是慢于最快的样品时间

  • 一块与州有一个样品时间是慢于最快样品时间

  • 一块在一个信号驱动的启用子系统启用端口是低于使子系统的模块

第一两种情况下,即使记录单一任务,多任务之间的值是不同的,模型结果不不同。唯一的区别是(什么时候)日志。第三个(启用子系统)导致延迟,在实时环境中可以看到。

非实时单任务系统

这个伪代码显示为非实时模型单一任务的执行系统。

main(){初始化时(时间<最后一次)ModelOutputs——大时间步长。LogTXY——日志时间、状态和根外港。ModelUpdate——大时间步长。整合——整合在较小的时间步模型连续状态。ModelDerivatives做0或多个ModelOutputs ModelDerivatives EndDo——迭代次数取决于解决整合衍生品更新连续状态。EndIntegrate EndWhile终止}

首先初始化阶段开始。这包括初始化模型的状态和设置执行引擎。模型执行,一步一个脚印。第一个ModelOutputs执行时间t,然后工作区I / O数据记录,然后ModelUpdate更新离散状态。接下来,如果你的模型连续状态,ModelDerivatives集成了连续的衍生品产生美国时间 t n e w = t + h ,在那里h步长。然后往前移动 t n e w 这个过程重复。

ModelOutputsModelUpdate执行阶段的模型,只有块达到当前时间点执行。

非实时多任务系统

这伪代码显示了执行模型的实时多任务系统。

main(){初始化时(时间<最后一次)ModelOutputs (tid = 0)——大时间步长。LogTXY——日志时间、状态和根,外港。ModelUpdate (tid = 0)——大时间步长。整合——整合在较小的时间步模型连续状态。ModelDerivatives做0或多个ModelOutputs (tid = 0) ModelDerivatives EndDo(取决于求解的迭代次数)。整合衍生品更新连续状态。EndIntegrate i = 1: NumTids ModelOutputs (tid =我)——大时间步长。ModelUpdate (tid =我)——大时间步长。EndFor EndWhile终止}

比单一任务执行多任务操作更复杂,因为输出和更新功能细分的任务标识符(tid)传递给这些函数。这允许多个调用这些函数的不同任务标识符使用重叠中断,当使用一个或多个任务实时操作系统。在模拟,模拟了多个任务执行的代码的顺序会发生如果抢占并不存在一个实时系统。

多任务执行任务假定利率是基准利率的倍数。仿真软件金宝app产品实施这个当你创建一个固定的多任务模型。多任务执行循环非常类似于单一任务,除了使用任务标识符(tid)参数ModelOutputsModelUpdate

你不能使用tid值而不是代码生成的目标文件金宝app仿真软件编码器™金宝app仿真软件编码器跟踪使用tid当为一个特定的子系统或功能类型生成代码。在目标文件中生成代码时,这个论点不能因为范围没有跟踪子系统或功能类型。因此,tid变成了一个未定义的变量和目标文件无法编译。

实时单一任务系统

这个伪代码显示在实时单一任务的执行模型系统模型的运行中断级。

rtOneStep(){检查中断溢出使“rtOneStep”中断ModelOutputs——大时间步长。LogTXY——日志时间、状态和根外港。ModelUpdate——大时间步长。整合——集成在较小的时间步模型连续状态。ModelDerivatives做0或多个ModelOutputs ModelDerivatives EndDo(取决于求解的迭代次数)。整合衍生品更新连续状态。EndIntegrate} main(){初始化(包括安装rtOneStep作为一个中断服务例程,ISR,实时时钟)。(时间<最后一次)后台任务。EndWhile面具中断(禁用rtOneStep无法执行。)完成任何后台任务。 Shutdown }

实时单一任务的执行非常类似于非实时单一任务执行,除了而不是不同步的代码,rt_OneStep函数是由一个周期定时器中断。

在指定的时间间隔采样率计划的基地,中断服务例程(ISR)抢占后台任务执行模型代码。基本的采样率在模型中是最快的。如果模型有连续的块,然后积分步长采样率决定了基地。

例如,如果在100赫兹模型代码是一个控制器的操作,然后每0.01秒后台任务中断。在此中断,控制器读取输入的模拟-数字转换器(ADC),计算其输出,将这些输出写入数模转换器(DAC),并更新其状态。程序控制然后返回到后台任务。这些步骤必须发生在下次中断。

实时多任务系统

这个伪代码显示了如何执行模型在模型的实时多任务系统运行中断级。

rtOneStep(){检查中断溢出使“rtOneStep”中断ModelOutputs (tid = 0)——大时间步长。LogTXY——日志时间、状态和根外港。ModelUpdate (tid = 0)——大时间步长。整合——整合在较小的时间步模型连续状态。ModelDerivatives做0或多个ModelOutputs (tid = 0) ModelDerivatives EndDo(取决于求解的迭代次数)。整合衍生品和更新连续状态。EndIntegrate i = 1: NumTasks如果(在任务i) ModelOutputs (tid =我)ModelUpdate (tid =我)EndIf EndFor}主要(){初始化(包括安装rtOneStep作为一个中断服务例程,ISR,实时时钟)。(时间<最后一次)后台任务。EndWhile面具中断(禁用rtOneStep无法执行。)完成任何后台任务。 Shutdown }

运行模型在中断级实时多任务环境非常类似于以前的单一任务环境,除了重叠中断是用于并发执行的任务。

模型的执行单一任务或多任务环境中使用实时操作系统任务时原语非常类似于中断水平上面所讨论的例子。下面的伪代码是使用实时任务单一任务模型原语。

tSingleRate () {MainLoop:如果clockSem已经“给定的”,然后由于溢出错误。等待clockSem ModelOutputs——大时间步长。LogTXY——日志时间、状态和根,外港ModelUpdate——大时间步整合——整合小时间步——模型连续状态。ModelDeriviatives做0或多个ModelOutputs ModelDerivatives EndDo(取决于求解的迭代次数)。整合衍生品更新连续状态。EndIntegrate EndMainLoop} main(){初始化启动/产卵的任务“tSingleRate”。开始时钟,“semGive”clockSem信号量。等待“model-running”信号。关闭}

在这种单一任务环境下,该模型执行任务实时操作系统原语。在这样的环境下,创建一个单一的任务(tSingleRate)运行模型代码。这个任务是时钟周期发生变化时调用。时钟滴答声了clockSem(时钟信号)模型任务(tSingleRate)。模型的任务执行前等待信号量。时钟滴答声发生的基本步长(基准利率)为您的模型。

使用实时多任务系统任务原语

伪代码是一个多任务模型使用实时任务原语。

tSubRate (subTaskSem i){循环:等待信号量subTaskSem。ModelOutputs (tid =我)ModelUpdate (tid =我)EndLoop} tBaseRate () {MainLoop:如果clockSem已经“给定的”,然后由于溢出错误。等待clockSem i = 1: NumTasks如果(在任务我)我目前正在执行的任务,然后错误由于溢出。做一个“semGive”subTaskSem任务我。EndIf EndFor ModelOutputs (tid = 0)——大时间步长。LogTXY——日志时间、状态和根外港。ModelUpdate (tid = 0)——大时间步长。循环:——集成在较小的时间步模型连续状态。ModelDeriviatives做0或多个ModelOutputs (tid = 0) ModelDerivatives EndDo(取决于求解的迭代次数)。整合衍生品更新连续状态。EndLoop EndMainLoop} main(){初始化启动/产卵的任务“tSubRate”。 Start/spawn task "tBaseRate". Start clock that does a "semGive" on a clockSem semaphore. Wait on "model-running" semaphore. Shutdown }

在这种多任务环境下,该模型使用实时操作系统任务执行原语。这样的环境需要几个模型任务(tBaseRate和几个tSubRate任务)运行模型代码。基准利率任务(tBaseRate)有一个更高的优先级比subrate任务。的subrate任务tid = 1有一个更高的优先级比subrate任务吗tid = 2,等等。基准利率的任务是时钟周期发生变化时调用。时钟滴答声了clockSemtBaseRate。的第一件事tBaseRate是给信号的子任务在当前时间点。因为基准利率任务有一个更高的优先级,它继续执行。接下来它执行任务(最快tid = 0块组成的),在您的模型中,最快样品时间。执行之后,它的简历等待时钟信号。时钟滴答配置发生的基本步长为您的模型。

快速原型模型和嵌入式执行差异

快速原型程序框架提供了一个通用的应用程序编程接口(API)之间不会改变模型的定义。

嵌入的编码器®产品提供了一个不同的框架称为嵌入式程序框架。嵌入式程序框架提供了一个API,它是适合你的模型进行了优化。当你使用的嵌入式风格生成的代码,你是建模如何喜欢你的代码来执行你的嵌入式系统。因此,您的模型中定义的定义应该是特定于您的嵌入式目标。等项目的模型名称、参数和信号存储类包括作为API的一部分嵌入的代码风格。

一个主要的区别快速原型和嵌入式的生成的代码风格,后者包含更少的入口点函数。嵌入式样式代码可以配置为只有一个功能,模型_step

因此,模型执行代码消除循环…EndLoop语句和组ModelOutputs,LogTXY,ModelUpdate为一条单独的语句,模型_step

如何生成的嵌入代码执行的更多信息,见配置生成的C函数入口点函数接口模型

相关的话题