11261|18

60

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

UCOS-II中信号量用法 [复制链接]

 最近在移植UCOS-II,但是发现里面的信号量用法不是成对使用的.
既在一个任务里用
OSSemPend(Signal,0,&err);
而在另一个任务里用OSSemPost(Signal);
我不明白其中的原理,不是成对使用的吗?
在一个任务里
OSSemPend(Signal,0,&err);
//自己的代码
OSSemPost(Signal);
请高手们指点.我迷惑了好几天了.

最新回复

去哪里看啊,我怎么找不到呢?  详情 回复 发表于 2011-7-13 11:11
点赞 关注
 

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
有什么问题,就是这样用
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你指的成对是什么?这两个函数一对一使用?
实际应用中会一对多啊,可以在多处post,这点很好理解,
至于是否可以在多处pend忘了,应该可以吧,不同的任务通过优先级来获取执行,以前简单研究过。
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

4
 
一个是产生信号量,一个是消耗信号量,

其中的第二个任务挂起等待,直到第一个任务产生信号量,这时第二个任务就消耗掉这个信号量,继续运行。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

5
 
刚刚在偶的资源里共享了一个ucos的信号量学习文档,可以看看
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

6
 
学习了,正在学习,困惑中!!!
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

7
 
楼主的用法感觉像是将信号量当FLAG用,满足就下,不满足就走。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

8
 
mask
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

9
 
2中使用方法都对
情况不同而已
1、是2个任务 一个任务等待另1个或几个任务完成某件事
2、是临界区资源保护,要成对使用的
自己理解!!
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

10
 
忘记了2年前搞的记得当时有个是阻塞型的,pend一个消息后另个任务会阻塞等待他,不知道记得清楚不!
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

11
 
      OSSemPend 是等待信号 ,可以等待当前的任务发出的信号,也可以等待其他任务发出信号
SSemPost 同理,但OSSemPend 一般不在中断中使用,OSSemPend则可以
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

12
 
“既在一个任务里用
OSSemPend(Signal,0,&err);
而在另一个任务里用OSSemPost(Signal);
我不明白其中的原理,不是成对使用的吗?
在一个任务里
OSSemPend(Signal,0,&err);
//自己的代码
OSSemPost(Signal); ”

OSSemPend与OSSemPost是成对使用的,但是可以在不同的任务中使用。
或许他们都用了同一个临界区,从OSSemPend起使用某种资源,直到另外一个任务释放某种资源。
你的写法也有,要具体问题具体分析。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

13
 
生产与消费的关系,想消费得先生产,生产过多并不影响你消费,但是会浪费造成
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(初级)

14
 
OSSemPend(Signal,0,&err);
这个函数必须在任务中调用吗?
 
 
 

回复

463

帖子

0

TA的资源

纯净的硅(中级)

15
 
楼上的各位已经讲的很清楚了。比喻也好。顶一下
 
 
 

回复

849

帖子

0

TA的资源

纯净的硅(高级)

16
 
典型的消费者与生产者的关系了。。。
 
个人签名只有想不到,没有做不到。
 
 

回复

79

帖子

0

TA的资源

一粒金砂(高级)

17
 

 

对于OSSemPend()主要考虑两方面:

1pevent->OSEventCnt > 0)时, pevent->OSEventCnt--;得到信号量,任务继续执行后面的代码。

2pevent->OSEventCnt ==0是将此任务就绪列表放入事件等待列表,就是挂起,重新调度,就绪表中最高级任务执行。

 

 

OSSemPost()主要考虑两方面:

1if (pevent->OSEventGrp != 0x00)如果有事件等待,最高级的先放入就绪列表,进行调度,就绪表中最高级任务执行。

2if (pevent->OSEventCnt < 65535)pevent->OSEventCnt++;  信号量加一,任务继续执行后面的代码。

 

 

分析任何的信号量关系,把握好以上两条,我觉得就可以分析出来。

顺便说一下,信号量相当于全局变量。全局变量与各任务都可关联。

[ 本帖最后由 lalahu 于 2011-4-17 13:45 编辑 ]
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

18
 
楼上说的清晰明朗
 
 
 

回复

113

帖子

0

TA的资源

一粒金砂(中级)

19
 
去哪里看啊,我怎么找不到呢?
 
个人签名中国人民解放军总装备部
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表