ucos-ii学习笔记——信号量的原理及使用
学习笔记
for
redesigned
2012-10-7
versions:V-0.1
All
#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即代表只创建一个信号量,代表信号量用于对共享资源的访问(例如,把它当做二值信号量使用),详见P166
}
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
//也来访问(也有可能是反过来),但是由
ucos-ii学习笔记信号 相关文章:
- ucos-ii学习笔记——s12 lcd led 两任务信号量通信(11-28)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)