knight_lxf 发表于 2013-8-19 20:25:55

uC/OS--II 计数型信号量(sampaphore)使用疑惑

uC/OS-II为了实现任务与任务、中断与任务之间的同步/通信,使用了计数型信号量、互斥型信号量、消息邮箱、消息队列。
其中,互斥型信号量可以用了标志共享资源当前是否已经被占用,例有多个任务申请串口打印时
         消息邮箱可以在任务与任务、中断与任务之间传递一个数据(数据可以是一个数组、一个结构体..........),例如在任务A中处理完数据,然后发送给任务B接着做后续处理
         消息队列可以在任务与任务、中断与任务之间传递多个数据(数据可以是一个数组、一个结构体..........),例同上。
       那什么情况下使用计数型信号量呢?
看某些书上对计数型信号量的使用情况解释为:假设一个大的电话亭,里面有多部电话,那么这个电话亭就允许在同一时刻有多人使用。因此在电话亭门口的指示牌上指示当前剩余的可用电话的数量。那么在嵌入式编程中这个类似“具有多部电话的电话亭”又是什么样的资源呢??
         
          先行谢过!!!

knight_lxf 发表于 2013-8-19 20:45:02

顺便坐个沙发

ljt80158015 发表于 2013-8-19 20:48:58

信号量可以用于任务同步,互斥。

knight_lxf 发表于 2013-8-19 20:52:23

ljt80158015 发表于 2013-8-19 20:48 static/image/common/back.gif
信号量可以用于任务同步,互斥。

鄙人刚接触uC/OS不久,真心没理解。能否举个例子呢?

Eric2013 发表于 2013-8-20 11:03:22

uCOS是下面这样的:
OSSemCreate(0):这种情况下可以用任务的同步。
OSSemCreate(1): 二值信号量,可用于一个资源的使用
OSSemCreate(>1):这种情况表示有>1个资源可以使用。

RTX:
和uCOS类似,通过初始化计数值来同时实现同步,二值信号量(和互斥信号量的不同就是优先级翻转不支持),和多资源的管理

FreeRTOS:
除了有和RTX,uCOS一样的计数信号量以外,还专门加了一个二值信号量vSemaphoreCreateBinary,其实有些多余,不过执行速度比用
计数信号量来实现二值信号量要快些

embOS:
也是单独做了一个二值信号量,这里他们的手册将他叫做资源信号量。OS_Use() 和OS_Unuse() 。

chencc8 发表于 2013-8-23 22:19:38

UCOS为了让邮箱或者队列可以部分代替计数信号量,所以队列邮箱都有多个任务等待一个消息的做法,消息来了的话就从等待列表中找到最高优先级的任务,将他恢复,感觉比较累赘。

计数信号量用在行为同步的时候,创建信号量的时候信号量值为0,任务pend这个信号量,直到有任务或者ISR post这个信号量后,这个任务才恢复到就绪表中,一个任务(ISR)将等待信号的任务就绪了这就是行为同步。
用到资源同步的话就是,先判断这个资源(比如串口)同一时间可以被多少个任务使用,一般情况下只有1个任务,设定信号量值为1,然后先pend到这个信号量的就获得资源使用权,别的任务再pend这个资源的话就
会被挂起,直到资源所有者释放了这个资源,可能会有优先级反转的问题。

根据周航慈的书中的说法,在多实体的资源上,允许多个任务同时使用这个资源,可以使用计数信号量管理,但是在嵌入式里每个同类实体的硬件连接往往不同,相互之间并不能替代,比如单片机的多个串口虽然都是串口
但是硬件连接的目标往往并不一样,不能互换,也就不能用计数信号量管理了。
他还说到:“在嵌入式系统中完全平等的多实体共享资源基本上只有内存块了,而实时操作系统已经把内存块管理起来了,只要调用相关的内存动态管理函数即可。”
所以基本上只是用来做行为同步的吧{:sleepy:}

knight_lxf 发表于 2013-8-24 10:44:45

chencc8 发表于 2013-8-23 22:19 static/image/common/back.gif
UCOS为了让邮箱或者队列可以部分代替计数信号量,所以队列邮箱都有多个任务等待一个消息的做法,消息来了的 ...

后来在网上看到有人推荐他的那本书看到计数型信号量的那章 顿时笑了
页: [1]
查看完整版本: uC/OS--II 计数型信号量(sampaphore)使用疑惑