FreeRTOS系列第24篇—FreeRTOS信号量分析
💡
原文中文,约12000字,阅读约需29分钟。
📝
内容提要
FreeRTOS的信号量包括二进制信号量、计数信号量、互斥信号量和递归互斥信号量。信号量的API函数都是以宏的方式实现的,使用了现有的队列机制。创建信号量需要包含semphr.h头文件。二进制信号量、计数信号量和互斥量的创建API函数是独立的,但是获取和释放API函数是相同的;递归互斥量的创建、获取和释放API函数是独立的。释放信号量使用xSemaphoreGive()函数,获取信号量使用xSemaphoreTake()函数。递归互斥量可以重复获取和释放。
🎯
关键要点
- FreeRTOS的信号量包括二进制信号量、计数信号量、互斥信号量和递归互斥信号量。
- 信号量的API函数以宏的方式实现,使用现有的队列机制,需包含semphr.h头文件。
- 二进制信号量、计数信号量和互斥量的创建API函数独立,获取和释放API函数相同;递归互斥量的API函数均独立。
- 创建二进制信号量使用xQueueGenericCreate()函数,实际上是创建一个队列。
- 创建计数信号量的API接口有两个参数:最大计数值和初始值,间接使用xQueueGenericCreate()函数。
- 创建互斥量和递归互斥量也使用xQueueGenericCreate()函数,互斥量具有优先级继承机制。
- 释放信号量使用xSemaphoreGive()函数,适用于二进制信号量、计数信号量和互斥量。
- 互斥量的释放过程复杂,涉及优先级继承机制,确保高优先级任务能尽快执行。
- 获取信号量使用xSemaphoreTake()函数,适用于二进制信号量、计数信号量和互斥量。
- 递归互斥量可以重复获取和释放,使用xSemaphoreGiveRecursive()和xSemaphoreTakeRecursive()函数。
- 互斥量和递归互斥量的获取和释放必须在同一任务中进行,确保资源的有效管理。
🏷️
标签
➡️