在程序 运行 时监控 VxWorks 中任务 CPU 的利用率

Monitor task CPU utilization in VxWorks while program is running

我正在 运行安装一个 VxWorks 6.9 OS 嵌入式系统,我需要查看我何时需要低优先级任务。理想情况下,我希望每个任务都有 CPU 利用率,这样我就知道是什么占用了我所有 CPU 的时间。

我知道这是许多操作系统的内置功能,但到目前为止还没有找到适用于 VxWorks 6.9 的功能。

如果我不能按任务衡量,我想至少看看 CPU 空闲的时间百分比。 为此,我一直在尝试做一个最低优先级的任务,该任务将 运行 下面的函数将尝试间接测量它。

float Foo::IdleTime(Foo* f)
{

    bool inIdleTask;
    float timeIdle;
    float totalTime;
    float percentIdle;

    while(true)
    {
        startTime = _time(); //get time before before measurement starts

        inIdleTask = true;
        timeIdle = 0;

        while(inIdleTask) // I have no clue how to detect when the task left and set this to false
        {
            timeIdle += (amount_of_time_for_inner_loop); //measure idle time

        }

        returnTime = _time(); //get time after you return to IdleTime task

        totalTime = ( returnTime - startTime );

        percentIdle = ( timeIdle / totalTime ) * 100; //calculate percentage of idle time

        //logic to report percentIdle


    }

这个概念的最大问题是我不知道如何检测何时将此任务留给更高优先级的任务。

如果您正在寻找在开发过程中完成的一次性测量,那么 spyLib 就是您要寻找的。只需从命令行调用 spy 即可以 10 秒为间隔获取每个任务 CPU 使用情况报告。致电 spyHelp 了解如何配置间谍。 (如果尚未包含,可能需要将 spyLib 包含到内核中。)

如果您想更进一步,taskHookLib 就是您所需要的。简而言之,您挂钩一个函数以在每个任务切换中调用。 Call 为您提供 TASK_ID 进出 CPU 的任务。您可以简单地监视低优先级任务的饥饿情况,也可以采取措施临时提高它们的优先级。

根据经验,spy 会增加一点性能开销,尤其是当 stdout 面对较慢的 I/O(例如 9600 波特串行)时,但相当容易使用。如果您不立即在终端上打印结果,taskHook'ing 几乎不会增加 none 开销,但需要一些编程才能得到它 运行.

另一件可能感兴趣的事情是 WindRiver 的远程调试器。还没有亲自使用过那个,想象一下它需要正确设置 workbench 和目标。