温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

vxworks中Task如何计数信号量

发布时间:2021-12-22 10:34:57 来源:亿速云 阅读:223 作者:小新 栏目:互联网科技

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

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

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如何计数信号量”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI