主要内容

任务执行

这个示例演示了如何模拟任务执行,以及如何生成代码并在SoC硬件板上运行。

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

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

随着应用程序变得越来越复杂,更可能出现计时问题。例如,由于资源限制和任务依赖性,在具有多个任务的应用程序中,速率超限和不期望的速率抢占更为频繁。使用SoC块集模拟多任务应用程序将有助于您及早发现这些问题。

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

万博1manbetx支持硬件平台:

  • Xilinx®Zynq®ZC706评估套件

  • Xilinx Zynq UltraScale™+ MPSoC ZCU102评估试剂盒

  • 刨花板™ Zynq-7000开发板

  • Altera®Cyclone®V SoC开发工具包

  • Altera Arria®10 SoC开发工具包

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

介绍

SoC块集模拟软件任务的执行,就像它们在SoC处理器上执行一样。模拟将尊重任务的参数,例如周期、优先级和处理器核心。SoC块集模拟任务抢占、任务溢出和并发任务执行。

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

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

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

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

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

任务可以有两种类型。事件驱动的任务在被事件触发时执行。连接到的IO数据源块的事件行任务管理器Block触发任务。定时器驱动的任务按照定义的周期执行主要页签任务管理器

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

任务管理器对话框您还可以设置要在其上执行任务的处理器内核,这样,如果您的硬件板有多个内核,您可以将任务设置为并发执行。

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

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

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

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

最常用的选项有:

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

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

下面的流程图将指导您选择最合适的选项。

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

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

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

下图显示了“模型配置参数”对话框中与任务执行相关的SoC参数。请注意处理器上的任务分析面板仅在安装所有必需的产品和硬件支持包时显示。s manbetx 845万博1manbetx

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

单码路径算法的仿真

这种情况需要你模拟一个DSP算法来处理一帧数据。需要以下产品:

  • DSP系统工具箱

如果您没有此产品,请在查看此案例的说明后继续下一个案例。

在本例中,您将学习如何在任务算法具有单个代码路径时建模任务持续时间。

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

double-dataReadTask(double-in[]){/*帧大小始终为1000*/int信号类型;/*0-LP,1-HP*/double-out1[1000],out2[1000];filterLP(in,out1,1000);filterHP(in,out2,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\u任务执行','Run 1:soc\u任务执行\u simprofile')

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

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

双码路径算法的仿真

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

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

void VideoTask(single in[], in length, double threshold){双能量;energy = calcSceneChange(in, length);if (energy > threshold) recordFrame(in, length);} }

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

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

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

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

由于该算法有两条代码路径,并且可以预测将采用哪条代码路径,请遵循流程图中的第二条左分支。

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

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

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

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

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

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

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

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

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

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

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

intmytask(intarr[],intlength){inti=0;intsum=0;而(i0)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.关闭此模型而不做任何更改。

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

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

所需产品:s manbetx 845

  • 嵌入式编码器

  • 针对Xilinx设备的So万博1manbetxC区块集支持包,或

  • 用于英特尔设备的SoC B万博1manbetxlockset支持包

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

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

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

4.点击监视和调谐将模型部署到硬件。模型已经被设置为在硬件上运行并流分析数据时分析任务的执行数据检查实时的。

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

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

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

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

总结

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

在本例中,我们使用了简单的应用程序,每个应用程序都有一个任务。然而,在典型的应用程序中,必须执行多个任务。嵌入式应用程序必须按照定义的计划运行每个任务。为了最有效地使用处理器并快速地对外部事件作出反应,使用了基于优先级的抢占式调度算法。

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

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

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