CPU Usage

The following example demonstrates how to implement a task that monitors and reports CPU usage statistics for all active tasks within the system.

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


#define TASK_COUNT                      8
#define JOB_ITER_COUNT                  200000000


ERROR WorkerTask(PVOID Arg)
{
  INDEX i;
  ULONG Job;
  BOOL PrevLockState;

  /* Example worker job */
  for(i = 0; i < 10; i++)
  {
    /* Printing task status */
    PrevLockState = arLock();
      gotoxy(30 + i, 4 + (int) Arg);
      printf("#");
    arRestore(PrevLockState);

    /* Example Job */
    Job = 0;
    while(Job < JOB_ITER_COUNT)
      Job++;

    /* Sleep for specified amount of time */
    osSleep(((int) Arg) * AR_TICKS_PER_SECOND);
  }

  /* Return with success */
  return ERR_NO_ERROR;
}


ERROR MainTask(PVOID Arg)
{
  INDEX i;
  HANDLE Tasks[TASK_COUNT];    

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

  /* Print task information table */
  clrscr();
  printf("\n");
  printf("\t+------+-----------+------------+\n");
  printf("\t| Task | CPU Usage | Progress   |\n");
  printf("\t+------+-----------+------------+\n");
  for(i = 0; i < TASK_COUNT; i++)
    printf("\t| %4i |           |            |\n", i);
  printf("\t| Main |           |            |\n");
  printf("\t| Idle |           |            |\n");
  printf("\t+------+-----------+------------+\n");

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

  /* Infinite loop */
  while(1)
  {
    BOOL Success;
    INDEX CPUTime, TotalTime;

    /* Print tasks CPU usage */
    for(i = 0; i < TASK_COUNT; i++)
    {
      Success = osGetTaskStat(Tasks[i], &CPUTime, &TotalTime);
      Success &= TotalTime != 0;
      gotoxy(18, 5 + i);
      if(Success)
        printf("%7.2f %", 100. * (float) CPUTime / (float) TotalTime);
      else
        printf("        - ");
    }

    /* Stat task statistics */
    Success = osGetTaskStat(osGetTaskHandle(), &CPUTime, &TotalTime);
    Success &= TotalTime != 0;
    gotoxy(18, 5 + TASK_COUNT);
    if(Success)
      printf("%7.2f %", 100. * (float) CPUTime / (float) TotalTime);
    else
      printf("        - ");

    /* Print Idle task CPU usage */
    osGetSystemStat(&CPUTime, &TotalTime);
    Success = TotalTime != 0;
    gotoxy(18, 6 + TASK_COUNT);
    if(Success)
      printf("%7.2f %", 100. - 100. * (float) CPUTime / (float) TotalTime);
    else
      printf("        - ");

    /* Sleep for next sampling */
    osSleep(AR_TICKS_PER_SECOND / 10);
  }
}


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

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

  /* Start operating system */
  osStart();

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