任务执行

此示例显示如何模拟任务执行以及如何在SoC硬件板上生成代码并运行它。

应用程序开发通常包括模拟算法以确保正确的行为。此类仿真通常忽略嵌入式系统环境的实时性。这可能会导致某些计时问题在应用程序在硬件上运行之前一直未被发现。

时间问题通常会导致不正确的应用程序行为。SoC Blockset帮助您在模拟中而不是在硬件上检测这些问题。这可以帮助您避免在硬件上进行昂贵的调试。

随着应用程序变得越来越复杂,时间问题更有可能发生。例如,由于资源约束和任务依赖关系,在具有多个任务的应用程序中,速率溢出和不希望的速率抢占更为频繁。使用SoC Blockset模拟多任务应用程序将帮助您及早发现这些问题。

在本例中,使用SoC Blockset模拟任务执行。您将了解模拟任务持续时间的不同技术,以及何时使用它们。您还将了解如何在硬件上验证时间规范。

金宝app支持硬件平台:

  • Xilinx®Zynq®ZC706评估套件

  • Xilinx Zynq UltraScale™+ MPSOC ZCU102评估套件

  • 刨花板™ Zynq-7000开发板

  • Altera®Cyclone®V SoC开发套件

  • Altera Arria®10 SoC开发套件

本示例中使用的模型设置为Xilinx Zynq ZC706评估试剂盒板.如果要使用不同的硬件板,请选择列表中列出的硬件板之一硬件板芯片系统标签。对顶部模型和参照模型执行相同的操作。

介绍

SoC Blockset模拟软件任务的执行,就像它们在SoC处理器上执行一样。仿真过程中考虑了任务周期、优先级和处理器核心等参数。SoC Blockset模拟任务抢占、任务溢出和并发任务执行。

下图说明了上面提到的任务执行模拟方面。在前两个子图中,您可以观察到Task1每0.1 s执行一次,并且由于它们都共享Core 0, Task1抢占了每0.2 s执行一次的Task2。在第三个子图中,您可以观察到Core 0仍然有一些空闲时间。最后两个子图显示了Task3在Core 1上每0.3秒运行一次。

要了解有关模拟任务执行的更多信息,请参阅什么是任务执行?

任务管理器块允许您配置模型中任务的执行。在块对话框中,您定义了在您的系统中需要使用多少任务添加删除按钮。在主要的对话框的选项卡,您设置了主要任务属性,而在上模拟选项卡您设置了模拟任务属性。

下图说明了主要的页签任务管理器块。

任务有一个名称,以便可以在模型和各种关联图中识别它。上的端口标签任务管理器块使用任务名称以便于识别。

任务可以是两种类型。事件驱动的任务在由事件触发时执行。从连接到的IO数据源块的事件行任务管理器阻止触发任务。定时器驱动的任务以定义的定义句点执行主要的页签任务管理器

在中定义事件驱动任务的优先级主要的页签任务管理器. 计时器驱动的任务优先级自动分配。

在里面任务管理器你也可以设置处理器核心上执行一个任务,这样,如果你的硬件板有多个核心,你可以设置任务并发执行。

任务管理器块还允许您配置如何处理任务溢出。例如,如果前一个任务实例尚未启动或完成,您可能会决定删除该任务的实例。或者,您可能会决定在超支的情况下设法赶上任务进度。

为了模拟实时任务效果,例如抢占和过载,SoC Blockset要求您提供每个任务的持续时间。持续时间定义为从任务开始到任务结束所经过的时间。理想情况下,您将在硬件板上度量任务持续时间。如果不可能,请在任务算法开发人员提供的数据表中查找任务持续时间。作为最后一种方法,您应该设置相对于任务周期或非周期性任务的最短重现间隔的持续时间。

SoC Blockset有几个设置任务持续时间的选项。由于任务持续时间只应用于模拟,这些选择在模拟页签任务管理器对话框。

下图说明了模拟页签任务管理器对话框。

最常用的选项有:

  • 对话框—允许您通过一个正态分布或多个正态分布的组合,使用平均值和标准偏差参数指定任务持续时间。

  • 输入端口—通过实例指定任务持续时间。例如,您可以创建一个计算任务持续时间的模型,并将其连接到任务管理器输入端口。

以下FlowChart将指导您选择最合适的选项。

如果您的任务的持续时间有不同的分布和原因,请使用流程图作为一般指导选择最合适的选项。

您可以在“模型配置”对话框中为SoC块集配置其他模拟和执行参数。任务评测,在模拟和处理器上,允许您评测任务执行,将结果流式传输到Data Inspector并将其保存到文件中。

您还可以设置内核延迟值以影响模拟中的任务执行。该值变化很大,但通常比任务持续时间小得多。因此,我们建议您将值留下设置为0 s,除非您可以确定地找到硬件板的适当值。

