Main Content

基于时间的调度和代码生成

采样时间注意事项

Simulink® 模型按一种或多种采样时间运行。Simulink 产品在构建多速率系统(即具有多种采样时间的系统)方面提供了很高的灵活性。但是,这种灵活性也会使您构造的模型存在以下限制:代码生成器无法为其生成可在多任务环境中执行的实时代码。要使多速率模型按照预期(即给出正确答案)实时运行,有时您必须修改模型或指示 Simulink 引擎修改模型。通常,这些修改需要将 Rate Transition 模块放在具有不相等采样时间的模块之间。下列各节讨论在多任务环境中使用多速率模型必须解决的问题。有关采样时间(包括速率转换)的全面讨论,请参阅 什么是采样时间?子系统中的采样时间系统和子系统中的采样时间解决速率转移问题 及相关主题。

任务模式

定步长模型有两种执行模式:单任务和多任务。这些模式仅适用于定步长求解器。要选择执行模式,请选中模型配置参数将每个离散速率视为单独任务。选中此参数时,将对多速率模型应用多任务执行模式。清除此参数时,将应用单任务执行模式。

注意

使用多任务的多速率模型不能引用使用单任务的多速率模型。

实时系统中的模型执行可以在实时操作系统的帮助下完成,也可以在裸机目标硬件上完成(其中,模型在中断服务例程 (ISR) 上下文中运行)。

系统(如 The Open Group UNIX® 或 Microsoft® Windows® 系统)是多任务型系统并不意味着您的程序可以实时执行。这是因为程序可能不会在需要时抢占其他进程。

在给定时间只能存在一个进程的操作系统(如 PC-DOS)中,中断服务例程 (ISR) 必须执行以下步骤:保存处理器上下文、执行模型代码、收集数据以及还原处理器上下文。

其他操作系统(如符合 POSIX 的操作系统)可提供自动上下文切换和任务调度。这可以简化 ISR 执行的操作。在本例中,ISR 只需启用通常被阻止的模型执行任务即可。下图说明了这种差异。

Comparison of program execution using an interrupt service routine (bare metal with no operating system) and program execution using a real-time operating system primitive

模型执行和速率转换

要生成按预期实时执行的代码,您(或 Simulink 引擎)可能需要识别和处理模型中的采样率转换。在多任务模式下,如果模型包含无效的速率转换,则 Simulink 引擎默认会在仿真期间标记错误。您可以使用模型配置参数多任务数据传输来更改此行为。在单任务模式下,参数单任务数据传输可用于相同目的。

为避免增加速率转换错误,请在任务之间插入 Rate Transition 模块。您可以通过插入隐藏的 Rate Transition 模块来让 Simulink 引擎自动处理速率转换。有关此选项的说明,请参阅自动速率转换

为理解这些问题,首先要考虑 Simulink 仿真与实时程序的差异。

Simulink 模型仿真期间执行

在 Simulink 引擎对模型进行仿真之前,它会根据各模块的拓扑依存关系对模块进行排序。这包括将虚拟子系统扩展到它们所包含的各个模块中,以及将整个模型扁平化为单个列表。完成此步骤后,每个模块将按顺序执行。

此过程的关键是模块的排序。其输出直接取决于其输入的模块(即具有直接馈通的模块)只有在为其提供输入的驱动模块执行后才会执行。

有些模块基于在前一时间步中获取的值或从指定为模块参数的初始条件中获取的值设置其输出。此类模块的输出由内存中存储的值确定,该值可独立于其输入而更新。在仿真期间,计算是在前进到与时间对应的变量之前执行的。这会导致计算在瞬间发生(即没有计算延迟)。

模型实时执行

实时程序与 Simulink 仿真的不同之处在于实时程序必须以实时方式同步执行模型代码。每次计算都会导致一定的计算延迟。这意味着采样间隔不能缩短或延长(因为它们可能在 Simulink 仿真中),从而导致执行效率降低。

以下面的计时图为例。

Timing diagram that shows processing inefficiency in a sample interval

您会发现采样间隔 t1 中的处理效率低下。您不能压缩该间隔来提高执行速度,因为根据定义,采样时间是以实时方式计时的。

您可以使用多任务模式来规避这种潜在的低效率。多任务模式为任务指定不同的优先级,以分别执行具有不同采样率的模型代码部分。

有关多任务模式工作原理的说明,请参阅Multitasking and Pseudomultitasking Modes。继续往下阅读之前,请务必理解该节内容。

单任务与多任务操作

单任务程序需要较长的采样间隔,因为每个时钟周期内都必须执行所有计算。这可能导致可用 CPU 时间的使用率低下,如上图所示。

如果模型较大且在每个速率下执行多个模块,则多任务模式可以提高程序的效率。

但是,如果您的模型主要采用某一种速率,只有少数模块以较慢的速率执行,则多任务实际上可能会降低性能。在这样的模型中,任务切换所产生的开销可能大于执行较慢模块所需的时间。在这种情况下,以用得最多的速率执行所有模块更为高效。

如果您的模型可从多任务执行中受益,则您可能需要通过添加 Rate Transition 模块来修改模型(或者指示 Simulink 引擎修改模型),以生成预期的结果。

有关这两种执行模式和示例的详细信息,请参阅Modeling for Single-Tasking ExecutionModeling for Multitasking Execution

相关主题