Embedded 如何计算RTOS任务';是时候了

Embedded 如何计算RTOS任务';是时候了,embedded,task,rtos,Embedded,Task,Rtos,我用c语言编写了一个使用RTOS的Arm7代码。有多个任务的优先级设置为同一级别。因此,任务在循环基础上执行 在rtos中,一个任务(默认)的优先级低于另一个任务,这是一个例外。因此,如果没有任务正在运行,则会运行默认任务或低优先级任务 现在我想计算默认任务运行的确切总时间(持续时间) 谁能告诉我该怎么做。。。。以及如何在代码中执行 问候 Dani如果您能向我们提供更多关于您的平台(CPU、RTO)的信息,那将非常有帮助,但总体思路是: 大多数RTOS都有某种类型的“任务切换”调用或挂钩。大多数

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

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

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

谁能告诉我该怎么做。。。。以及如何在代码中执行

问候
Dani

如果您能向我们提供更多关于您的平台(CPU、RTO)的信息,那将非常有帮助,但总体思路是:

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

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


各种各样的警告都适用,例如考虑计时器翻转(如果您的计时器周期很短,则包括多个翻转)、低功耗/睡眠模式(如果您使用它们)、在ISR中花费的时间等等。

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


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

我同意Dan的回答-以下是一些补充/增强:

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

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

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

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

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