前面介绍的队列(queue)可以用于传输数据:在任务之间、任务和中断之间。
消息队列用于传输多个数据,但是有时候我们只需要传递状态,这个状态值需要用一个数值表示,比如:
在这种情况下我们只需要维护一个数值,使用信号量效率更高、更节省内存 本章涉及如下内容:
12.1 信号量的特性
12.1.1 信号量的常规操作
信号量这个名字很恰当:
计数型信号量的典型场景是:
二进制信号量跟计数型的唯一差别,就是计数值的最大值被限定为1。
12.1.2 信号量跟队列的对比
差异列表如下:
12.1.3 两种信号量的对比
信号量的计数值都有限制:限定了最大值。如果最大值被限定为1,那么它就是二进制信号量;如果最大值不是1,它就是计数型信号量。
差别列表如下:
12.2 信号量函数
使用信号量时,先创建、然后去添加资源、获得资源。使用句柄来表示一个信号量。
12.2.1 创建
使用信号量之前,要先创建,得到一个句柄;使用信号量时,要使用句柄来表明使用哪个信号量。 对于二进制信号量、计数型信号量,它们的创建函数不一样:
创建二进制信号量的函数原型如下:
创建计数型信号量的函数原型如下:
12.2.2 删除
对于动态创建的信号量,不再需要它们时,可以删除它们以回收内存。

vSemaphoreDelete可以用来删除二进制信号量、计数型信号量,函数原型如下:
12.2.3 give/take
二进制信号量、计数型信号量的give、take操作函数是一样的。这些函数也分为2个版本:给任务使用,给ISR使用。列表如下:
xSemaphoreGive的函数原型如下:
xSemaphoreGive函数的参数与返回值列表如下:
pxHigherPriorityTaskWoken的函数原型如下:
xSemaphoreGiveFromISR函数的参数与返回值列表如下:
xSemaphoreTake的函数原型如下:
xSemaphoreTake函数的参数与返回值列表如下:
xSemaphoreTakeFromISR的函数原型如下:
xSemaphoreTakeFromISR函数的参数与返回值列表如下:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/205087.html