Search code examples
c++performancemonitoringvxworks

Monitor task CPU utilization in VxWorks while program is running


I'm running a VxWorks 6.9 OS embedded system and I need to see when I'm starving low priority tasks. Ideally I'd like to have CPU utilization by task so I know what is eating up all my CPU time.

I know this is a built in feature in many operating systems but have been so far unable to find it for VxWorks 6.9.

If I can't measure by task I'd like to at least to see what percentage of time the CPU is idle. To that end I've been trying to make a lowest priority task that will run the function below that would try to measure it indirectly.

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


    }

The big problem with this concept is I don't know how I would detect when this task is left for a higher priority task.


Solution

  • If you are looking for a one time measurement done during the developement, then spyLib is what you are looking for. Simply call spy from the command line to get per task CPU usage report in 10s intervals. Call spyHelp to learn how to configure the spy. (Might need to inculude the spyLib to kernel if not already included.)

    If you want to go the extra mile, taskHookLib is what you need. Simply put, you hook a function to be called in every task switch. Call gives you the TASK_IDs of tasks going in and out of the CPU. You can either simply monitor the starvation of low pri tasks or take action and increase their priority temporarily.

    From experience, spy adds a little performance overhead, especially if stdout faces to a slow I/O (e.g. a 9600 baud serial), but fairly easy to use. taskHook'ing adds little to none overhead if you are not immediately printing the results on the terminal, but takes a bit of programming to get it running.

    Another thing that might be of interest is WindRiver's remote debugger. Haven't use that one personally, imagine it would require setting up the workbench and the target properly.