二十二、freertos信号量

一、信号量
1. 二值信号量:只有两种状态,有或无。
2. 计数信号量:释放一个信号量时,信号量计数值加1。处理一个信号量时,信号量计数值减1。
3. 互斥信号量:是特殊的二值信号量,只能被一个任务访问,其他任务因无法获取信号量而进入阻塞。
4. 递归信号量:对于已经获取信号量的任务,可以重复获取信号量。

使用如下 18 个函数可以实现 FreeRTOS 的信号量(含计数信号量,二值信号量和互斥信号):

  1. xSemaphoreCreateBinary()
  2. xSemaphoreCreateBinaryStatic()
  3. vSemaphoreCreateBinary()
  4. xSemaphoreCreateCounting()
  5. xSemaphoreCreateCountingStatic()
  6. xSemaphoreCreateMutex()
  7. xSemaphoreCreateMutexStatic()
  8. xSemaphoreCreateRecursiveMutex()
  9. xSemaphoreCreateRecursiveMutexStatic()
  10. vSemaphoreDelete()
  11. xSemaphoreGetMutexHolder()
  12. uxSemaphoreGetCount()
  13. xSemaphoreTake()
  14. xSemaphoreTakeFromISR()
  15. xSemaphoreTakeRecursive()
  16. xSemaphoreGive()
  17. xSemaphoreGiveRecursive()
  18. xSemaphoreGiveFromISR()

二、常用信号量函数接口
1. 创建二值信号量 xSemaphoreCreateBinary()

函数原型:xSemaphoreCreateBinary()
此函数是基于消息队列函数 xQueueGenericCreate 实现的.

#define xSemaphoreCreateBinary()xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH,ueueQUEUE_TYPE_BINARY_SEMAPHORE )

必须在 FreeRTOSConfig.h 中把宏 configSUPPORT_DYNAMIC_ALLOCATION 定义为 1。

2. 创建计数信号量 xSemaphoreCreateCounting()

必须在 FreeRTOSConfig.h 中把宏 configSUPPORT_DYNAMIC_ALLOCATION 定义为 1。

函 数 原 型:
SemaphoreHandle_t   xSemaphoreCreateCounting( UBaseType_t uxMaxCount,UBaseType_t uxInitialCount);

功 能 :创建一个计数信号量。
参 数 :
–uxMaxCount 计数信号量的最大值, 当达到这个值的时候,信号量不能再被释放。
–uxInitialCount 创建计数信号量的初始值。
返 回 值:成功则返回一个计数信号量句柄,不成功则返回 NULL。

3. 信号量删除函数 vSemaphoreDelete()

 函 数 原 型: void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );功 能   :    删除一个信号量。参 数 :    xSemaphore 信号量句柄。返 回 值:  无。

4. 信号量释放函数

1). xSemaphoreGive()(任务)
此函数是基于消息队列函数 xQueueGenericSend 实现的。
xSemaphoreGive()是一个用于释放信号量的宏, 可以用于二值信号量、 计数信号量、 互斥量的释放,但不能释放由函数xSemaphoreCreateRecursiveMutex()创建的递归互斥量。

函 数 原 型: xSemaphoreGive( xSemaphore )
功 能 :    释放信号量。
参 数 :    xSemaphore 信号量句柄。
返 回 值: pdPASS 创建成功,不成功则返回  err_QUEUE_FULL 。

2). xSemaphoreGiveFromISR()(中断)
xSemaphoreGiveFromISR用于在中断中释放信号量,它不能释放互斥量,这是因为互斥量不可以在中断中使用。
带中断保护的信号量释放其实也是一个宏,真正调用的函数是 消息队列xQueueGiveFromISR ()。

函 数 原 型:xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken )
功 能 :     用于中断服务程序中释放信号量。
参 数 : --第 1 个参数是信号量句柄。--第 2 个参数用于保存是否有高优先级任务准备就绪,如果函数执行完毕后,此参数的数值是 pdTRUE,说明有高优先级任务要执行,否则没有。
返 回 值: 信号量释放成功返回 pdTRUE,否则返回 errQUEUE_FULL。

5. 信号量获取函数

1). xSemaphoreTake()(任务)
xSemaphoreTake()函数用于获取信号量,获取的信号量对象可以是二值信号量、计数信号量和互斥量,但是不可以获取递归互斥量. 其实获取信号量是一个宏,真正调用的函数是 xQueueGenericReceive ()。

函 数 原 型:
#define xSemaphoreTake( xSemaphore, xBlockTime )xQueueGenericReceive( ( QueueHandle_t ) ( xSemaphore ),NULL,( xBlockTime ),pdFALSE )
功 能 : 获取一个信号量, 可以是二值信号量、 计数信号量、互斥量。
参 数 :
--xSemaphore 信号量句柄。--xBlockTime 等待信号量可用的最大超时时间,单位为 tick(即系统节拍周期) 。
如果宏 INCLUDE_vTaskSuspend 定义为 1 且形参 xTicksToWait 设置为portMAX_DELAY , 则任务将一直阻塞在该信号量上。
返 回 值: 获取成功则返回 pdTRUE ,没有获取成功则返回errQUEUE_EMPTY。

2). xSemaphoreTakeFromISR()(中断)
与 xSemaphoreTake()函数不同,它不能用于获取互斥量,因为互斥量不可以在中断中使用。