下图是模型配置参数对话框中与任务执行相关的SoC参数。请注意,处理器上的任务分析面板显示只有当您安装所有所需的产品和硬件支持包。下载188bet金宝搏金宝app

此示例的其余步骤将说明上述流程图中显示的一些选项。

用单个代码路径模拟算法

这种情况要求您模拟处理数据帧的DSP算法。以下产品需要以下产品:

  • DSP系统工具箱

如果您没有这个产品,在查看这个案例的描述后,继续进行下一个案例。

在本例中,您将了解当任务算法只有一个代码路径时,如何对任务持续时间建模。

假设您任务是开发在SOC板上处理RF(射频)数据的应用程序。在预处理FPGA核心之后,使用AXI4协议将数据流式传输到处理器核心。在处理器核上运行的算法应确定数据是否包含高频或低频信号。为此,将低通和高通滤波器应用于数据。然后将产生的信号与所选阈值进行比较。基于此描述,此任务具有单个代码路径,没有主要代码分支。任务函数的源代码可能具有以下形式。

double dataReadTask(double in[]){/*帧大小总是1000 */ int signalType;/* 0 - LP, 1 - HP */ double out1[1000], out2[1000];着干活,filterLP (1000);out2, filterHP (1000);信号类型=阈值(out1, out2, 1000);}

1.打开模型. 注意测试数据子系统。的射频数据源块表示外部存储器和FPGA核心。的射频数据源块有两个输出端口,流数据事件.它们分别输出射频数据和新数据帧可用时的通知。

2.请注意,射频数据源块每0.01秒生成1000个样本的帧。帧是1 kHz正弦波形的样本。

3.单击任务管理器块。注意,它设置了一个事件驱动的任务dataReadTask.任务是由新数据帧的到达触发的。

4.单击模拟选项卡中任务管理器对话框来定义模拟的任务持续时间。

由于算法由两个无条件执行的过滤器组成,应用程序只有一个代码路径。因此,您可以按照介绍中所示流程图中的第一个左分支进行操作,并期望算法执行时间具有正态分布。

根据算法开发人员给出的信息,可以确定平均执行时间为0.0095 s,标准偏差为0.0001 s。为了表示实时限制,还决定将最小执行时间和最大执行时间分别设置为0.00925 s和0.00975 s。

单击,设置持续时间参数任务管理器对话框中的模拟如上所述的标签。

5.在模型中,单击运行开始模拟。等到模拟完成。

6.从“模型”工具栏中,打开数据检查、检查dataReadTask.放大以更密切地检查任务执行时间。

7.执行以下命令,统计任务执行次数。观察数据检查运行数字。如果运行数字不同,请修改命令。

socTaskTimes('soc_task_execution', '运行1:soc_task_execution_simprofile')

观察任务持续时间的变化。正如预期的那样,任务持续时间的直方图表明算法有一个代码路径。持续时间的值聚集在0.0095 s的平均值附近。

8.关闭模型而不进行任何更改。

使用两个代码路径模拟算法

在本例中,您将学习如何在任务算法有两条代码路径时建模任务持续时间,并且可以预测将采用哪条路径。

假设您正在开发视频监控应用程序。任务是不断处理视频数据以确定系统中是否存在入侵。该算法计算连续视频数据帧之间的场景变化量。如果场景变化超过所选阈值,则记录这样的帧,因为它们可以用作潜在入侵的证据。因此,该算法有两个代码路径。该算法的源代码可以以下列形式表示。

void videotask(单个[],长度,双阈值){双能量;Energy = CalcSceneChange(in,长度);if(Energy>阈值)RecordFrame(In,Length);} }

1.打开模型. 注意数据源输出视频数据帧的块。

2.单击模型块,观察算法计算连续数据帧之间的运动能量。如果计算的运动能量超过阈值,则主要算法执行。

3.单击任务管理器块。注意,它设置了一个计时器驱动的任务VideoTask. 此任务每0.33333秒运行一次,即视频帧速率。

4.单击模拟插页任务管理器对话框来定义模拟的任务持续时间。

由于该算法有两个代码路径,它可以预测将采取的代码路径,遵循流程图中的第二个左分支。

模型任务持续时间依赖于运动能量。根据是否超过了运动能量阈值,您将分配任务持续时间的平均值分别为帧率的75%或50%。

单击任务持续时间估算子系统,以了解如何建模任务持续时间。

5.在模型中,单击运行开始模拟。等到模拟完成。

6.从“模型”工具栏中,打开数据检查检查VideoTask.放大以更密切地检查任务执行时间。

7.执行以下命令,统计任务执行次数。观察数据检查运行数字。如果运行数字不同,请修改命令。

socTaskTimes('soc_task_execution_step2', '运行3:soc_task_execution_step2_simprofile')

