4429|8

77

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求助:关于uc /osii中信号量使用的理解困惑 [复制链接]

在周立功的一本书上看到如下的程序(节选)
TASK0()
{
..........
while()
{
  OSSemPend(Dispem,0,&err);//等待信号量
  UART0_SendStr(str0);
  OSTimeDly(1);
  err = OSSemPost(DispSem);//发送信号量
}
}

TASK1()
{
..........
while()
{
  OSSemPend(Dispem,0,&err);//等待信号量
  UART0_SendStr(str1);
  err = OSSemPost(DispSem);//发送信号量
}
}
明显程序是想用信号量控制的方式用UART0交替发送str0和str1,但是小弟不理解的是开始执行TASK0后程序先调用了OSSemPend(Dispem,0,&err),来等待信号量,这样TASK0被挂起,TASK1执行,但TASK1执行后也是先执行了OSSemPend(Dispem,0,&err),TASK1也被挂起,这样两个任务都不会调用 OSSemPost(DispSem),来发送信号量,也就是说两个任务都被永久挂起了,是这样理解的吗?如果是这样那不就错了吗?望高手能指教!

最新回复

谢谢你,我似乎能理解了  详情 回复 发表于 2010-3-15 10:09
点赞 关注

回复
举报

86

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
信号量的初始化是什么样的?是否分初始化时便可用和初始化时不可用?如果初始化时不可用的话的确会像你所分析的。如果初始化为可用那TASK0就可以直接执行了吧?所以要看下初始化信号量的地方。
几年前简单学了下这个东西,所以也可能记错,如果说得不对还请见谅。
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
谢谢你能回复,程序里面在main函数中只有DispSem = OSSemCreat(1),还有,对这个参数赋值1我还是不太理解,能不能给点指点呢?
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
在我记忆里多线程分时操作系统的工作的任务是轮询的,由系统分配,轮到任务时,检测信号量队列,条件为真则执行,否则下一任务.
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

5
 
就上面来看,他一共是两个任务,闲时轮询二者,一有为真则执行,二者皆为假则继续查询或闲置,任务本身则等待.当然在创建这两个任务时有个优先级别的参数,这可以参考操作系统的中断作业,由系统控制.
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

6
 
你查一下OSSemCreat()这个函数的说明,用1的话应该就会正常运行,如果用0就会出现你之前分析的情况。
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

7
 
信号量有一个计数器,满足OSSemPend要求,计数器会减一(超时除外);
OSSemCreat()中的值就是设置这个计数器
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 5 楼 veabol 的回复:
你查一下OSSemCreat()这个函数的说明,用1的话应该就会正常运行,如果用0就会出现你之前分析的情况。


up
为1标识信号量创建的时候就初始化为1个信号量了,所以创建完之后,就有一个可用的信号量,优先级高的任务就可以立即获得信号量,继续执行了
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 7 楼 arnold9009 的回复:
引用 5 楼 veabol 的回复:
你查一下OSSemCreat()这个函数的说明,用1的话应该就会正常运行,如果用0就会出现你之前分析的情况。


up
为1标识信号量创建的时候就初始化为1个信号量了,所以创建完之后,就有一个可用的信号量,优先级高的任务就可以立即获得信号量,继续执行了


谢谢你,我似乎能理解了
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

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