4

我使用 RTOS 为 Arm7 编写了 c 代码。有多个任务的优先级设置为同一级别。所以任务在循环基础上执行。

有一个例外,即一个任务(默认)设置为低于 rtos 中的另一个任务的优先级。因此,如果没有任务正在运行,则会运行默认或较低优先级的任务。

现在我想计算该默认任务运行的确切总时间(持续时间)。

任何人都可以给出一些想法......以及如何在代码中做......

问候丹妮

4

3 回答 3

5

查看默认任务或空闲任务何时运行的一种非常简单的方法是让该任务切换未使用(但可访问)的 GPIO 引脚或 LED 指示灯(如果您的硬件有这样的东西)。然后,如果您将示波器连接到 I/O 线,您可以通过示波器上看到的振荡周期的持续时间来查看处理器在空闲任务中停留的时间。只要其他任务正在运行,该行将保持稳定状态。

如果您可以访问操作系统代码,另一种方法是在选择默认任务时使该行变高,而对于任何其他任务,该行变低。

于 2010-06-03T14:44:40.163 回答
3

如果您向我们提供有关您的平台(CPU、RTOS)的更多信息,将会很有帮助,但总体思路是这样的:

大多数 RTOS 都有某种类型的“任务切换”标注或挂钩。大多数嵌入式平台都有易于访问的定时器外设(硬件定时器)。

所以:每次切换到和退出低优先级任务时,拍摄计时器快照并计算时间间隔。

各种注意事项都适用,例如考虑计时器翻转(如果您的计时器周期非常短,则包括多次翻转)、低功耗/睡眠模式(如果您使用它们)、在 ISR 中花费的时间等......

于 2010-06-03T13:55:14.700 回答
1

我同意丹的回答 - 这里有一些补充/增强:

(1)基于窗口的计算。因为默认可能没有周期性,所以您需要根据在某个窗口(例如 1000 毫秒)上花费在该任务中的百分比来计算它的运行时间。您将需要定义一个用于累积计时器点击的静态变量。一旦您的窗口过期(即:1000 毫秒已经过去),您可以计算默认花费的时间与 1000 毫秒相比,这将是默认花费的百分比。当我阅读您的描述时,似乎默认状态基本上是一个空闲状态 - 这意味着这个百分比大致是您可用的微利用率。

(2)每小时翻车一次。. 如果您可以使用 32 位计数器并捕获 usec 时间戳,则可以使其在任何翻转发生前超过 1 小时。如果您将其用于家庭项目,您可以选择忽略翻转。它将导致单个扭曲的 1000 毫秒窗口,仅此而已。另一方面,如果您要监控最大利用率并因此设置故障或诊断......那么您需要考虑它。

(3) ISR 偏差。确定您是否需要以不同的方式处理在 ISR 中花费的时间与在其他任务中花费的时间取决于您的 RTOS 如何处理上下文切换。正如 Dan 提到的,大多数 RTOS 都有某种回调或钩子,当任务切换发生时会触发。一些 RTOS 有一个单独的钩子,专门用于 ISR。我不完全确定这样做的动机是什么,除了一个一般理论,即用户不太可能关心在(希望是)简短的 ISR 上花费的时间,而不是用户任务本身。无论如何,请检查您的 RTOS 如何处理此切换并从那里开始。

如果您没有正确处理此问题,则在 ISR 中花费的时间将归因于 ISR 触发时正在运行的任何任务。如果您碰巧处于默认状态,那么您的默认任务就是“吸收”ISR 时间。如果您没有运行很多 ISR,那么我会完全忽略这一点。

祝你好运!我用 PowerPC 551X 系列完成了这项工作,它是用于生产汽车软件的,所以它必须是完美的!你应该更容易:)

于 2010-08-29T12:23:29.980 回答