SoC应用设计中的任务调度
此示例演示如何在SoC Blockset模型中跨多个核调度应用程序任务时间表编辑器工具。考虑一个有两个周期任务的应用程序:
第一个周期性任务,
periodicTask1
,每秒钟运行一次。*第二个周期任务,
periodicTask2
每两秒运行一次。
该应用程序还有两个非周期任务,aperiodicTask1
而且aperiodicTask2
,偶尔跑步。该模型在具有双核处理器的硬件板上实现应用程序。
不使用进度编辑器的任务管理
检查模型及其任务。
open_system (“soc_schedule_editor_initial”)
假设在硬件板上完成任务执行的初始实现和分析之后,您将获得这些任务持续时间。有关任务分析的更多信息,请参见处理器上的任务分析.
期间(s)持续时间(s)
周期1 0.45
periodicTask2 2 2.05
aperiodicTask1 - 0.35
aperiodicTask2 - 0.15
第二个周期任务执行时间过长,耗尽了处理器上的计算资源,这就需要另一种实现。
第二个周期任务包含两个独立的数据路径。因此,这个任务可以分成两个周期任务,每个任务每两秒运行一次:periodicTask2a
而且periodicTask2b
.再次分析任务将生成更新的任务持续时间。
期间(s)持续时间(s)
周期1 0.45
periodicTask2a 2 0.50
periodicTask2b 2 1.55
aperiodicTask1 - 0.35
aperiodicTask2 - 0.15
分配periodicTask2a
而且
periodicTask2b
到两个不同的核心产生一个可调度的实现。默认情况下,您不能为Simulink®模型中的每个离散速率创建多个任务。创建periodicTask2a
而且periodicTask2b
在Simulink中,使用Schedule Editor工具。
使用进度编辑器进行任务管理
的时间表编辑器创建任务分区,可以是周期性的或非周期性的。不同于缺省的Simulink速率分组,多个任务分区可以共享相同的速率。现在可以创建第二个任务的两个子任务,并将它们设置为在不同的核心上运行。
创建计划编辑器任务分区
将所有速率转换为任务分区。要创建一个分区,创建一个Simulink原子子系统,并给它一个分区名称。对于周期任务,需要创建周期分区并设置周期。类似地,对于非周期任务,创建一个非周期分区。该模型有两个周期为2的周期分区和两个非周期分区。
open_system (“soc_schedule_editor”)
打开Schedule Editor并查看分区的默认执行顺序。
连接任务分区到任务管理器块
将包含算法模型的Model块连接到新的顶层模型中的Task Manager块。Model块上的速率端口表示参考模型中的分区,必须连接到Task Manager块。每个分区必须与相应的任务相匹配。
单击任务管理器块。通过检查,配置任务管理器块以使用Schedule Editor中的执行顺序使用日程编辑器.任务管理器块指定任务核心关联性。配置periodicTask2a
而且periodicTask2b
在不同的内核上运行,异步任务在相同的内核上运行periodicTask3
通过设置核心
财产。
周期(s)持续时间(s)核心
periodicTask1 1 0.45 0
periodicTask2a 2 0.50 0
periodicTask2b 2 1.55 1
aperiodicTask1 - 0.20 1
aperiodicTask2 N/A 0.05 1
对模型进行仿真,并对任务分析结果进行分析模拟数据检查器.第二个周期任务的两个子任务每两秒并行运行一次,没有任务超时。
控制非周期任务的优先级
在任务分析结果中,aperiodicTask1
首先运行aperiodicTask2
第二次运行。
Event Source2块触发aperiodicTask2
,在5.7秒时创建一个触发器,这是由timeseries对象设置的ts2
.自aperiodicTask1
具有更高的优先级,模型不会抢占此任务。
通过在Schedule Editor中更改分区的执行顺序,可以更改非周期分区的优先级。在参考模型中打开Schedule Editor并拖动aperiodicTask2
以上aperiodicTask1
.
再次运行模拟。在这种情况下,aperiodicTask2
挑出毛病aperiodicTask1
一旦触发aperiodicTask2
发生。