主要内容

任务执行

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

应用程序开发通常包括模拟算法以确保正确的行为。这样的模拟通常忽略嵌入式系统环境的实时方面。这可能会导致某些时间问题直到应用程序在硬件上运行时才被发现。

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

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

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

万博1manbetx支持硬件平台:

  • Xilinx®Zynq®ZC706评估试剂盒

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

  • ZedBoard™Zynq-7000开发板

  • Altera®Cyclone®V SoC开发套件

  • Altera Arria®10 SoC开发工具包

本例中使用的模型设置为Xilinx Zynq ZC706评估试剂盒板.若要使用其他硬件板,请选择列表中列出的硬件板之一硬件板片上系统选项卡。对顶部模型和引用模型执行同样的操作。

简介

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

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

有关模拟任务执行的详细信息,请参见什么是任务执行?

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

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

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

任务可以有两种类型。事件驱动任务在由事件触发时执行。IO数据源块中的事件行,该事件行连接到任务管理器Block触发任务。类中定义的指定周期执行计时器驱动的任务主要的标签。任务管理器

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

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

任务管理器Block还允许您配置如何处理任务超时。例如,如果前一个任务实例尚未启动或完成,则可以决定删除任务的实例。或者,你可能决定尝试赶上任务计划,尽管超出了时间。

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

SoC Blockset有几个设置任务持续时间的选项。由于任务持续时间仅应用于模拟,因此可以在模拟的标签。任务管理器对话框。

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

最常用的选项是:

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

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

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

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

您可以在模型配置对话框中为SoC Blockset配置额外的仿真和执行参数。任务分析,在模拟和处理器上,允许您配置任务执行,流结果到数据检查器,并将它们保存到一个文件。

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

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

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

单码路径算法仿真

本例需要模拟处理一帧数据的DSP算法。为此需要以下产品:

  • DSP系统工具箱

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

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

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

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

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

2.注意射频数据源Block每0.01 s生成1000个样本帧。这些帧是1khz正弦波形的样本。

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')

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

8.关闭模型,不做任何更改。

用两条编码路径模拟算法

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

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

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

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

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

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

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

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

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

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

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

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

7.功能:对任务执行次数进行统计分析。观察数据检查运行数据。如果运行号不同,请修改该命令。

socTaskTimes('soc_task_execution_step2', '运行2:soc_task_execution_step2')

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

8.关闭模型,不做任何更改。

具有不确定编码路径数的算法仿真

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

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

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

1.打开模型

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

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

4.执行如下命令,对仿真得到的任务执行次数进行统计分析。观察数据检查运行数。如果运行号不同,请修改该命令。

socTaskTimes('soc_task_execution_step3', '运行3:soc_task_execution_step3')

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

5.关闭这个模型,不做任何更改。

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

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

1.打开模型

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

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

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

5.执行如下命令,对仿真得到的任务执行次数进行统计分析。观察数据检查运行数。如果运行号不同,请修改该命令。

socTaskTimes('soc_task_execution_step4', '运行4:soc_task_execution_step4')

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

6.关闭这个模型,不做任何更改。

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

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

所需产品:s manbetx 845

  • 嵌入式编码器

  • SoC Blockset支万博1manbetx持包的Xilinx设备,或

  • 为英特尔设备的SoC块集支万博1manbetx持包

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

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

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

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

5.执行如下命令,对硬件上任务执行次数进行统计分析。观察数据检查运行数。如果运行号不同,请修改该命令。

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

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

6.关闭这个模型,不做任何更改。

总结

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

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

使用基于优先级的抢占式调度,当一个任务被抢占时,就会发生任务切换。任务使用的数据(任务上下文)被保存,以便在任务恢复执行时可以恢复这些数据。在本例中,任务切换时间与任务持续时间相比较小,并且没有模拟。在任务持续时间短得多的应用程序中,您可能需要考虑它们。

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

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