您的位置 首页 编程

ucos-ii学习笔记——信号量集(事情标志组)的原理及运用

Createdon:2012-10-8Author:zhangbin学习笔记forucos-iiPCredesignedbyzhangbin2012-10-8versions:V-01AllRight

Createdon: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_SIZE1],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_SIZE1],3);//在开始使命中创立三个使命

OSTaskCreate(YouTask,(void*)0,&YouTaskStk[TASK_STK_SIZE1],4);

OSTaskCreate(HerTask,(void*)0,&HerTaskStk[TASK_STK_SIZE1],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恳求信号量集的时分恳求的是第一位和第零位,所以下面两个使命别离发送第一位和第零位信号

//有一个问题:使命恳求信号量集,得到信号后,信号量会集的对应的信号会被铲除么??从本例的运转现象来看,如同

//是没有铲除,由于当第一次YouTask和HerTask运转后,距离了8s使命MyTask才运转,由于YouTask和HerTask都等候了8s

//才向信号量集发送信号。这个显现是正常的。可是今后MyTask每距离2s就运转一次,没有距离8s,等候信号量集。

//查到了:OSFlagPend()函数答应指定在使命等候的事情发生后,从头置起或是铲除相应的事情标志位。这是经过在调用

//OSFlagPend()函数时将一个常量OS_FLAG_CONSUME和参数wait_type相“加”(或许相“或”)来完成的。

//例如期望等候事情标志组的BIT0方位位,而此刻事情标志组的BIT0位现已置位了,那么假如在调用OSFlagPend()时,把参数

//wait_type加上OS_FLAG_CONSUME,就能铲除这个事情标志位。如下所示:(具体阐明,拜见P210)

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/biancheng/256257.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部