5437|9

36

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

对于信号量的滥用 [复制链接]

本帖最后由 cout 于 2014-9-24 11:21 编辑

复制代码
  1. task1()
  2. {
  3.   while(1)
  4.   {
  5.     if(get_sem(sem_name,without_pendding))
  6.     {
  7.       do();
  8.     }
  9.     do_something();
  10.     delay(1);
  11.   }
  12. }
  13.   
  14. task2()
  15. {
  16.   while(1)
  17.   {
  18.     if(condition)
  19.       put_sem(sem_name);
  20.     do_something();
  21.     delay(10);
  22.   }
  23. }
复制代码



如上代码中,两个任务通过发送信号量来通信,task2的condition条件成立时,向task1发送sem_name信号量。task1 在获取信号量时是不会阻塞的,task2在发送信号量时也不会被阻塞,因为,task2在执行时,task1 肯定在执行delay(1);操作(task2有可能会被挂起,但是不会阻塞);这里还隐含一个条件是:task1的周期比task2的周期短。这样看来无论task1 与 task2 的优先级谁高谁低,一般都不会引起执行的变化。个人感觉完全等价于这一段代码:

  1. task1()
  2. {
  3.   while(1)
  4.   {
  5.     if(global_var)
  6.     {
  7.       global_var = 0;
  8.       do();
  9.     }
  10.     do_something();
  11.     delay(1);
  12.   }
  13. }

  14. task2()
  15. {
  16.   while(1)
  17.   {
  18.     if(condition)
  19.       global_var =1;
  20.     do_something();
  21.     delay(10);
  22.   }
  23. }
复制代码
不过还是有人喜欢在代码里创建一大堆信号量,请大家指教。


最新回复

临界区的问题不要用信号量,因为不能解决优先级反转的问题,要用mutex.  详情 回复 发表于 2015-1-7 10:08
点赞 关注

回复
举报

954

帖子

0

TA的资源

纯净的硅(初级)

沙发
 
楼主用全局变量来通信,应该是在某些情况下多个程序访问这个全局变量就会造成一些不必要的错误,不然应该是更好,个人认为。

点评

恩,对。 个人觉得,程序逻辑非常简单,且不涉及调度,全局变量完全可以胜任,不建议使用信号量。 基本理念是在迫不得已的情况下再去使用信号量。  详情 回复 发表于 2014-9-24 14:25
 
 

回复

36

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
247153481 发表于 2014-9-24 13:19
楼主用全局变量来通信,应该是在某些情况下多个程序访问这个全局变量就会造成一些不必要的错误,不然应该是 ...

恩,对。
个人觉得,程序逻辑非常简单,且不涉及调度,全局变量完全可以胜任,不建议使用信号量。
基本理念是在迫不得已的情况下再去使用信号量。

 
 
 

回复

1221

帖子

1

TA的资源

一粒金砂(高级)

4
 
 
个人签名我爱着爱着我的人,朋友和家人。
 
 

回复

420

帖子

0

TA的资源

纯净的硅(初级)

5
 
信号量主要用于任务和任务之间的同步以及中断和任务之间的同步,个人的经验告诉我,信号量更多的用在中断和任务之间的同步多一些。
 
 
 

回复

1025

帖子

1

TA的资源

纯净的硅(高级)

6
 
中断还用信号量?中断中被休眠掉,后果很严重的哦,呵呵

点评

中断发送信号量唤醒外面的任务。这个叫中断与任务的同步。  详情 回复 发表于 2014-10-1 09:32
 
 
 

回复

420

帖子

0

TA的资源

纯净的硅(初级)

7
 
lelee007 发表于 2014-9-30 10:34
中断还用信号量?中断中被休眠掉,后果很严重的哦,呵呵

中断发送信号量唤醒外面的任务。这个叫中断与任务的同步。

点评

恩,这是信号量经典的应用案例。  详情 回复 发表于 2014-10-11 10:01
 
 
 

回复

36

帖子

0

TA的资源

一粒金砂(中级)

8
 
jorya_txj 发表于 2014-10-1 09:32
中断发送信号量唤醒外面的任务。这个叫中断与任务的同步。

恩,这是信号量经典的应用案例。
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

9
 
多任务操作建议使用信号量,因为全局变量存在多任务同时访问的临界区问题,按照楼主的写法需要在全局变量读写前加入互斥操作
 
 
 

回复

420

帖子

0

TA的资源

纯净的硅(初级)

10
 
临界区的问题不要用信号量,因为不能解决优先级反转的问题,要用mutex.
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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