观察任务持续时间的变化。正如预期的那样,任务持续时间的直方图表明该算法有两条代码路径。

8.关闭模型而不进行任何更改。

代码路径数目不定的算法模拟

在本例中,您将了解当任务算法具有不确定数量的代码路径,但代码路径对于给定的数据集是可重复的时,如何对任务持续时间建模。

在这种情况下,假设您正在开发一个在SoC板上处理数据的复杂应用程序。由于处理的复杂性,该算法的代码路径数量不确定。因此,无法预测将采用哪种代码路径。然而,众所周知,任务持续时间的分布在多个实验中是可重复的。这种算法的源代码可能具有以下形式。

int myTask(int arr[], int length) {int i = 0;Int sum = 0;While (i < length) {if (arr[i] > 0) sum = sum + arr[i] i++;} }

1.打开模型

2.单击任务管理器块并选择任务myTask. 点击模拟标签。注意,我们将概率分布定义为两个正态分布的组合。

3.点击运行开始模拟。任务执行数据将以流方式传输到数据检查

4.运行以下命令对模拟中获得的任务执行时间执行统计分析。遵守数据检查跑步号码。如果您的运行编号不同,请修改该命令。

socTaskTimes('soc_task_execution_step3', '运行4:soc_task_execution_step3_simprofile')

请注意,在模拟中获得的任务持续时间分布与预期结果相匹配。

5.关闭此模型而不进行任何更改。

使用代理任务模拟应用程序

假设您正在开发一个复杂的应用程序,该应用程序向上一个案例中开发的模型添加了一个任务。此任务的实现目前不可用,但已知此任务的计时规范。任务每隔0.02秒执行一次,持续时间由正态分布描述。该分布的平均值为0.008s,标准偏差为0.0009 s。

1.打开模型

2.单击任务管理器块并选择任务代理任务. 点击模拟选项卡。注意,我们用本任务介绍中提到的参数将概率分布定义为正态分布。

3.在模型块中打开代理任务块并检查样本时间值。样本时间值必须与在任务管理器块中输入的周期值匹配。单击取消。

4.点击运行开始模拟。任务执行数据将以流方式传输到数据检查

5.运行以下命令对模拟中获得的任务执行时间执行统计分析。遵守数据检查跑步号码。如果您的运行编号不同,请修改该命令。

socTaskTimes('soc_task_execution_step4', '运行5:soc_task_execution_step4_simprofile')

请注意,在模拟中为应用程序和代理任务获得的任务持续时间。

6.关闭此模型而不进行任何更改。

仿真结果与硬件结果进行了比较

在本节中,您将比较在前面的模拟中获得的时序结果与在您的硬件板上获得的时序结果。

所需产品:下载188bet金宝搏

  • 嵌入式编码器

  • 针对Xilinx设备的So金宝appC区块集支持包,或

  • 英特尔设备的SoC Slo金宝appckset支持包

1.芯片系统选项卡上,单击配置,构建和部署

2.遵循SoC Builder工作流,直到您到达选择构建操作屏幕上。

3.选择外部模式的构建和加载然后继续,直到完成工作流。

4.点击监视和优化将模型部署到硬件。该模型已经设置为配置文件执行,因为它运行在硬件上并将分析数据流流数据检查实时的。

5.执行以下命令,统计分析硬件上获取的任务执行次数。观察数据检查跑步号码。如果您的运行编号不同,请修改该命令。

socTaskTimes('soc_task_execution_step4', '运行6:soc_task_execution_step4_procprofile')

注意,在硬件上获得的任务持续时间与在仿真中获得的结果相匹配。

6.关闭此模型而不进行任何更改。

概括

这个示例向您展示了如何在多任务操作系统中模拟任务执行,如何生成代码并在硬件板上运行,以及如何收集实时任务执行数据。

在此示例中,我们使用了一个任务的简单应用程序。但是,在典型的应用中,必须执行多个任务。嵌入式应用程序必须运行每个定义的计划的每个任务。为了允许最有效地使用处理器并快速地对外事件进行反应,使用优先级的抢占调度算法。

使用基于优先级的抢占式调度,当任务被抢占时,会发生任务切换。保存任务(任务上下文)使用的数据,以便在任务恢复执行时恢复。在本例中,任务切换时间与任务持续时间相比相形见绌,因此不进行模拟。在任务持续时间较短的应用程序中,您可能需要考虑它们。

如果一个硬件板有多个处理器核,嵌入式应用程序通常会尝试使用所有核以获得最有效的实现。SoC Blockset使用基于优先级的抢占式调度算法,即使是在多核处理器上。SoC Blockset在仿真和生成的代码中都实现了每个核心的任务分配。

接下来,我们建议您完成流数据从硬件到软件示例,说明了使用SoC Blockset设计复杂SoC应用程序的系统方法。