📄 test.c
字号:
/*
*********************************************************************************************************
* 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 #4
*********************************************************************************************************
*/
#include "includes.h"
/*$PAGE*/
/*
*********************************************************************************************************
* 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];
INT8U TaskData[N_TASKS]; /* Parameters to pass to each task */
BOOLEAN timingLog=FALSE; /* Log task timing */
/*
*********************************************************************************************************
* 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 (int argc, char *argv[])
{
if (argc>1)
timingLog=TRUE; /* Log task timing, if any command line parameter is used */
PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); /* Clear the screen */
OSInit(); /* Initialize uC/OS-II */
OSTaskCreateExt(TaskStart,
(void *)0,
&TaskStartStk[TASK_STK_SIZE - 1],
20, /* Task priority = 20 */
0,
&TaskStartStk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_SAVE_FP);
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(); /* Initialize the display */
PC_ElapsedInit();
OSStatInit(); /* Initialize uC/OS-II's statistics */
TaskStartCreateTasks(); /* Create all the application tasks */
for (;;) {
TaskStartDisp();
if (PC_GetKey(&key) == TRUE) { /* See if key has been pressed */
if (key == 0x1B) { /* Yes, see if it's the ESCAPE key */
exit(0); /* Return to DOS */
}
}
OSCtxSwCtr = 0;
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_LIGHT_GRAY);
PC_DispStr( 0, 3, " EXAMPLE #4 ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 4, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 5, "TaskPrio Angle cos(Angle) sin(Angle) ", 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, " ", 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, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 13, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 14, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 15, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 16, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 17, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 18, " ", 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: % Tick: ", 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);
#if OS_TASK_STAT_EN > 0
sprintf(s, "%3d", OSCPUUsage); // Display CPU usage in %
PC_DispStr(36, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
#endif
sprintf(s, "%8d", OSTime); // Display current time tick
PC_DispStr(70, 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(52, 23, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
}
/*$PAGE*/
/*
*********************************************************************************************************
* CREATE TASKS
*********************************************************************************************************
*/
static void TaskStartCreateTasks (void)
{
INT8U i;
INT8U prio;
for (i = 0; i < N_TASKS; i++) { /* Create N_TASKS identical tasks */
prio = i + 1;
TaskData[i] = prio;
OSTaskCreateExt(Task,
(void *)&TaskData[i],
&TaskStk[i][TASK_STK_SIZE - 1],
prio,
0,
&TaskStk[i][0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_SAVE_FP);
}
}
/*
*********************************************************************************************************
* TASKS
*********************************************************************************************************
*/
void Task (void *pdata)
{
FP32 x;
FP32 y;
FP32 angle;
FP32 radians;
char s[128];
INT8U ypos;
INT32U time=0;
FILE *fd;
ypos = *(INT8U *)pdata + 7;
angle = (FP32)(*(INT8U *)pdata -1) * (FP32)36.0;
for (;;) {
time= PC_ElapsedStop(*(INT8U *)pdata); //Measure time jitter since last call in usec
PC_ElapsedStart(*(INT8U *)pdata);
if (timingLog && (*(INT8U *)pdata == 1) && (fd = fopen("uCOS.log","a+"))!=NULL)
{ fprintf(fd, "%2d %6d\n", *(INT8U *)pdata, time);
fclose(fd);
}
radians = (FP32)2.0 * (FP32)3.141592 * angle / (FP32)360.0;
x = (FP32) cos(radians);
y = (FP32) sin(radians);
sprintf(s, " %2d %8.3f %8.3f %8.3f %10uus", *(INT8U *)pdata, angle, x, y, time);
PC_DispStr(0, ypos, s, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
if (angle >= (FP32)360.0) {
angle = (FP32)0.0;
} else {
angle += (FP32)0.01;
}
OSTimeDly(1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -