Task statistics

The following example demonstrates how to retrieve CPU utilization statistics for a specifically targeted task.

#include <stdio.h>
#include <conio.h>
#include "OS_API.h"

#define TASK_COUNT                      10

ERROR WorkerTask(PVOID Arg)
{
  TIME Time;

  /* Start after specified time */
  osSleep(((int) Arg) * AR_TICKS_PER_SECOND / 10);

  /* Show counters value for every 1/10 of second */
  while(1)
  {
    /* Perform a long job for 1 seconds */
    Time = arGetTickCount();
    while(1)
      if(arGetTickCount() >= (Time + 1 * AR_TICKS_PER_SECOND))
        break;

    /* Sleep for one second */
    osSleep(1 * AR_TICKS_PER_SECOND);
  }
}

ERROR MainTask(PVOID Arg)
{
  int i;
  HANDLE Tasks[TASK_COUNT];
  INDEX TotalTime, CPUTime;

  /* Mark parameter as unused */
  AR_UNUSED_PARAM(Arg);

  /* Create tasks */
  for(i = 0; i < TASK_COUNT; i++)
    Tasks[i] = osCreateTask(WorkerTask, (PVOID) i, 0, 1, FALSE);

  /* Infinite loop */
  while(1)
  {
    /* Display statistic after every 100 milliseconds */
    osSleep(AR_TICKS_PER_SECOND / 10);

    /* Print working tasks statistics */
    for(i = 0; i < TASK_COUNT; i++)
    {
      osGetTaskStat(Tasks[i], &CPUTime, &TotalTime);

      gotoxy(1, 1 + i);
      printf("Task %i: %i %%  ", i, (int) (100 * CPUTime / TotalTime));
    }
  }
}

int main(void)
{
  /* Initialization */
  arInit();
  stInit();
  osInit();

  /* Create main task */
  osCreateTask(MainTask, NULL, 0, 0, FALSE);

  /* Start the operating system */
  osStart();

  /* Deinitialization */
  osDeinit();
  arDeinit();
  return 0;
}
SpaceShadow documentation