📄 test.c
字号:
/*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
*
* (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
* All Rights Reserved
*
* EXAMPLE #1
*********************************************************************************************************
*/
#include "includes.h"
/*
*********************************************************************************************************
* CONSTANTS
*********************************************************************************************************
*/
#define TEST_TASK_STK_SIZE 400 /* Size of each task's stacks (# of WORDs) */
#define TEST_N_TASKS 10 /* Number of identical tasks */
/*
*********************************************************************************************************
* VARIABLES
*********************************************************************************************************
*/
OS_STK TestStartStk[TEST_TASK_STK_SIZE]; /* Tasks stacks */
OS_STK TestTaskStk[TEST_N_TASKS][TEST_TASK_STK_SIZE];
OS_EVENT *TestRandomSem;
char TestTaskData[TEST_N_TASKS]; /* Parameters to pass to each task */
OS_EVENT *TestTerminalMbox;
INT16U TestTerminalMsgCtr;
OS_STK TestTerminalTaskStk[TEST_TASK_STK_SIZE];
INT16U TestDly;
INT16U TestLoops;
/*
*********************************************************************************************************
* FUNCTION PROTOTYPES
*********************************************************************************************************
*/
static void TestStart(void *data); /* Function prototypes of Startup task */
static void TestTask(void *data);
static void TestTerminalCallback(INT8U data);
static void TestTerminalTask(void *pdata);
static void TestCreateTasks(void);
static void TestDisp(void);
static void TestDispInit(void);
static void TestDispStat(void);
static void TestDispTaskData(void);
/*$PAGE*/
/*
*********************************************************************************************************
* MAIN
*********************************************************************************************************
*/
void main (void)
{
INT8U prio;
INT8U err;
OSInit(); /* Initialize uC/OS-II */
PC_DOSSaveReturn(); /* Save environment to return to DOS */
PC_VectSet(uCOS, OSCtxSw); /* Install uC/OS-II's context switch vector */
printf("uC/OS-II and uC/OS-View on 80x86 (Large).\n");
prio = 0;
OSTaskCreateExt(TestStart,
(void *)0,
&TestStartStk[TEST_TASK_STK_SIZE - 1],
prio,
prio,
&TestStartStk[0],
TEST_TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CLR + OS_TASK_OPT_STK_CHK);
OSTaskNameSet(prio, "Start Task", &err);
OSStart(); /* Start multitasking */
}
/*
*********************************************************************************************************
* STARTUP TASK
*********************************************************************************************************
*/
static void TestStart (void *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
char s[100];
INT16S key;
INT32U cycles;
pdata = pdata; /* Prevent compiler warning */
OS_ENTER_CRITICAL();
PC_VectSet(0x08, OSTickISR); /* Install uC/OS-II's clock tick ISR */
PC_SetTickRate(OS_TICKS_PER_SEC); /* Reprogram tick rate */
OS_EXIT_CRITICAL();
OSStatInit(); /* Initialize uC/OS-II's statistics */
OSView_Init(); /* Initialize uC/OS-View */
TestTerminalMbox = OSMboxCreate((void *)0);
OSView_TerminalRxSetCallback(TestTerminalCallback); /* Setup Terminal callback function */
TestCreateTasks(); /* Create all the application tasks */
PC_DispClrScr(DISP_FGND_WHITE);
TestDispInit();
TestDly = 100;
TestLoops = 250;
while (TRUE) {
if (PC_GetKey(&key) == TRUE) { /* See if key has been pressed */
switch (key) {
case 0x1B: /* See if it's the ESCAPE key */
OSView_Exit();
PC_DOSReturn(); /* Return to DOS */
break;
case '+': /* Increase task execution rate */
case '=':
if (TestDly > 10) {
TestDly -= 5;
} else if (TestDly > 0) {
TestDly--;
}
break;
/* Decrease task execution rate */
case '-':
case '_':
if (TestDly < 10) {
TestDly++;
} else if (TestDly <= 95) {
TestDly += 5;
}
break;
case 'U': /* Increase task execution time */
case 'u':
if (TestLoops <= 990) {
TestLoops += 10;
}
break;
case 'D': /* Decrease task execution time */
case 'd':
if (TestLoops > 20) {
TestLoops -= 10;
}
break;
}
}
TestDispStat();
TestDispTaskData();
PC_GetDateTime(s);
PC_DispStr(60, 23, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
cycles = OSView_TimeGetCycles();
sprintf(s, "%10lu", cycles);
PC_DispStr(60, 24, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
OSTimeDly(OS_TICKS_PER_SEC / 10);
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* HANDLE VIEWER's TERMINAL WINDOW KEYSTROKES
*
* Note(s): This function is called from an ISR.
*********************************************************************************************************
*/
static void TestTerminalCallback (INT8U data)
{
OSMboxPost(TestTerminalMbox, (char *)data);
}
/*
*********************************************************************************************************
* HANDLE VIEWER's TERMINAL WINDOW KEYSTROKES
*********************************************************************************************************
*/
static void TestTerminalTask (void *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
char s[100];
char key;
INT8U err;
pdata = pdata; /* Prevent compiler warning */
while (TRUE) {
key = (char)OSMboxPend(TestTerminalMbox, 0, &err);
TestTerminalMsgCtr++;
sprintf(s, "%05u", TestTerminalMsgCtr);
PC_DispStr(60, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
switch (key) {
case '1':
sprintf(s, "\nCPU Usage = %3u%%\n", OSCPUUsage);
OSView_TxStr(s, 1);
break;
case '2':
sprintf(s, "\n#Tasks = %3u\n", OSTaskCtr);
OSView_TxStr(s, 1);
break;
default:
OSView_TxStr("\n\nMicrium, Inc.", 1);
OSView_TxStr("\n1: CPU Usage (%)", 1);
OSView_TxStr("\n2: #Tasks", 1);
OSView_TxStr("\n?: Help (This menu)\n", 1);
break;
}
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* CREATE TASKS
*********************************************************************************************************
*/
static void TestCreateTasks (void)
{
INT8U prio;
INT8U err;
INT8U i;
char s[20];
prio = 1;
OSTaskCreateExt(TestTerminalTask, /* uC/OS-View Terminal task */
(void *)0,
&TestTerminalTaskStk[TEST_TASK_STK_SIZE - 1],
prio,
prio,
&TestTerminalTaskStk[0],
TEST_TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CLR + OS_TASK_OPT_STK_CHK);
OSTaskNameSet(prio, "uC/OS-View Terminal", &err);
for (i = 0; i < TEST_N_TASKS; i++) {
sprintf(s, "Task #%2d", i + 1);
TestTaskData[i] = '0' + i; /* Each task will display its own letter */
prio = i + 2;
OSTaskCreateExt(TestTask,
(void *)&TestTaskData[i],
&TestTaskStk[i][TEST_TASK_STK_SIZE - 1],
prio,
prio,
&TestTaskStk[i][0],
TEST_TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CLR + OS_TASK_OPT_STK_CHK);
OSTaskNameSet(prio, s, &err);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -