/* ********************************************************************************************************* * uC/OS-II * The Real-Time Kernel * * WIN32 PORT & LINUX PORT * (c) Copyright 2004, Werner.Zimmermann@fht-esslingen.de * (Similar to Example 1 of the 80x86 Real Mode port by Jean J. Labrosse) * All Rights Reserved * * EXAMPLE #1 ********************************************************************************************************* */ #define _CRT_SECURE_NO_WARNINGS #include "includes.h" /* ********************************************************************************************************* * CONSTANTS ********************************************************************************************************* */ #define TASK_STK_SIZE 512 /* Size of each task's stacks (# of WORDs) */ #define N_TASKS 10 /* Number of identical tasks */ /* ********************************************************************************************************* * VARIABLES ********************************************************************************************************* */ OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; /* Tasks stacks */ OS_STK TaskStartStk[TASK_STK_SIZE]; char TaskData[N_TASKS]; /* Parameters to pass to each task */ OS_EVENT *RandomSem; /* ********************************************************************************************************* * FUNCTION PROTOTYPES ********************************************************************************************************* */ void Task(void *data); /* Function prototypes of tasks */ void TaskStart(void *data); /* Function prototypes of Startup task */ static void TaskStartCreateTasks(void); static void TaskStartDispInit(void); static void TaskStartDisp(void); /*$PAGE*/ /* ********************************************************************************************************* * MAIN ********************************************************************************************************* */ int main (void) { PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); /* Clear the screen */ OSInit(); /* Initialize uC/OS-II */ RandomSem = OSSemCreate(1); /* Random number semaphore */ OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0); OSStart(); /* Start multitasking */ return 0; } /* ********************************************************************************************************* * STARTUP TASK ********************************************************************************************************* */ void TaskStart (void *pdata) { INT16S key; pdata = pdata; /* Prevent compiler warning */ TaskStartDispInit(); /* Initialize the display */ TaskStartCreateTasks(); /* Create all the application tasks */ OSStatInit(); /* Initialize uC/OS-II's statistics */ for (;;) { TaskStartDisp(); /* Update the display */ if (PC_GetKey(&key) == TRUE) { /* See if key has been pressed */ if (key == 0x1B) { /* Yes, see if it's the ESCAPE key */ exit(0); /* End program */ } } OSCtxSwCtr = 0; /* Clear context switch counter */ OSTimeDlyHMSM(0, 0, 1, 0); /* Wait one second */ } } /*$PAGE*/ /* ********************************************************************************************************* * INITIALIZE THE DISPLAY ********************************************************************************************************* */ static void TaskStartDispInit (void) { /* 1111111111222222222233333333334444444444555555555566666666667777777777 */ /* 01234567890123456789012345678901234567890123456789012345678901234567890123456789 */ PC_DispStr( 0, 0, " uC/OS-II, The Real-Time Kernel ", DISP_FGND_WHITE + DISP_BGND_RED); #ifdef __WIN32__ PC_DispStr( 0, 1, " Original version by Jean J. Labrosse, 80x86-WIN32 port by Werner Zimmermann ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); #endif #ifdef __LINUX__ PC_DispStr( 0, 1, " Original version by Jean J. Labrosse, 80x86-LINUX port by Werner Zimmermann ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); #endif PC_DispStr( 0, 2, " ", DISP_FGND_BLACK + DISP_BGND_WHITE); PC_DispStr( 0, 3, " EXAMPLE #1 ", DISP_FGND_BLACK + DISP_BGND_WHITE); PC_DispStr( 0, 4, " ", DISP_FGND_BLACK + DISP_BGND_WHITE); PC_DispStr( 0, 5, " ", DISP_FGND_BLACK + DISP_BGND_WHITE); PC_DispStr( 0, 6, " ", DISP_FGND_BLACK + DISP_BGND_WHITE); PC_DispStr( 0, 7, " ", DISP_FGND_BLACK + DISP_BGND_WHITE); PC_DispStr( 0, 8, " ", DISP_FGND_BLACK + DISP_BGND_WHITE); PC_DispStr( 0, 9, " ", DISP_FGND_BLACK + DISP_BGND_WHITE); PC_DispStr( 0, 10, " ", DISP_FGND_BLACK + DISP_BGND_WHITE); PC_DispStr( 0, 11, " ", DISP_FGND_BLACK + DISP_BGND_WHITE); PC_DispStr( 0, 12, " ", DISP_FGND_BLACK + DISP_BGND_WHITE); PC_DispStr( 0, 13, " ", DISP_FGND_BLACK + DISP_BGND_WHITE); PC_DispStr( 0, 14, " ", DISP_FGND_BLACK + DISP_BGND_WHITE); PC_DispStr( 0, 15, " ", DISP_FGND_BLACK + DISP_BGND_WHITE); PC_DispStr( 0, 16, " ", DISP_FGND_BLACK + DISP_BGND_WHITE); PC_DispStr( 0, 17, " ", DISP_FGND_BLACK + DISP_BGND_WHITE); PC_DispStr( 0, 18, " ", DISP_FGND_BLACK + DISP_BGND_WHITE); PC_DispStr( 0, 19, " ", DISP_FGND_BLACK + DISP_BGND_WHITE); PC_DispStr( 0, 20, " ", DISP_FGND_BLACK + DISP_BGND_WHITE); PC_DispStr( 0, 21, "#Tasks : CPU Usage: % ", DISP_FGND_BLACK + DISP_BGND_WHITE); PC_DispStr( 0, 22, "#Task switch/sec: ", DISP_FGND_BLACK + DISP_BGND_WHITE); PC_DispStr( 0, 23, " <-PRESS 'ESC' TO QUIT-> ", DISP_FGND_BLACK + DISP_BGND_WHITE); /* 1111111111222222222233333333334444444444555555555566666666667777777777 */ /* 01234567890123456789012345678901234567890123456789012345678901234567890123456789 */ } /*$PAGE*/ /* ********************************************************************************************************* * UPDATE THE DISPLAY ********************************************************************************************************* */ static void TaskStartDisp (void) { char s[80]; sprintf(s, "%5d", OSTaskCtr); /* Display #tasks running */ PC_DispStr(18, 21, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); #if OS_TASK_STAT_EN > 0 sprintf(s, "%3d", OSCPUUsage /*OSIdleCtr/(OSIdleCtrMax/100)*/);/* Display CPU usage in % */ PC_DispStr(36, 21, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); #endif PC_GetDateTime(s); PC_DispStr(58, 21, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); sprintf(s, "%5d", OSCtxSwCtr); /* Display #context switches per second */ PC_DispStr(18, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); #ifdef __WIN32__ sprintf(s, "uCOS-II V%1d.%02d WIN32 V%1d.%02d", OSVersion() / 100, OSVersion() % 100, OSPortVersion() / 100, OSPortVersion() % 100); /* Display uC/OS-II's version number */ #endif #ifdef __LINUX__ sprintf(s, "uCOS-II V%1d.%02d LINUX V%1d.%02d", OSVersion() / 100, OSVersion() % 100, OSPortVersion() / 100, OSPortVersion() % 100); /* Display uC/OS-II's version number */ #endif PC_DispStr(52, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); } /*$PAGE*/ /* ********************************************************************************************************* * CREATE TASKS ********************************************************************************************************* */ static void TaskStartCreateTasks (void) { INT8U i; for (i = 0; i < N_TASKS; i++) { /* Create N_TASKS identical tasks */ TaskData[i] = '0' + i; /* Each task will display its own letter */ OSTaskCreate(Task, (void *) &TaskData[i], &TaskStk[i][TASK_STK_SIZE - 1], (INT8U) (i + 1)); } } /* ********************************************************************************************************* * TASKS ********************************************************************************************************* */ void Task (void *pdata) { INT8U x; INT8U y; INT8U err; #ifdef __WIN32__ srand(GetCurrentThreadId()); #endif #ifdef __LINUX__ srand(getppid()); #endif for (;;) { OSSemPend(RandomSem, 0, &err); /* Acquire semaphore to perform random numbers */ x = rand() % 78; /* Find X position where task number will appear */ y = rand() % 15; /* Find Y position where task number will appear */ OSSemPost(RandomSem); /* Release semaphore */ /* Display the task number on the screen */ PC_DispChar(x,(INT8U) (y + 5), *((char *)pdata), DISP_FGND_BLACK + DISP_BGND_GRAY); OSTimeDly(1); /* Delay 1 clock tick */ } }