stdlf
分类:
2009-09-03 22:34:18
2)使用消息邮箱 #define TASK_STK_SIZE 512 #define TASK_START_ID 0 /* 任务ID*/ #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; 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(); ptos = &TaskStartStk[TASK_STK_SIZE - 1]; 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(); } 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(); if (PC_GetKey(&key)) { if (key == 0x1B) { PC_DOSReturn(); } } OSCtxSwCtr = 0; OSTimeDly(OS_TICKS_PER_SEC); } } 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_BLACK + DISP_BGND_LIGHT_GRAY); } } OSTimeDlyHMSM(0, 0, 0, 100); /* 挂起mS*/ } } void Task4 (void *data) { char txmsg; INT8U err; data = data; txmsg = 'A'; for (;;) { OSMboxPost(TxMbox, (void *)&txmsg); /* 发消息给Task #5*/ OSMboxPend(AckMbox, 0, &err); /* 等待Task #5的应答消息*/ txmsg++; /*下一个要发的消息数据*/ if (txmsg == 'Z') { txmsg = 'A'; /* 循环发送A-Z*/ } } } void Task5 (void *data) { char *rxmsg; INT8U err; data = data; for (;;) { rxmsg = (char *)OSMboxPend(TxMbox, 0, &err); /* 等待来自Task #4的数据*/ PC_DispChar(70, 18, *rxmsg, DISP_FGND_YELLOW + DISP_BGND_BLUE); OSTimeDlyHMSM(0, 0, 1, 0); /* 挂起秒,让给其他任务运行*/ OSMboxPost(AckMbox, (void *)1); /*发送接收到数据的应答消息*/ } } |