📄 test.c
字号:
/*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
*
* WIN32 PORT & LINUX PORT
* (c) Copyright 2004, Werner.Zimmermann@fht-esslingen.de
* (Similar to Example 2 of the 80x86 Real Mode port by Jean J. Labrosse)
* All Rights Reserved
*
* EXAMPLE #2
*********************************************************************************************************
*/
#include "includes.h"
/*
*********************************************************************************************************
* CONSTANTS
*********************************************************************************************************
*/
#define TASK_STK_SIZE 512 // 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(DISP_FGND_WHITE); // Clear the screen
PC_ElapsedInit(); // Initialized elapsed time measurement
OSInit(); // Initialize uC/OS-II
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
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
exit(0); // 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 ", 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_LIGHT_GRAY);
PC_DispStr(0, 3, " EXAMPLE #2 ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(0, 4, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(0, 5, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(0, 6, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(0, 7, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(0, 8, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(0, 9, "Task Total Stack Free Stack Used Stack ExecTime (uS) ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(0, 10, "------------- ----------- ---------- ---------- ------------- ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(0, 11, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(0, 12, "TaskStart(): ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(0, 13, "TaskClk() : ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(0, 14, "Task1() : ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(0, 15, "Task2() : ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(0, 16, "Task3() : ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(0, 17, "Task4() : ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(0, 18, "Task5() : ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(0, 19, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(0, 20, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(0, 21, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(0, 22, "#Tasks : CPU Usage: % ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(0, 23, "#Task switch/sec: ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(0, 24, " <-PRESS 'ESC' TO QUIT-> ", DISP_FGND_BLACK + DISP_BGND_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, DISP_FGND_YELLOW + DISP_BGND_BLUE);
sprintf(s, "%3d", OSCPUUsage); // Display CPU usage in %
PC_DispStr(36, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
sprintf(s, "%5d", OSCtxSwCtr); // Display #context switches per second
PC_DispStr(18, 23, 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(54, 23, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
}
/*$PAGE*/
/*
*********************************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -