ucosii之事件标志组管理

来源:互联网 发布:淘宝被清退提示可回滚 编辑:程序博客网 时间:2024/06/14 20:02

ucosii的事件标志组有2部分组成:一是用了保存当前事件组中各事件状态的一些标志;二是等待这

些事件标志位置位或清除的任务列表。

OSFlagWaitList 指针指向一个事件标志组的等待任务列表。

ucosii 定义了两个对等待任务列表的操作:添加节点OS_FlagBlock()和删除节点OS_FlagUnlink。

一个例子

#include "includes.h"#define  TASK_STK_SIZE  512 OS_STK StartTaskStk[TASK_STK_SIZE];OS_STK   MyTaskStk[TASK_STK_SIZE];OS_STK YouTaskStk[TASK_STK_SIZE];OS_STK HerTaskStk[TASK_STK_SIZE];char*s1="MyTask is runing";char*s2="YouTask is runing";char*s3="HerTask is runing";INT16S  key;INT8U   y=0;INT8U   err;INT32U  Times=0;OS_FLAG_GRP *Sem_F;void StartTask(void *data);void MyTask(void *data);void YouTask(void *data);void HerTask(void *data);/***************************************************/void main(void){OSInit();PC_DOSSaveReturn();PC_VectSet(uCOS,OSCtxSw);Sem_F=OSFlagCreate(0,&err);OSTaskCreate(StartTask, (void*)0, &StartTaskStk[TASK_STK_SIZE-1], 0);OSStart();}/**********************************************************/void  StartTask(void *pdata){#if OS_CRITICAL_METHOD==3OS_CPU_SR  cpu_sr;#endifpdata=pdata;OS_ENTER_CRITICAL();PC_VectSet(0x08,OSTickISR);PC_SetTickRate(OS_TICKS_PER_SEC);OS_EXIT_CRITICAL();OSStatInit();OSTaskCreate(MyTask, (void*)0, &MyTaskStk[TASK_STK_SIZE-1], 3);OSTaskCreate(YouTask, (void*)0, &YouTaskStk[TASK_STK_SIZE-1], 4);OSTaskCreate(HerTask, (void*)0, &HerTaskStk[TASK_STK_SIZE-1], 5);for(;;){if(PC_GetKey(&key)==TRUE){if(key==0x1B){PC_DOSReturn();}}OSTimeDlyHMSM(0,0,3,0);}}/********************************************************/void  MyTask(void *pdata){#if OS_CRITICAL_METHOD==3OS_CPU_SR  cpu_sr;#endifpdata=pdata;for(;;){OSFlagPend(Sem_F, (OS_FLAGS)3,OS_FLAG_WAIT_SET_ALL, 0,&err);PC_DispStr(10,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);OSTimeDlyHMSM(0,0,2,0);}}/***************************************************************/void  YouTask(void *pdata){#if OS_CRITICAL_METHOD==3OS_CPU_SR  cpu_sr;#endifpdata=pdata;for(;;){PC_DispStr(10,++y,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);OSTimeDlyHMSM(0,0,8,0);OSFlagPost(Sem_F,(OS_FLAGS)2,OS_FLAG_SET,&err);OSTimeDlyHMSM(0,0,2,0);}}/************************************************/void  HerTask(void *pdata){#if OS_CRITICAL_METHOD==3OS_CPU_SR  cpu_sr;#endifpdata=pdata;for(;;){PC_DispStr(10,++y,s3,DISP_BGND_BLACK+DISP_FGND_WHITE);OSFlagPost(Sem_F,(OS_FLAGS)1,OS_FLAG_SET,&err);OSTimeDlyHMSM(0,0,1,0);}}
结果