代码的执行从模型生成

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

代码生成器还提供了执行所生成的模型代码的接口。接口和型号代码被编译,共同创造一个可执行程序。下图显示可执行的一个高层次的面向对象的视图。

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

一般而言,模型执行驱动器的概念设计不快速原型和生成的代码嵌入样式之间变化。下面的章节描述了单任务和多任务环境既为模拟(非实时)和实时模式执行。对于大多数型号代码,多任务环境中提供了最有效的模型执行(即,最快的采样率)。

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

  • 初始化模型_初始化初始化界面代码和型号代码。

  • ModelOutputs:调用模型中,在当前时间有样品命中块,有他们自己的产品输出。模型_output可在或大或小的时间步骤来完成。在主要的时间步,输出是一个给定的模拟时间步。在次要的时间步长,该接口集成衍生物来更新连续状态。

  • ModelUpdate模型_Update呼吁那些有能力在当前点采样砸在时间块,并他们更新自己的离散状态或相似类型的对象。

  • ModelDerivatives:在你的模型有连续状态,具有它们更新它们的衍生物呼叫块。模型_derivatives仅称为轻微的时间步长。

  • ModelTerminate模型_terminate终止程序,如果它被设计成在有限的时间运行。它破坏了实时模型的数据结构,释放内存,并且可将数据写入到文件中。

程序执行

实时程序不能要求的CPU时间的100%。本标准规定了在空闲时间运行后台任务的机会。

背景任务包括诸如数据写入缓冲区或文件,允许第三方数据访问程序数据监测工具,或更新程序参数的操作。

这是很重要的,但是,该方案能够抢占后台任务,因此模型的代码可以实时执行。

程序管理任务的方式取决于其经营环境的能力。

项目时间

实时程序需要调用任务的准确定时(通过使用中断或实时操作系统任务原语),这样另一个任务调用发生模型代码执行完成之前。定时包括时间来阅读和写入数据和从外部硬件。

下图说明了中断定时。

任务进度

采样间隔必须足够长,使任务调用之间型号代码执行。

在上面的图中,两个相邻的垂直箭头之间的时间是采样间隔。上部图中的空框表示一个程序,可以完成间隔内一个步骤,并且仍然允许时间后台任务的一个例子。的下图中灰色方块表示如果采样间隔太短会发生什么。面前的任务是完成时的另一个任务调用。这种计时结果在执行错误。

如果实时计划旨在永久运行(也就是最后的时间为0或无穷大,这样的循环永远不会退出),然后关机代码不执行。

有关定时引擎是如何工作的详情,请参阅绝对和使用时间计算

外部模式通信

外部模式允许的Simulink之间的通信万博1manbetx®框图和从生成的代码建立了独立的程序。在这种模式下,实时程序用作进程间通信服务器,响应于来自发动机的Simulink请求。万博1manbetx

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

配置模型调试解释了如何在模型执行的完成系统状态,输出以及时间保存到MAT文件。该LogTXY功能,其执行数据记录,在单任务和多任务环境不同地操作。

如果你研究如何LogTXY被称为在单任务和多任务环境,请注意,对于单任务LogTXY被称为后ModelOutputs。在这ModelOutputs打电话,在时间有命中块Ť执行,而在多任务处理,LogTXY被称为后ModelOutputs(TID = 0),仅执行在时间有命中块Ť并且具有为0的任务标识符这导致在单任务和多任务之间记录的记录值的差异。具体而言,考虑具有两个采样时间的模型,具有周期1.0秒和具有周期为10.0秒慢采样时间更快采样时间。在时间t = k * 10,K = 0,1,2 ...无论是快(TID = 0)和慢速(TID = 1)块执行。当在多任务模式中执行,当LogTXY被调用时,慢块执行,但在单任务的当前值记录的前值被记录,而。

在启用子系统记录数据时发生的另一个区别。考虑启用的子系统,它有一个缓慢的信号驱动使能子系统内部端口和快速块。在这种情况下,的评价使得能够在缓慢任务发生信号,和快块看到一个样本周期的延迟;因此记录值将显示这些差异。

为了总结在单任务和多任务之间记录的数据的差异,差异将可以看出,当

  • 外港嵌段A根具有采样时间比最快样品时间慢

  • 用状态A嵌段具有采样时间比最快样品时间慢

  • 在启用子系统A嵌段,其中所述驱动信号使能端是慢于块中的启用的子系统中的速率

对于前两种情况,即使记录的值之间的单任务和多任务不同,模型结果没有什么两样。唯一真正的区别是(在什么时间点)的日志记录都。第三个(已启用子系统)的情况下的结果,可以在实时环境中看到的延迟。

