Created
on:
2012-10-8
Author:zhangbin
学习笔记
forucos-iiPC
redesignedbyzhangbin
2012-10-8
versions:V-0.1
AllRightsReserved
#include"INCLUDES.h"
#defineTASK_STK_SIZE512
OS_STKStartTaskStk[TASK_STK_SIZE];//起始任务
OS_STKMyTaskStk[TASK_STK_SIZE];
OS_STKYouTaskStk[TASK_STK_SIZE];
OS_STKHerTaskStk[TASK_STK_SIZE];
char*s1="Mytaskisrunning";
char*s2="Youtaskisrunning";
char*s3="Hertaskisrunning";
INT8Uerr;//返回的错误信息
INT8Uy=0;//字符显示位置
OS_FLAG_GRP*Sem_F;//定义一个信号量集指针,是标志组类型,OS_FLAG_GRP类型的指针用标志组描述信号量集
//事件控制块用来描述信号量,消息邮箱,消息队列
voidStartTask(void*data);
voidMyTask(void*data);
voidYouTask(void*data);
voidHerTask(void*data);
voidmain(void)
{
OSInit();
PC_DOSSaveReturn();
PC_VectSet(uCOS,OSCtxSw);
Sem_F=OSFlagCreate(0,&err);//创建信号量集函数的原型为:OS_FLAG_GRP*OSFlagCreate(OS_FLAGSflags,INT8U*err)
//其中参数OS_FLAGSflags是信号的初始值,在这里指定为0,即信号初始值为0.参数*err是错误信息,前面已经定义了
//INT8Uerr;//返回的错误信息,所以此处为&err
//返回值为OS_FLAG_GRP型的指针,即为创建的信号量集的标志组的指针,
//前面已经定义了OS_FLAG_GRP*Sem_F;//定义一个信号量集指针
OSTaskCreate(StartTask,(void*)0,&StartTaskStk[TASK_STK_SIZE-1],0);//创建起始任务
OSStart();
}
voidStartTask(void*pdata)
{
#ifOS_CRITICAL_METHOD==3
OS_CPU_SRcpu_sr;
#endif
INT16Skey;
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(;;){
//如果恩下ESC键,则退出UC/OS-II
if(PC_GetKey(&key)==TRUE){
if(key==0x1B){
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0,0,3,0);
}
}
voidMyTask(void*pdata)
{
#ifOS_CRITICAL_METHOD==3
OS_CPU_SRcpu_sr;
#endif
pdata=pdata;
for(;;)
{
OSFlagPend(//请求信号量集
Sem_F,//请求信号量集指针
(OS_FLAGS)3,//过滤器请求第0和第1位信号0011这里是把数据3强制转化为OS_FLAGS类型的数据,
//因为过滤器和信号量集中的信号都是OS_FLAGS类型的数据
//OS_FLAG_WAIT_SET_ALL+OS_FLAG_CONSUME,//信号全是1表示信号有效参数OS_FLAG_CONSUME表示当
//任务等待的事件发生后,清除相应的事件标志位
OS_FLAG_WAIT_SET_ALL,//信号全是1表示信号有效没有加参数OS_FLAG_CONSUME,所以不会清除标志位
0,//等待时限,0表示无限等待
&err//错误信息
);
//任务MyTask在这里请求信号量集,如果请求到了信号量集,就继续运行,下面就显示信息,如果请求不到信号量集
//MyTask就挂起,处于等待状态,只到请求到了信号量集才继续往下运行
PC_DispStr(10,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);//显示信息
OSTimeDlyHMSM(0,0,2,0);//等待2s
}
}
voidYouTask(void*pdata)
{
#ifOS_CRITICAL_METHOD==3
OS_CPU_SRcpu_sr;
#endif
pdata=pdata;
for(;;)
{
PC_DispStr(10,++y,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);//显示信息
OSTimeDlyHMSM(0,0,8,0);//等待8s
OSFlagPost(//向信号量集发信号
Sem_F,//发送信号量集的指针
(OS_FLAGS)2,//选择要发送的信号给第1位发信号0010同样把2强制转化为OS_FLAGS型的数据,
//因为信号为OS_FLAGS型的
OS_FLAG_SET,//信号有效的选项信号置1OS_FLAG_SET为置1OS_FLAG_CLR为置0
&err//错误信息
);
OSTimeDlyHMSM(0,0,2,0);//等待2s
}
}
voidHerTask(void*pdata)
{
#ifOS_CRITICAL_METHOD==3
OS_CPU_SRcpu_sr;
#endif
pdata=pdata;
for(;;)
{
PC_DispStr(10,++y,s3,DISP_BGND_BLACK+DISP_FGND_WHITE);//显示信息
OSTimeDlyHMSM(0,0,8,0);//等待8s
OSFlagPost(//向信号量集发信号
Sem_F,
(OS_FLAGS)1,//给第0位发信号0001,把1强制转化为OS_FLAGS型的
OS_FLAG_SET,//信号置1
&err
);
OSTimeDlyHMSM(0,0,1,0);//等待1s
}
}
//因为任务MyTask请求信号量集的时候请求的是第一位和第零位,所以下面两个任务分别发送第一位和第零位信号
//有一个问题:任务请求信号量集,得到信号后,信号量集中的对应的信号会被清除么??从本例的运行现象来看,好像
//是没有清除,因为当第一次YouTa