函 数 原 型:
xSemaphoreTakeFromISR(SemaphoreHandle_t xSemaphore,signed BaseType_t *pxHigherPriorityTaskWoken)功 能 :在中断中获一个信号量(其实很少在中断中获取信号量) 。可以是二值信号量、计数信号量。参 数 : --xSemaphore 信号量句柄。--pxHigherPriorityTaskWoken 用于保存是否有高优先级任务准备就绪,为 pdTRUE中断退出前执行一次上下文切换返 回 值:获取成功则返回 pdTRUE, 没有获取成功则返回 errQUEUE_EMPTY 。

22 freertos信号量相关推荐

  1. FreeRTOS信号量---二值信号量

    信号量可以用来进行资源管理和任务同步,FreeRTOS中信号量又分为二值信号量.计算型信号量.互斥信号量和递归互斥信号量. 0x01 二值信号量 二值信号量其实就是一个只有一个队列项的队列,这个特殊的 ...

  2. FreeRTOS系列第19篇---FreeRTOS信号量

    来自:http://blog.csdn.net/zhzht19861011/article/details/50835613 本文介绍信号量的基础知识,详细源码分析见<FreeRTOS高级篇6- ...

  3. FreeRTOS信号量

      信号量是操作系统中重要的一部分,信号量一般用来进行资源管理和任务同步, FreeRTOS中信号量又分为二值信号量. 计数型信号量.互斥信号量和递归互斥信号量.不同的信号量其应用场景不同,但有些应用 ...

  4. FreeRTOS记录(七、FreeRTOS信号量、事件标志组、邮箱和消息队列、任务通知的关系)

    我们在前面单独介绍过FreeRTOS的任务通知和消息队列, 但是在FreeRTOS中任务间的通讯还有信号量,邮箱,事件组标志等可以使用 这篇文章就这些成员与消息队列和任务通知的关系进行说明分析 ..增 ...

  5. FreeRTOS信号量详解第三讲(全网最全)——计数信号量

    一.计数型信号量简介 有些资料中也将计数型信号量叫做数值信号量,二值信号量相当于长度为1的队列,那么计数型信号量就是长度大于1的队列.**同二值信号量一样,用户不需要关心队列中存储了什么数据,只需要关 ...

  6. 【嵌入式操作系统】FreeRTOS信号量mutex和semaphore的区别

    今天学习信号量mutex和semaphore的区别,找到了正点原子的博客介绍,讲的挺详细的.建议大家阅读 转载自:https://blog.csdn.net/nippon1218/article/de ...

  7. FreeRTOS信号量详解第二讲(全网最全)——二值信号量

    一.二值信号量简介 二值信号量通常用于互斥访问或同步,二值信号量和互斥信号量非常类似,但是还是有一些细微的差别,互斥信号量拥有优先级继承机制,二值信号量没有优先级继承.因此二值信号另更适合用于同步(任 ...

  8. FreeRTOS信号量 基于STM32

    目录 概述 一.信号量基本概念 1.二值信号量 2.计数信号量 3.互斥信号量 4.递归信号量 二.二值信号量运作机制 三. 计数信号量运作机制 四.常用信号量函数接口讲解 1.创建二值信号量 xSe ...

  9. FreeRTOS信号量详解第四讲(全网最全)——互斥信号量

    一.互斥信号量简介 互斥信号量其实就是一个拥有优先级继承的二值信号量,在同步的应用中(任务与任务或中断与任务之间的同步)二值信号量最适合.互斥信号量适合用于那些需要互斥访问的应用中.在互斥访问中互斥信 ...

最新文章

  1. python安装选项_python设置执行选项参数
  2. cdn托管html资源,七牛自定义域名cdn加速,静态资源托管至对象存储
  3. 040_Unicode对照表六
  4. 【SPOJ - DQUERY】D-query(权值树状数组 或 主席树 或 莫队)
  5. 从事python需要掌握哪些知识和技能_零基础想转行从事Python?需要掌握如下技能...
  6. OracleDBA之数据库管理
  7. finally块的return语句会覆盖其他语句的return
  8. JsonCpp常见用法
  9. React服务端渲染Next.js 8发布,新增无服务器功能
  10. 免费的MySQL数据库
  11. Excel表格转换为MarkDown表格工具
  12. java 最小公倍数_java中如何计算最小公倍数
  13. 多模块,Maven无法下载依赖,仓库查看有这个版本但是无法下载,点reload也没用
  14. 基于MTCNN和FaceNet的实时人脸检测识别系统
  15. telnet无法打开到主机的连接。 在端口 23: 连接失败
  16. 【沃顿商学院学习笔记】商业分析——Customer Analytics:05 营销中的新兴数据集:营销科学的未来 EMERGING DATA SETS IN MARKETING
  17. Error: This old version of 'S8051.DLL' is incompatibl 解决办法
  18. spring in action 学习笔记五:@Autowired这个注解如何理解
  19. 笔记本电脑设备管理器中'符合USBxHCI的主机控制器'出现感叹号,所有的USB接口失灵--解决
  20. React教程(五)——生命周期函数

热门文章

  1. Java代码模拟Redis
  2. 微信小程序getApp().globalData.user无法获取值
  3. “Beyond Compare 许可证密钥被撤销” 的解决办法
  4. 软件工程2(面向对象软件工程)复习
  5. angular 行内引入背景图片
  6. 使用Python进行英文单词分割
  7. ModelBuilder快速提取城市建成区(1)
  8. 在页头区域添加logo图像HTML,如何在表格中嵌入企业logo图片?分享两种方法
  9. 橡皮泥 javascript
  10. 电脑音频转换mp3格式怎么操作