#include
#define
char
char
INT8U
INT8U
OS_EVENT
//注意,前面有一个例子2
//BOOLEAN
//这样,当已经有任务访问共享资源时,其他的任务就不能访问,知道该资源未被访问,其他的任务才可以进行访问
//注意这两个信号量的区别和使用情况
OS_STK
OS_STK
OS_STK
void
void
void
void
void
{
Fun_Semp=OSSemCreate(1);
//用该参数对信号量计数器OSEventCnt进行初始化
//1即代表只创建一个信号量,代表信号量用于对共享资源的访问(例如,把它当做二值信号量使用)
}
void
{
#if
#endif
OSTaskCreate(YouTask,(void
for
}
//MyTask的函数代码
void
{
#if
#endif
PC_DispStr(0,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);
Fun(7,y);
OSSemPost(Fun_Semp);
}
void
{
#if
#endif
pdata=pdata;
for
{
OSSemPend(Fun_Semp,0,&err);
PC_DispStr(0,++y,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);
Fun(7,y);
OSSemPost(Fun_Semp);
}
//公共的函数Fun的代码
void
{
PC_DispStr(x,y,"
}
创建信号量时,用的参数为1,即Fun_Semp=OSSemCreate(1);
共享资源的访问(例如,可以把它当做二值信号量使用)
在上面的程序中,当MyTask运行时,先请求获得了信号量,对共享资源Fun函数进行访问,由于只创建了一个信号量,
所以在MyTask的访问期间,即使任务YouTask也进行申请信号量,此时OSEventCnt是值已经为0了,所以会把任务
YouTask列入任务等代表OSEventTbl[]中,使任务处于等待状态。
只有等MyTask对Fun函数访问完成了,调用OSSemPost(Fun_Semp);释放了信号量,该释放信号量的函数会先检查任务等待
表中是否还有等待信号量的任务,如果有,则使任务进入就绪态后,调用调度器OS_Sched()引发一次任务调度,去运行等待
任务列表中优先级最高的任务。如果没有,则就把信号量计数器OSSemCnt加1.
所以任务YouTask要想访问Fun()函数,必须等到任务MyTask对Fun访问完毕,释放了信号量之后,才能访问,反之亦然
所以由上面可以看出,只创建一个信号量,即OSSemCreate(1);,作用就相当于使用一个二值信号量,标志共享资源是否正在
被访问。
看懂了上面的分析,也就可以解释实验现象了,由于YouTask等待2s,MyTask等待1s,所以有可能在MyTask访问Fan函数期间,YouTask也来访问(也有可能是反过来),但是由于信号量已经被MyTask占用了,所YouTask只好等待,MyTask使用完了,释放了信号量,YouTask才能正常使用Fun函数,这样也就解决了多任务对共享资源的使用的问题,使任务之间得到了同步