您的位置:首页 > 其它

ucosii之事件标志组管理

2012-05-04 08:49 274 查看
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==3
OS_CPU_SR  cpu_sr;
#endif

pdata=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==3
OS_CPU_SR  cpu_sr;
#endif

pdata=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==3
OS_CPU_SR  cpu_sr;
#endif

pdata=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==3
OS_CPU_SR  cpu_sr;
#endif

pdata=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);
}
}
结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: