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; }