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

C++ 在程序运行时监控VxWorks中的任务CPU利用率,c++,performance,monitoring,vxworks,C++,Performance,Monitoring,Vxworks,我正在运行一个VxWorks 6.9操作系统嵌入式系统,我需要知道什么时候我缺少低优先级的任务。理想情况下,我希望按任务分配CPU利用率,这样我就知道是什么消耗了我所有的CPU时间 我知道这是许多操作系统中的内置功能,但到目前为止,VxWorks 6.9无法找到它 如果我不能通过任务来衡量,我想至少看看CPU空闲时间的百分比。 为此,我一直在尝试创建一个优先级最低的任务,该任务将运行下面的函数,并尝试间接测量它 float Foo::IdleTime(Foo* f) { bool in

我正在运行一个VxWorks 6.9操作系统嵌入式系统,我需要知道什么时候我缺少低优先级的任务。理想情况下,我希望按任务分配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,则可能需要包含到内核的spyLib。)

如果你想多走一步,你需要的就是
taskHookLib
。简单地说,在每个任务切换中都要调用一个函数。Call为您提供进出CPU的任务的
TASK\u ID
s。您可以简单地监视低优先级任务的不足情况,也可以采取措施暂时提高优先级

根据经验,spy增加了一点性能开销,特别是当stdout面临缓慢的I/O(例如9600波特串行)时,但使用起来相当简单。如果您不立即在终端上打印结果,taskHook'ing只会增加很少甚至没有开销,但需要一些编程才能使其运行


另一件可能感兴趣的事情是WindRiver的远程调试器。如果您没有亲自使用该工具,请想象它需要正确设置工作台和目标。

如果您希望在开发过程中进行一次性测量,那么您需要的就是
spyLib
。只需从命令行调用
spy
,即可在10秒内获得每个任务的CPU使用情况报告。调用
spyHelp
了解如何配置间谍。(如果尚未包含spyLib,则可能需要包含到内核的spyLib。)

如果你想多走一步,你需要的就是
taskHookLib
。简单地说,在每个任务切换中都要调用一个函数。Call为您提供进出CPU的任务的
TASK\u ID
s。您可以简单地监视低优先级任务的不足情况,也可以采取措施暂时提高优先级

根据经验,spy增加了一点性能开销,特别是当stdout面临缓慢的I/O(例如9600波特串行)时,但使用起来相当简单。如果您不立即在终端上打印结果,taskHook'ing只会增加很少甚至没有开销,但需要一些编程才能使其运行


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

spyLib正是我想要的。当我查看spyLib.h时,我发现函数签名是void spyReportCommon(FUNCPTR printRtn);我如何传递一个可以用来解析输出的函数?我不认为有一个界面可以让用户获取spy输出,因为它是一个CLI实用程序。据我所知,没有一个函数可以像Linux和Windows那样发出CLI命令并获取输出。获取写入标准输出的消息的一种方法是使用
ioLib
s
ioTaskStdSet
将输出转移到文件。但这样做将滥用间谍的功能。用
taskHookLib
来做这件事可能会更容易。spyLib正是我想要的。当我查看spyLib.h时,我发现函数签名是void spyReportCommon(FUNCPTR printRtn);我如何传递一个可以用来解析输出的函数?我不认为有一个界面可以让用户获取spy输出,因为它是一个CLI实用程序。据我所知,没有一个函数可以像Linux和Windows那样发出CLI命令并获取输出。获取写入标准输出的消息的一种方法是使用
ioLib
s
ioTaskStdSet
将输出转移到文件。但这样做将滥用间谍的功能。使用
taskHookLib
可能更容易做到这一点。