vxworks中Task如何计数信号量

这篇文章主要介绍了vxworks中Task如何计数信号量,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

创新互联专注为客户提供全方位的互联网综合服务,包含不限于成都网站设计、网站建设、深泽网络推广、重庆小程序开发、深泽网络营销、深泽企业策划、深泽品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供深泽建站搭建服务,24小时服务热线:18982081108,官方网址:www.cdcxhl.com

里提到过二进制信号量用来解决同步问题。下面看一个同步的例子

vxworks中Task如何计数信号量              

这段代码很简单,大致的意思就是每成功申请一次信号量,就打印一句话

启动一个任务(t1)来调用这个函数:

vxworks中Task如何计数信号量

可以看到t1阻塞到信号量semId上了。直接给它释放一次信号量

vxworks中Task如何计数信号量

任务(t1)打印了一句话,说明收到了一次信号量

接下来试试释放两次信号量,可以用Shell的命令repeat()

vxworks中Task如何计数信号量

vxworks中Task如何计数信号量

任务(t1)也打印了两句话,说明收到了两次信号量

接下来试试多次的

vxworks中Task如何计数信号量

可以看到, repeat的次数大于2之后,任务(t1)都是只能收到两次信号量

我们看看semGive()的操作流程

vxworks中Task如何计数信号量

从上图可以看到,repeat()第一次释放信号量时,它会将阻塞状态的t1置为就绪状态。第二次释放时,没有任务阻塞了,于是将信号量置为有效(0->1),之后再释放时,都是将信号量置有效(1->1)。直到repeat()执行完毕,就绪状态的t1开始执行后续操作,出现第一次打印。然后又可以成功申请一次信号量(1->0),就有了第二次打印。这之后,信号量就又是无效的了,t1再次进入了阻塞状态

这就是二进制信号量的特点,它是用来表示事件是否发生了,而不能表示事件发生的次数

如果需要记录事件发生的次数呢?可以试试提高t1的优先级

不过VxWorks专门提供了用于计数的信号量: 计数信号量

vxworks中Task如何计数信号量

semCCreate()用来动态创建计数信号量,semCInit()用来初始化静态分配的信号量

initCount表示计数信号量的初值,因为是有符号整型值,其取值范围是0-2147483647(0x0-0x7fffffff)

vxworks中Task如何计数信号量

而具体的使用,与二进制信号量非常像

vxworks中Task如何计数信号量

semTake()用来申请信号量,信号量无效时,引起阻塞,因此不能在ISR中使用

vxworks中Task如何计数信号量

semGive()用来释放信号量,在任务或ISR中都可以调用

vxworks中Task如何计数信号量

与二进制信号量不同的是,计数信号量的值不是在0和1之间变化,而是用一个count来记录具体数值。而且目前count的值可以超过2147483647(0x7fffffff)

vxworks中Task如何计数信号量

超过之后,semGive()和semTake()还可以正常操作。只是show()操作时,只能看到低31位的值

vxworks中Task如何计数信号量

从源码里可以看到,只有count超过4294967295(0xffffffff)时,才会溢出。看来这应该是VxWorks的一个小bug了

vxworks中Task如何计数信号量

Anyway,实际应用中,count的值不太可能那么大的。还是回到开始位置,把testSemB那个例子改了看看吧

vxworks中Task如何计数信号量

这时候再多次释放信号量,任务(t1)就可以收到多次了

vxworks中Task如何计数信号量

同时,计数信号量也支持semFlush()操作,即它也是可以用于多任务同步的。

最后跑一个静态初始化的例子吧

vxworks中Task如何计数信号量

mySem是在编译时就分配空间了,semCInit()里就不用在动态申请内存了

vxworks中Task如何计数信号量

感谢你能够认真阅读完这篇文章,希望小编分享的“vxworks中Task如何计数信号量”这篇文章对大家有帮助,同时也希望大家多多支持创新互联,关注创新互联行业资讯频道,更多相关知识等着你来学习!


本文标题:vxworks中Task如何计数信号量
网页链接:http://ybzwz.com/article/jesodi.html