test.c
来自「uCOS2嵌入式操作系统源码」· C语言 代码 · 共 349 行
C
349 行
#include "includes.h" //包含的主控头文件
#define TASK_STK_SIZE 512 //定义堆栈容量
#define TASK_START_ID 0 //任务标志符,OSTaskCreateExt()
#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 //任务优先级
#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
OS_STK TaskStartStk[TASK_STK_SIZE]; //详细定义堆栈容量
OS_STK TaskClkStk[TASK_STK_SIZE];
OS_STK Task1Stk[TASK_STK_SIZE];
OS_STK Task2Stk[TASK_STK_SIZE];
OS_STK Task3Stk[TASK_STK_SIZE];
OS_STK Task4Stk[TASK_STK_SIZE];
OS_STK Task5Stk[TASK_STK_SIZE];
OS_EVENT *AckMbox;
OS_EVENT *TxMbox;
static void TaskStartDispInit(void); //初始化屏幕的函数,用户自己直接设计。
static void TaskStartCreateTasks(void); //创建系统任务
static void TaskStartDisp(void); //范例DOS屏幕底部的相关信息显示函数
void TaskStart(void *pdata); //范例2的6个任务的声明
void TaskClk(void *pdata);
void Task1(void *pdata);
void Task2(void *pdata);
void Task3(void *pdata);
void Task4(void *pdata);
void Task5(void *pdata);
void main(void)
{
OS_STK *ptos;
OS_STK *pbos;
INT32U size;
PC_DispClrScr(DISP_FGND_WHITE);
OSInit();
PC_DOSSaveReturn();
PC_VectSet(uCOS,OSCtxSw);
PC_ElapsedInit(); //初始化时间测量功能,用来计算OSTaskStkChk()函数的运行时间,
//精确记录PC_ElapsedStart()和PC_ElapsedStop()函数的调用时刻,从而计算这两个时刻间代码的执行时间。
ptos = &TaskStartStk[TASK_STK_SIZE - 1];
pbos = &TaskStartStk[0];
size = TASK_STK_SIZE; //以上三项都是因为OSTaskStkInit_FPE_x86()函数修改了堆栈顶、底及堆栈容量,需要把
//修改后的值传递给OSTaskCreateExt()函数。
OSTaskStkInit_FPE_x86(&ptos,&pbos,&size);
OSTaskCreateExt(TaskStart, //OSTaskCreateExt()支持对堆栈的修改和运行时对堆栈容量的检查,是OSTaskCreate()函数的功能扩展函数。
(void *)0,
ptos,
TASK_START_PRIO, //任务优先级
TASK_START_ID, //任务标志符,这里未使用,可为任意值
pbos,
size,
(void *)0, //这里未使用
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); //允许堆栈检查,并需要在任务建立时将堆栈清0。
OSStart();
}
void TaskStart(void *pdata)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
INT16S key;
pdata = pdata;
TaskStartDispInit(); //初始化屏幕
OS_ENTER_CRITICAL(); //关中断
PC_VectSet(0x08,OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
OSStatInit();
AckMbox = OSMboxCreate((void *)0);
TxMbox = OSMboxCreate((void *)0); //建立两个邮箱
TaskStartCreateTasks(); //创建系统任务
for(;;)
{
TaskStartDisp(); //范例DOS屏幕底部的相关信息显示函数
if(PC_GetKey(&key))
{
if(key == 0x1B)
{
PC_DOSReturn();
}
}
OSCtxSwCtr = 0; //若没有按下ESC,则记录任务切换次数的全局变量清0
OSTimeDly(OS_TICKS_PER_SEC); //os_cfg.h中定义
}
}
static void TaskStartDispInit(void)
{
PC_DispStr( 0, 0, " uC/OS-II, The Real-Time Kernel ", DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);
PC_DispStr( 0, 1, " Jean J. Labrosse ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 2, " by Xu Dong 2005.6.21 ", 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 + DISP_BLINK);
}
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);
sprintf(s, "V%4.2f", (float)OSVersion() * 0.01); /* Display uC/OS-II's version number */
PC_DispStr(75, 24, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
switch (_8087)
{ /* Display whether FPU present */
case 0: PC_DispStr(71, 22, " NO FPU ", DISP_FGND_YELLOW + DISP_BGND_BLUE); break;
case 1: PC_DispStr(71, 22, " 8087 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE); break;
case 2: PC_DispStr(71, 22, "80287 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE); break;
case 3: PC_DispStr(71, 22, "80387 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE); break;
}
}
static void TaskStartCreateTasks(void)
{
OSTaskCreateExt(TaskClk,
(void *)0,
&TaskClkStk[TASK_STK_SIZE - 1],
TASK_CLK_PRIO,
TASK_CLK_ID,
&TaskClkStk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(Task1,
(void *)0,
&Task1Stk[TASK_STK_SIZE - 1],
TASK_1_PRIO,
TASK_1_ID,
&Task1Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(Task2,
(void *)0,
&Task2Stk[TASK_STK_SIZE - 1],
TASK_2_PRIO,
TASK_2_ID,
&Task2Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(Task3,
(void *)0,
&Task3Stk[TASK_STK_SIZE - 1],
TASK_3_PRIO,
TASK_3_ID,
&Task3Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(Task4,
(void *)0,
&Task4Stk[TASK_STK_SIZE-1],
TASK_4_PRIO,
TASK_4_ID,
&Task4Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(Task5,
(void *)0,
&Task5Stk[TASK_STK_SIZE-1],
TASK_5_PRIO,
TASK_5_ID,
&Task5Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
}
void Task1(void *pdata)
{
INT8U err;
OS_STK_DATA data;
INT16U time;
INT8U i;
char s[80];
pdata = pdata;
for(;;)
{
for(i = 0;i < 7;i++)
{
PC_ElapsedStart();
err = OSTaskStkChk(TASK_START_PRIO + i,&data);
time = PC_ElapsedStop();
if(err == OS_NO_ERR)
{
sprintf(s,"%4ld %4ld %4ld %6d",
data.OSFree + data.OSUsed,
data.OSFree,
data.OSUsed,
time);
PC_DispStr(19,12 + i,s,DISP_FGND_YELLOW);
}
}
OSTimeDlyHMSM(0,0,0,100);
}
}
void Task2(void *data)
{
data = data;
for(;;)
{
PC_DispChar(70,15,'|',DISP_FGND_WHITE + DISP_BGND_RED);
OSTimeDly(10);
PC_DispChar(70,15,'/',DISP_FGND_WHITE + DISP_BGND_RED);
OSTimeDly(10);
PC_DispChar(70,15,'-',DISP_FGND_WHITE + DISP_BGND_RED);
OSTimeDly(10);
PC_DispChar(70,15,'\\',DISP_FGND_WHITE + DISP_BGND_RED);
OSTimeDly(10);
}
}
void Task3(void *data)
{
char dummy[500];
INT16U i;
data = data;
for(i = 0;i < 499;i++)
{
dummy[i] = '?';
}
for(;;)
{
PC_DispChar(70,16,'|',DISP_FGND_WHITE + DISP_BGND_RED);
OSTimeDly(20);
PC_DispChar(70,16,'/',DISP_FGND_WHITE + DISP_BGND_RED);
OSTimeDly(20);
PC_DispChar(70,16,'-',DISP_FGND_WHITE + DISP_BGND_RED);
OSTimeDly(20);
PC_DispChar(70,16,'\\',DISP_FGND_WHITE + DISP_BGND_RED);
OSTimeDly(20);
}
}
void Task4(void *data)
{
char txmsg;
INT8U err;
data = data;
txmsg = 'A';
for(;;)
{
OSMboxPost(TxMbox,(void *)&txmsg);
OSMboxPend(AckMbox,0,&err);
txmsg++;
if(txmsg == 'Z')
{
txmsg = 'A';
}
}
}
void Task5(void *data)
{
char *rxmsg;
INT8U err;
data = data;
for(;;)
{
rxmsg = (char *)OSMboxPend(TxMbox,0,&err);
PC_DispChar(70,18,*rxmsg,DISP_FGND_YELLOW + DISP_BGND_RED);
// OSTimeDlyHMSM(0,0,1,0);
OSMboxPost(AckMbox,(void *)1);
}
}
void TaskClk(void *data)
{
char s[40];
data = data;
for(;;)
{
PC_GetDateTime(s);
PC_DispStr(60,23,s,DISP_FGND_BLUE + DISP_BGND_CYAN);
OSTimeDly(OS_TICKS_PER_SEC);
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?