?? book2.c
字號:
/*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
*
* (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
* All Rights Reserved
*
* EXAMPLE #2
*********************************************************************************************************
*/
#include "includes.h"
/** the ugly output stuff */
#include "term_display.h"
/*
*********************************************************************************************************
* CONSTANTS
*********************************************************************************************************
*/
#define TASK_STK_SIZE OS_TASK_DEF_STK_SIZE /* Size of each task's stacks (# of WORDs) */
#define TASK_START_ID 0 /* Application tasks IDs */
#define TASK_CLK_ID 1
#define TASK_1_ID 2
#define TASK_2_ID 3
#define TASK_3_ID 4
#define TASK_4_ID 5
#define TASK_5_ID 6
#define TASK_START_PRIO 10 /* Application tasks priorities */
#define TASK_CLK_PRIO 11
#define TASK_1_PRIO 12
#define TASK_2_PRIO 13
#define TASK_3_PRIO 14
#define TASK_4_PRIO 15
#define TASK_5_PRIO 16
/*
*********************************************************************************************************
* VARIABLES
*********************************************************************************************************
*/
OS_STK TaskStartStk[TASK_STK_SIZE]; /* Startup task stack */
OS_STK TaskClkStk[TASK_STK_SIZE]; /* Clock task stack */
OS_STK Task1Stk[TASK_STK_SIZE]; /* Task #1 task stack */
OS_STK Task2Stk[TASK_STK_SIZE]; /* Task #2 task stack */
OS_STK Task3Stk[TASK_STK_SIZE]; /* Task #3 task stack */
OS_STK Task4Stk[TASK_STK_SIZE]; /* Task #4 task stack */
OS_STK Task5Stk[TASK_STK_SIZE]; /* Task #5 task stack */
OS_EVENT *AckMbox; /* Message mailboxes for Tasks #4 and #5 */
OS_EVENT *TxMbox;
/*
*********************************************************************************************************
* FUNCTION PROTOTYPES
*********************************************************************************************************
*/
void TaskStart(void *data); /* Function prototypes of tasks */
static void TaskStartCreateTasks(void);
static void TaskStartDispInit(void);
static void TaskStartDisp(void);
void TaskClk(void *data);
void Task1(void *data);
void Task2(void *data);
void Task3(void *data);
void Task4(void *data);
void Task5(void *data);
/*$PAGE*/
/*
*********************************************************************************************************
* MAIN
*********************************************************************************************************
*/
int main (void)
{
OS_STK *ptos;
OS_STK *pbos;
INT32U size;
PC_DispClrScr(); /* Clear the screen */
OSInit(); /* Initialize uC/OS-II */
PC_DOSSaveReturn(); /* Save environment to return to DOS */
PC_ElapsedInit(); /* Initialized elapsed time measurement */
ptos = &TaskStartStk[TASK_STK_SIZE - 1]; /* TaskStart() will use Floating-Point */
pbos = &TaskStartStk[0];
size = TASK_STK_SIZE;
OSTaskStkInit_FPE_x86(&ptos, &pbos, &size);
OSTaskCreateExt(TaskStart,
(void *)0,
ptos,
TASK_START_PRIO,
TASK_START_ID,
pbos,
size,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSStart(); /* Start multitasking */
return 0;
}
/*$PAGE*/
/*
*********************************************************************************************************
* STARTUP TASK
*********************************************************************************************************
*/
void TaskStart (void *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
INT16S key;
pdata = pdata; /* Prevent compiler warning */
TaskStartDispInit(); /* Setup the display */
OS_ENTER_CRITICAL(); /* Install uC/OS-II's clock tick ISR */
PC_VectSet(0x08, OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC); /* Reprogram tick rate */
OS_EXIT_CRITICAL();
OSStatInit(); /* Initialize uC/OS-II's statistics */
AckMbox = OSMboxCreate((void *)0); /* Create 2 message mailboxes */
TxMbox = OSMboxCreate((void *)0);
TaskStartCreateTasks(); /* Create all other tasks */
for (;;) {
TaskStartDisp(); /* Update the display */
if (PC_GetKey(&key)) { /* See if key has been pressed */
if (key == 0x1B) { /* Yes, see if it's the ESCAPE key */
PC_DOSReturn(); /* Yes, return to DOS */
}
}
OSCtxSwCtr = 0; /* Clear context switch counter */
OSTimeDly(OS_TICKS_PER_SEC); /* Wait one second */
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* INITIALIZE THE DISPLAY
*********************************************************************************************************
*/
static void TaskStartDispInit (void)
{
/* 1111111111222222222233333333334444444444555555555566666666667777777777 */
/* 01234567890123456789012345678901234567890123456789012345678901234567890123456789 */
PC_DispStr( 0, 0, " uC/OS-II, The Real-Time Kernel ", COLOR_WHITE , COLOR_RED );
PC_DispStr( 0, 1, " Jean J. Labrosse ", COLOR_BLACK , COLOR_LIGHT_GRAY);
PC_DispStr( 0, 2, " ", COLOR_BLACK , COLOR_LIGHT_GRAY);
PC_DispStr( 0, 3, " EXAMPLE #2 ", COLOR_BLACK , COLOR_LIGHT_GRAY);
PC_DispStr( 0, 4, " ", COLOR_BLACK , COLOR_LIGHT_GRAY);
PC_DispStr( 0, 5, " ", COLOR_BLACK , COLOR_LIGHT_GRAY);
PC_DispStr( 0, 6, " ", COLOR_BLACK , COLOR_LIGHT_GRAY);
PC_DispStr( 0, 7, " ", COLOR_BLACK , COLOR_LIGHT_GRAY);
PC_DispStr( 0, 8, " ", COLOR_BLACK , COLOR_LIGHT_GRAY);
PC_DispStr( 0, 9, "Task Total Stack Free Stack Used Stack ExecTime (uS) ", COLOR_BLACK , COLOR_LIGHT_GRAY);
PC_DispStr( 0, 10, "------------- ----------- ---------- ---------- ------------- ", COLOR_BLACK , COLOR_LIGHT_GRAY);
PC_DispStr( 0, 11, " ", COLOR_BLACK , COLOR_LIGHT_GRAY);
PC_DispStr( 0, 12, "TaskStart(): ", COLOR_BLACK , COLOR_LIGHT_GRAY);
PC_DispStr( 0, 13, "TaskClk() : ", COLOR_BLACK , COLOR_LIGHT_GRAY);
PC_DispStr( 0, 14, "Task1() : ", COLOR_BLACK , COLOR_LIGHT_GRAY);
PC_DispStr( 0, 15, "Task2() : ", COLOR_BLACK , COLOR_LIGHT_GRAY);
PC_DispStr( 0, 16, "Task3() : ", COLOR_BLACK , COLOR_LIGHT_GRAY);
PC_DispStr( 0, 17, "Task4() : ", COLOR_BLACK , COLOR_LIGHT_GRAY);
PC_DispStr( 0, 18, "Task5() : ", COLOR_BLACK , COLOR_LIGHT_GRAY);
PC_DispStr( 0, 19, " ", COLOR_BLACK , COLOR_LIGHT_GRAY);
PC_DispStr( 0, 20, " ", COLOR_BLACK , COLOR_LIGHT_GRAY);
PC_DispStr( 0, 21, " ", COLOR_BLACK , COLOR_LIGHT_GRAY);
PC_DispStr( 0, 22, "#Tasks : CPU Usage: % ", COLOR_BLACK , COLOR_LIGHT_GRAY);
PC_DispStr( 0, 23, "#Task switch/sec: ", COLOR_BLACK , COLOR_LIGHT_GRAY);
PC_DispStr( 0, 24, " <-PRESS 'Ctrl C' TO QUIT-> ", COLOR_BLACK , COLOR_LIGHT_GRAY );
/* 1111111111222222222233333333334444444444555555555566666666667777777777 */
/* 01234567890123456789012345678901234567890123456789012345678901234567890123456789 */
}
/*$PAGE*/
/*
*********************************************************************************************************
* UPDATE THE DISPLAY
*********************************************************************************************************
*/
static void TaskStartDisp (void)
{
char s[80];
sprintf(s, "%5d", OSTaskCtr); /* Display #tasks running */
PC_DispStr(18, 22, s, COLOR_YELLOW , COLOR_BLUE);
sprintf(s, "%3d", OSCPUUsage); /* Display CPU usage in % */
PC_DispStr(36, 22, s, COLOR_YELLOW , COLOR_BLUE);
sprintf(s, "%5d", OSCtxSwCtr); /* Display #context switches per second */
PC_DispStr(18, 23, s, COLOR_YELLOW , COLOR_BLUE);
sprintf(s, "V%4.2f", (float)OSVersion() * 0.01); /* Display uC/OS-II's version number */
PC_DispStr(75, 24, s, COLOR_YELLOW , COLOR_BLUE);
}
/*$PAGE*/
/*
*********************************************************************************************************
* CREATE TASKS
*********************************************************************************************************
*/
static void TaskStartCreateTasks (void)
{
OSTaskCreateExt(TaskClk,
(void *)0,
&TaskClkStk[TASK_STK_SIZE - 1],
TASK_CLK_PRIO,
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -