我正在运行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
,即可以10s的间隔获取每个任务的CPU使用率报告。致电spyHelp
了解如何配置间谍。 (如果尚未包含,则可能需要将spyLib包含在内核中。)
如果您想加倍努力,则需要taskHookLib
。简而言之,您可以挂接要在每个任务开关中调用的函数。调用使您进入和退出CPU的任务TASK_ID
。您可以只监视低pri任务的饥饿状况,也可以采取措施并暂时提高其优先级。
[根据经验,间谍会增加一点性能开销,特别是如果stdout面临缓慢的I / O(例如9600波特串行)的情况,但非常易于使用。如果您不立即在终端上打印结果,则taskHook'ing几乎不会增加开销,但是需要一些编程才能使其运行。
可能感兴趣的另一件事是WindRiver的远程调试器。尚未亲自使用该工具,可以想象它需要正确设置工作台和目标。