UCOS 信号量的初值问题
当 pend请求发出的时候信号量的值减1,当post的时候信号量的值加1,信号量的值0跟1分别是用来同步跟互斥的,什么是同步,什么是互斥呢。。。假设你把信号量的值设为0,有A,B连个任务,当A发出pend请求的时候它发现此事的信号量值为0就把它减1然后挂起等待,等待到什么时候呢?等待任务B执行post操作把信号量的值加1然后唤醒进程A,然后两个进程同步并发执行。。。通俗点解释就是任务A执行到某个地方的时候先停下来睡觉,等待任务B来叫醒它,然后两个任务一起并发运行,也就是几乎同时从那个点开始运行哈。。。
假设信号量的值是1,就是用来互斥的,A,B两个任务只能其中一个任务pend执行成功返回,此时信号量的值是0,另一个在pend请求的时候就必须把自己挂起等待刚刚那个请求成功的任务执行post操作才能唤醒继续执行。。。
OSSemCreate(cnt)赋初始值cnt,OSSemPend一次,cnt-- 一次,OSSemPost一次,cnt++一次。
1、OSSemCreate (0);
......
OS_EVENT *Fun_Semp;
......
Fun_Semp = OSSemCreate (0);
......
void MyTask (void *pdata)
{
.....
for (;;)
{
OSSemPend(Fun_Semp,0,&err); //请求信号量
PC_DispStr(0,++y, s1, DISP_BGND_BLACK+DISP_FGND_WHITE );
OSTimeDlyHMSM(0, 0, 1, 0); //等待1秒
}
}
......
void YouTask (void *pdata)
{
......
for (;;)
{
PC_DispStr(0,++y, s2, DISP_BGND_BLACK+DISP_FGND_WHITE );
if(YouTaskRun==5)
OSSemPost(Fun_Semp); //发送信号量
YouTaskRun++;
OSTimeDlyHMSM(0, 0, 2, 0); //等待2秒
}
}
在上例中,MyTask 一直在等待信号量,在信号量没有到来之前无法执行。只有在YouTask 运行了5次,YouTaskRun==5之后,OSSemPost(Fun_Semp); //发送信号量,MyTask 才得以执行。如果按上例所示,MyTask 只能执行一次,因为YouTask 以后再也不可能使得YouTaskRun==5了。MyTask也就因为无法得到信号量而不能运行。
2、OSSemCreate (1);
.....
OS_EVENT *Fun_Semp;
.....
Fun_Semp = OSSemCreate (1);
.....
void MyTask (void *pdata)
{
.....
for (;;)
{
OSSemPend(Fun_Semp,0,&err); //请求信号量
PC_DispStr(0,++y, s1, DISP_BGND_BLACK+DISP_FGND_WHITE );
OSSemPost(Fun_Semp); //发送信号量
OSTimeDlyHMSM(0, 0, 1, 0); //等待1秒
}
}
void YouTask (void *pdata)
{
for (;;)
{
OSSemPend(Fun_Semp,0,&err); //请求信号量
PC_DispStr(0,++y, s2, DISP_BGND_BLACK+DISP_FGND_WHITE );
OSSemPost(Fun_Semp); //发送信号量
OSTimeDlyHMSM(0, 0, 2, 0); //等待2秒
}
}
在上例中,MyTask、YouTask 都在 等待信号量,由于MyTask优先级高,首先得到信号量开始执行。此时YouTask 还在等待信号量。MyTask 执行完毕,OSSemPost(Fun_Semp); //发送信号量。YouTask 得到信号量运行后发送信号量,如此反复
最新文章
- 动态Web API层
- ASP.NET 5 使用 TestServer 进行单元测试
- html5语义标签
- 转:CPU与内存的那些事
- webstrom插件:如何设置才能让webstrom能提示bootstrap的语法
- android中的ellipsize设置(省略号的问题)
- 图片裁切插件jCrop的使用心得(三)
- 如何获取jqGrid中选择的行的数据
- XJOI网上同步测试DAY14 T1
- 磁盘管理三-raid
- 制作与使用静态链接库(.lib)文件
- [Android] FileInputStream跟踪
- poj 2533 Longest Ordered Subsequence(LIS)
- problem 202,263、232、21、231
- iOS网络编程笔记——Socket编程
- [BZOJ1058][ZJOJ2007]报表统计
- java使用Jedis远程访问CentOs7linux时出现拒绝连接的错误
- 405 Method Not Allowed error with PUT or DELETE Request on IIS Server
- Android P的APP适配总结,让你快人一步
- SpringBoot Controller接收参数的几种常用方
热门文章
- Aho_Corasick自动机(AC自动机)
- BZOJ1677: [Usaco2005 Jan]Sumsets 求和
- Spark RDD Union
- C#中两个时间的比较
- [Design Pattern] Flywight Pattern 简单案例
- fsck 修复ext3文件系统(用于linux系统时间不对,文件系统信息有错引起的die with exit status等的一些问题)
- 百度——LBS.云 v2.0——创建自己的地理云数据
- 全球最流行的66款App的共同规律
- 字符串格式化 String.format() 案例
- C#里巧用DateTime预设一些可选的日期范围(如本年度、本季度、本月等)