8164|5

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

很奇怪的问题 ! semTake(sem, WAIT_FOREVER) 始终无法阻塞 ! [复制链接]

do
{
...
semTake(sem, WAIT_FOREVER);
...
} while(1);

sem 是通过 semCCreate 创建的 counter 信号量。
semTake 第一次可以阻塞在 sem 上等待, 也就是 sem 第一次被 semGive 后 semTake 成功, 但是以后就无法阻塞在 sem 上 semTake 立即返回并且成功返回 0 即使 sem 没有被 semGive (我每次循环把 counter 值打出来多是 0 ) ; 本来应该阻塞的可是就是不阻塞。
我总是能遇到很奇怪的问题, 郁闷死了 !
希望能给我点建议, 非常感谢 !

最新回复

信号量有几种,一种是互斥类型的信号量,这样的话肯定可以阻塞的。还有一种计数型的,也就是你使用semCCreat创建的,可能需要你指定最多可使用的信号数目。换句话来说,互斥型的信号量用来保护唯一的资源被单独使用,计数型的用来保护多个资源的互斥使用。如果你的计数型SEM最大数目比1多,那么当然不会阻塞。但是我的解释好像不能满足第一次的使用情况!看来还需要对VxWorks的信号量机制的多多了解。  详情 回复 发表于 2008-10-9 14:43
点赞 关注

回复
举报

66

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
多学习      AT指令介绍及用法           http://www.japee.com.cn/jew/pages/JPF2023_Index.aspx?SERIAL_ID=1DDA0AB50EE0BB5C&id=241AEFB635A6AF69
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
直接写个死循环看看

// 先创建semaphore
while(1)
{
    semTake(sem, WAIT_FOREVER);
    printf("get sem");
}
然后在shell下手动敲semGive

如果可以阻塞那肯定是楼主程序的问题
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 
你的信号量是什么类型的?如果是Mutual-Exclusion Semaphores(semMCreate)的就肯定可以Recursive take了
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
请先确认几个问题:
1、counter信号量创建的参数是多少?
2、take信号量和give信号量所属的任务优先级?
3、用semShow在shell下察看信号量变化
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 

信号量有几种,一种是互斥类型的信号量,这样的话肯定可以阻塞的。还有一种计数型的,也就是你使用semCCreat创建的,可能需要你指定最多可使用的信号数目。换句话来说,互斥型的信号量用来保护唯一的资源被单独使用,计数型的用来保护多个资源的互斥使用。如果你的计数型SEM最大数目比1多,那么当然不会阻塞。但是我的解释好像不能满足第一次的使用情况!看来还需要对VxWorks的信号量机制的多多了解。
 
 
 

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

开源项目 更多>>
    随便看看
    查找数据手册?

    EEWorld Datasheet 技术支持

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

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