非实时单任务系统

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

主(){初始化虽然(时间<最终时间)ModelOutputs  - 主要时间步长。LogTXY  - 登录时间,状态和根outports。ModelUpdate  - 主要时间步长。整合 - 整合在较小的时间步长 - 连续状态的模型。ModelDerivatives DO 0以上ModelOutputs ModelDerivatives ENDDO  - 迭代次数取决于求解器集成衍生更新连续状态。EndIntegrate ENDWHILE终止}

初始化阶段开始第一。这包括初始化模型状态和设置执行引擎。然后,该模型执行,一次一个步骤。第一ModelOutputs在一次执行Ť,然后在工作区的I / O数据被记录,然后ModelUpdate更新离散状态。接下来,如果你的模型具有连续状态,ModelDerivatives集成了连续状态衍生物以生成时间的状态 Ť ñ Ë w ^ = Ť + H ,其中H是步长。时间再向前移动到 Ť ñ Ë w ^ 并重复该过程。

在此期间ModelOutputsModelUpdate模型执行的阶段,只有块,在时间达到目​​前的点执行。

非实时多任务系统

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

主(){初始化虽然(时间<最终时间)ModelOutputs(TID = 0) - 主要时间步长。LogTXY  - 登录时间,状态,和根 -  outports。ModelUpdate(TID = 0) - 主要时间步长。整合 - 整合在较小的时间步长 - 连续状态的模型。ModelDerivatives DO 0或多个ModelOutputs(TID = 0)ModelDerivatives ENDDO(迭代次数取决于解算器。)整合衍生物来更新连续状态。EndIntegrate对于i = 1:NumTids ModelOutputs(TID = I) - 主要时间步长。ModelUpdate(TID = I) - 主要时间步长。ENDFOR ENDWHILE终止}

因为输出和更新功能由细分多任务操作比单任务执行更复杂的任务标识符TID),其被传递到这些功能。这允许不同的任务标识符的这些功能多次调用使用重叠中断,或者使用实时操作系统时,多任务。在模拟中,多个任务在抢占如果没有在一个实时系统中存在时会出现的顺序执行代码效仿。

多任务执行,假设任务利率基准利率的倍数。当你创建万博1manbetx一个固定步长的多任务处理模型Simulink产品强制执行此。在多任务执行循环是非常相似的单任务的,不同的是使用的任务标识符的(TID)参数ModelOutputsModelUpdate

您不能使用TID从代码由目标文件,而不是由产生的值万博1manbetxSimulink的编码器™万博1manbetxSimulink的编码器跟踪使用TID用于特定子系统或功能类型生成代码时。当你在目标文件生成的代码,这种说法无法被跟踪,因为范围没有子系统或函数类型。因此,TID成为一个不确定的变量,你的目标文件无法编译。

实时单任务系统

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

rtOneStep(){检查中断溢出启用“rtOneStep”中断ModelOutputs  - 主要时间步长。LogTXY  - 登录时间,状态和根outports。ModelUpdate  - 主要时间步长。整合 - 整合了型号较小的时间步长 - 连续状态。ModelDerivatives DO 0或多个ModelOutputs ModelDerivatives ENDDO(迭代次数取决于解算器。)整合衍生物来更新连续状态。EndIntegrate}主(){初始化(包括安装rtOneStep的作为中断服务例程,ISR,对于实时时钟)。而(时间<最终时间)背景任务。ENDWHILE屏蔽中断(禁用rtOneStep的执行。)完成所有后台任务。关掉 }

实时单任务的执行是非常相似的非实时单任务的执行,只是不用的自由运行的代码中,rt_OneStep功能由周期定时器中断驱动。

在通过该程序的基础采样率指定的时间间隔中,中断服务例程(ISR)抢占后台任务执行模型的代码。基座采样率是在模型中最快的。如果模型具有连续块,则积分步长确定基本采样速率。

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

实时多任务系统

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

rtOneStep(){检查中断溢出启用 “rtOneStep” 中断ModelOutputs(TID = 0) - 主要时间步长。LogTXY  - 登录时间,状态和根outports。ModelUpdate(TID = 0) - 主要时间步长。整合 - 整合在较小的时间步长 - 连续状态的模型。ModelDerivatives DO 0或多个ModelOutputs(TID = 0)ModelDerivatives ENDDO(迭代次数取决于解算器。)整合衍生物和更新连续状态。EndIntegrate对于i = 1:NumTasks如果(命中在任务ⅰ)ModelOutputs(TID = I)ModelUpdate(TID = I)ENDIF ENDFOR}主(){初始化(包括安装rtOneStep的作为中断服务例程,ISR,对于一个实- 时间时钟)。而(时间<最终时间)背景任务。ENDWHILE屏蔽中断(禁用rtOneStep的执行。)完成所有后台任务。关掉 }

