5294|13

63

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求助一个信号量的问题 [复制链接]

  程序中有两个任务,分别是收和发,收的优先级高。在接收到特写的数据后,用msgQSend()转向发任务进行相关处理。但是在发任务中又需要收任务提供一些支持,比如发了一定的数据包后需要对方回应,而这个回应是收任务处理的,收到回应后发任务才能继续。
  本来想给msgQSend()那里加信号量的,但是这样似乎会造成死锁,因为发任务需要收任务的支持,加了信号量就卡住了。但是不加信号量的话,发任务的执行似乎就没有保障了。
  有两个问题不明白。1、如果不加信号量,那么发任务什么时候开始执行,是msgQSend()后立即转向发任务,还是等收任务走完之后?2、如果加信号量,能否把semTake()放在msgQSend()前(这时在收任务里),然后把semGive()放到发任务中需要收任务支持的地方,也就是信号量的取得和释放分别在两个任务里?

最新回复

不管用什么方法,能好用就OK  详情 回复 发表于 2010-4-6 23:21
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
Vxworks系统没有接触过,但是us/os-ii应该与之类似吧。
其实线程间协调原来都相同

先问下你,你的收线程的运行是不是没有什么限制一直运行。

 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 ialwaysgo 的回复:
Vxworks系统没有接触过,但是us/os-ii应该与之类似吧。
其实线程间协调原来都相同

先问下你,你的收线程的运行是不是没有什么限制一直运行。

基本是这样的,收任务对输入敏感,一旦有数据进入串口缓冲它就进入执行。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 
你的收线程是查询的方式吧?实际上你说的问题(如果中断可用的话)将收线程改为中断响应的 应该就可以
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 tianxiapdw 的回复:
你的收线程是查询的方式吧?实际上你说的问题(如果中断可用的话)将收线程改为中断响应的 应该就可以

收任务用要实时响应数据,用select()阻塞在串口上了。接收到数据后,特写的数据要作发送,于是用到发任务,用msgQSend()传递要发送的数据。发任务先要发一个询问数据,得到对方确认后才可以正式发数据。这个确认的过程又是收任务的事。
大概就是这样,目前是收任务优先级高,想用信号量来保证发任务的执行,但又怕弄不好给死锁了,毕竟发任务需要收任务的支持。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

6
 
觉得LZ这个问题可以通过信号量控制,而无须用msgQ的。采用环形数据缓冲区处理似乎也可以做到。
收任务收完数据之后写入环形缓冲区,然后释放信号量,发现场获取信号量之后到数据缓冲区中取数据发送。
这样只有收任务可以放信号量,发现程可以取信号量,就不会死锁了。
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 heaven_redsky 的回复:
觉得LZ这个问题可以通过信号量控制,而无须用msgQ的。采用环形数据缓冲区处理似乎也可以做到。
收任务收完数据之后写入环形缓冲区,然后释放信号量,发现场获取信号量之后到数据缓冲区中取数据发送。
这样只有收任务可以放信号量,发现程可以取信号量,就不会死锁了。

大概说一下我的程序流程:接收数据(收任务)——回复确认(收任务,为了较快发送)——需要发送数据(发任务)——向收站请求发送(发任务)——收站允许发送(收任务)——发送数据(发任务)——收到确认(收任务)。收任务相对独立,但是发任务在执行中需要收任务提供支持,因为对方回复的确认信息是由收任务处理的。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

8
 
楼主,你的流程是不是串行的?怎么觉得好像整复杂了
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 7 楼 tianxiapdw 的回复:
楼主,你的流程是不是串行的?怎么觉得好像整复杂了

不是严格意义上的串行程序,是一个底层的网络协议,涉及一些握手机制,所以会有反复的收发过程。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

10
 
接收数据(收任务)——回复确认(收任务,为了较快发送)——需要发送数据(发任务)——向收站请求发送(发任务)——收站允许发送(收任务)——发送数据(发任务)——收到确认(收任务)。

在收过程中,是不是“接收数据(收任务)” 发生后,以后的过程都是顺序执行的?
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 
我原先做过一个测试系统,与你的类似。
流程也有反复收发的过程,但是向我上面说的。我那个在接收数据后,后面的流程都是确定的。我那个系统用DOS就完成了,没有用信号量进行控制。
但是不知道具体情况是否相同。我建议你还是把流程仔细顺一下。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

12
 
感觉上来说是不是没必要起发任务了?只需把发送封装成一个函数就可以了。

如果一定要起发任务,可以采用3个信号量来控制流程:

接收数据(收任务)——回复确认(收任务,为了较快发送,此时release SEM_A)——需要发送数据(take SEM_A,发任务)——向收站请求发送(发任务)——收站允许发送(收任务,release SEM_B)——发送数据(发任务,take SEM_B)——收到确认(收任务,release SEM_C)---发任务take SEM_C确认发送成功,退出该次发送流程。收任务相对独立,但是发任务在执行中需要收任务提供支持,因为对方回复的确认信息是由收任务处理的。
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

13
 
先谢谢两位的耐心解答。
因为是一个底层的协议程序,发送时涉及到重发的问题(发送后一秒内若没有收到确认,则重发)。重发时收发任务的转换还是比较频繁的。我现在用了两个信号量,分别用于发送RTS和DATA,把这两个发送分开写了。任务开始加SemTake(),在收任务处按照需要加SemGive()。试了一下RTS的发送,基本符合期望。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

14
 
不管用什么方法,能好用就OK
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表