22 freertos信号量
二十二、freertos信号量
一、信号量
1. 二值信号量:只有两种状态,有或无。
2. 计数信号量:释放一个信号量时,信号量计数值加1。处理一个信号量时,信号量计数值减1。
3. 互斥信号量:是特殊的二值信号量,只能被一个任务访问,其他任务因无法获取信号量而进入阻塞。
4. 递归信号量:对于已经获取信号量的任务,可以重复获取信号量。
使用如下 18 个函数可以实现 FreeRTOS 的信号量(含计数信号量,二值信号量和互斥信号):
- xSemaphoreCreateBinary()
- xSemaphoreCreateBinaryStatic()
- vSemaphoreCreateBinary()
- xSemaphoreCreateCounting()
- xSemaphoreCreateCountingStatic()
- xSemaphoreCreateMutex()
- xSemaphoreCreateMutexStatic()
- xSemaphoreCreateRecursiveMutex()
- xSemaphoreCreateRecursiveMutexStatic()
- vSemaphoreDelete()
- xSemaphoreGetMutexHolder()
- uxSemaphoreGetCount()
- xSemaphoreTake()
- xSemaphoreTakeFromISR()
- xSemaphoreTakeRecursive()
- xSemaphoreGive()
- xSemaphoreGiveRecursive()
- 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信号量相关推荐
- FreeRTOS信号量---二值信号量
信号量可以用来进行资源管理和任务同步,FreeRTOS中信号量又分为二值信号量.计算型信号量.互斥信号量和递归互斥信号量. 0x01 二值信号量 二值信号量其实就是一个只有一个队列项的队列,这个特殊的 ...
- FreeRTOS系列第19篇---FreeRTOS信号量
来自:http://blog.csdn.net/zhzht19861011/article/details/50835613 本文介绍信号量的基础知识,详细源码分析见<FreeRTOS高级篇6- ...
- FreeRTOS信号量
信号量是操作系统中重要的一部分,信号量一般用来进行资源管理和任务同步, FreeRTOS中信号量又分为二值信号量. 计数型信号量.互斥信号量和递归互斥信号量.不同的信号量其应用场景不同,但有些应用 ...
- FreeRTOS记录(七、FreeRTOS信号量、事件标志组、邮箱和消息队列、任务通知的关系)
我们在前面单独介绍过FreeRTOS的任务通知和消息队列, 但是在FreeRTOS中任务间的通讯还有信号量,邮箱,事件组标志等可以使用 这篇文章就这些成员与消息队列和任务通知的关系进行说明分析 ..增 ...
- FreeRTOS信号量详解第三讲(全网最全)——计数信号量
一.计数型信号量简介 有些资料中也将计数型信号量叫做数值信号量,二值信号量相当于长度为1的队列,那么计数型信号量就是长度大于1的队列.**同二值信号量一样,用户不需要关心队列中存储了什么数据,只需要关 ...
- 【嵌入式操作系统】FreeRTOS信号量mutex和semaphore的区别
今天学习信号量mutex和semaphore的区别,找到了正点原子的博客介绍,讲的挺详细的.建议大家阅读 转载自:https://blog.csdn.net/nippon1218/article/de ...
- FreeRTOS信号量详解第二讲(全网最全)——二值信号量
一.二值信号量简介 二值信号量通常用于互斥访问或同步,二值信号量和互斥信号量非常类似,但是还是有一些细微的差别,互斥信号量拥有优先级继承机制,二值信号量没有优先级继承.因此二值信号另更适合用于同步(任 ...
- FreeRTOS信号量 基于STM32
目录 概述 一.信号量基本概念 1.二值信号量 2.计数信号量 3.互斥信号量 4.递归信号量 二.二值信号量运作机制 三. 计数信号量运作机制 四.常用信号量函数接口讲解 1.创建二值信号量 xSe ...
- FreeRTOS信号量详解第四讲(全网最全)——互斥信号量
一.互斥信号量简介 互斥信号量其实就是一个拥有优先级继承的二值信号量,在同步的应用中(任务与任务或中断与任务之间的同步)二值信号量最适合.互斥信号量适合用于那些需要互斥访问的应用中.在互斥访问中互斥信 ...
最新文章
- python安装选项_python设置执行选项参数
- cdn托管html资源,七牛自定义域名cdn加速,静态资源托管至对象存储
- 040_Unicode对照表六
- 【SPOJ - DQUERY】D-query(权值树状数组 或 主席树 或 莫队)
- 从事python需要掌握哪些知识和技能_零基础想转行从事Python?需要掌握如下技能...
- OracleDBA之数据库管理
- finally块的return语句会覆盖其他语句的return
- JsonCpp常见用法
- React服务端渲染Next.js 8发布,新增无服务器功能
- 免费的MySQL数据库
- Excel表格转换为MarkDown表格工具
- java 最小公倍数_java中如何计算最小公倍数
- 多模块,Maven无法下载依赖,仓库查看有这个版本但是无法下载,点reload也没用
- 基于MTCNN和FaceNet的实时人脸检测识别系统
- telnet无法打开到主机的连接。 在端口 23: 连接失败
- 【沃顿商学院学习笔记】商业分析——Customer Analytics:05 营销中的新兴数据集:营销科学的未来 EMERGING DATA SETS IN MARKETING
- Error: This old version of 'S8051.DLL' is incompatibl 解决办法
- spring in action 学习笔记五:@Autowired这个注解如何理解
- 笔记本电脑设备管理器中'符合USBxHCI的主机控制器'出现感叹号,所有的USB接口失灵--解决
- React教程(五)——生命周期函数