在一个真正的多任务环境中的中断级别运行模式非常类似于以前的单任务环境中,除了重叠中断用于任务并发执行。

一个模型在一个单任务或者多任务环境中使用实时操作系统任务原语当执行非常类似于中断级的例子如上所述。下面的伪代码是使用实时任务元单任务模式。

tSingleRate(){MainLoop语句:如果clockSem已经“定”,然后报错了由于溢出。等待clockSem ModelOutputs  - 主要时间步长。LogTXY  - 登录时间,状态和根 -  outports ModelUpdate  - 主要时间步整合 - 整合小的时间步长 - 对于连续模型 - 状态。ModelDeriviatives DO 0或多个ModelOutputs ModelDerivatives ENDDO(迭代次数取决于解算器。)整合衍生物来更新连续状态。EndIntegrate EndMainLoop}的main(){初始化启动/产卵任务 “tSingleRate”。开始时钟上clockSem信号做了“semGive”。等待“模式运行”信号。关掉 }

在这种单任务环境下,模型的执行方式实时操作系统任务原语。在这种环境下,建立一个单一的任务(tSingleRate)运行模型代码。当一个时钟周期发生这个任务被调用。时钟滴答给出了一个clockSem(时钟信号)的模型任务(tSingleRate)。该模型任务执行前等待信号灯。时钟滴答发生在基本步长(基准利率)为您的模型。

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

这是伪代码,使用实时任务原语多任务模式。

tSubRate(subTaskSem,i)的{循环:等待旗语subTaskSem。ModelOutputs(TID = I)ModelUpdate(TID = I)ENDLOOP} tBaseRate(){MainLoop语句:如果已经clockSem “给定的”,那么错误输出由于溢出。上clockSem等待对于i = 1:NumTasks如果(命中在任务ⅰ)如果任务i的当前正在执行,则错误输出由于溢出。做一个subTaskSem“semGive”任务i。ENDIF ENDFOR ModelOutputs(TID = O) - 主要时间步长。LogTXY  - 登录时间,状态和根outports。ModelUpdate(TID = O) - 主要时间步长。循环: - 连续状态模型 - 对整合小的时间步长。ModelDeriviatives DO 0或多个ModelOutputs(TID = 0)ModelDerivatives ENDDO(迭代次数取决于解算器)。整合衍生物来更新连续状态。 EndLoop EndMainLoop } main() { Initialization Start/spawn task "tSubRate". Start/spawn task "tBaseRate". Start clock that does a "semGive" on a clockSem semaphore. Wait on "model-running" semaphore. Shutdown }

在这种多任务环境下,采用实时操作系统任务原语执行模型。这样的环境需要几个模型任务(tBaseRate和几个tSubRate任务)运行模型代码。该基准利率任务(tBaseRate)具有比子速率任务更高的优先级。对于子速率任务TID = 1先后为子速率任务更高的优先级TID = 2, 等等。当一个时钟周期出现的基准利率任务被调用。时钟滴答给出了一个clockSemtBaseRate。第一件事tBaseRate所做的是具有在当前时间点一击子任务给信号灯。由于基准利率任务具有更高的优先级,它会继续执行。接下来,它执行任务的最快(TID = 0),包括在你的模型中拥有最快的采样时间块。这个执行后,将继续等待时钟信号。时钟滴答被配置在基本步长为模型发生。

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

快速原型制作程序框架提供了一个公共应用程序编程接口(API),其不模型定义之间变化。

嵌入式编码器®产品提供了被称为嵌入式程序框架不同的框架。嵌入式程序框架提供了为您量身打造的模型优化的API。当您使用生成的代码嵌入的风格,你模拟你会怎么喜欢你的代码在嵌入式系统中执行。因此,在模型中定义的定义应具体到你的嵌入式目标。项目,例如型号名称,参数,和信号存储类被包括作为一个代码的嵌入风格API的一部分。

快速原型设计和生成的代码嵌入样式之间的一个主要区别是,后者包含较少的入口点函数。代码嵌入的风格,可以被配置为只有一个功能,模型_步

因此,模型执行代码消除环... ENDLOOP报表和组ModelOutputsLogTXYModelUpdate到一个单一的声明,模型_步

有关如何生成的嵌入代码执行的更多信息,请参阅配置代码生成模式的入口点函数

相关话题