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()函数。
  • 互斥量和递归互斥量的获取和释放必须在同一任务中进行,确保资源的有效管理。
🏷️

标签

➡️

继续阅读