以下是信号量互斥量的结构体图示,延续消息队列的机制
信号量分为:
二值信号量:通常用于对共享资源的访问,初始值为1或者0,获取有可能需要等待,但是释放不可能等待,因为资源在你手中,这一点跟队列不一样,可以理解为信号量是一个物品,只能一个任拿着,只能由拿着的人释放,队列是一个存放物品的空间,谁都可以去拿东西,谁都可以去放东西。
计数信号量:
互斥信号量:
一 二值信号量与互斥量的区别
FreeRTOS中的二值信号量和互斥量虽然功能相似,但存在一些关键区别。
定义和功能
- 二值信号量:主要用于任务同步和互斥访问。它只有两个状态:信号量被占用和信号量未被占用。二值信号量没有优先级继承机制,适用于同步任务或中断。
- 互斥量:也称为互斥信号量,主要用于互斥访问共享资源。互斥量的初始值为1,表示资源可用。互斥量具有优先级继承机制,适用于需要保护共享资源的场景,确保同一时间只有一个任务可以访问该资源。
使用场景
- 二值信号量:适用于任务与任务之间或任务与中断之间的同步。由于没有优先级继承,二值信号量更适合用于简单的同步场景。
- 互斥量:适用于需要保护共享资源的场景,确保同一时间只有一个任务可以访问该资源。互斥量的优先级继承机制可以防止优先级反转问题,适用于需要高可靠性的资源访问控制。
创建和操作方法
- 二值信号量:可以通过
xSemaphoreCreateBinary()
或xSemaphoreCreateBinaryStatic()
函数创建。操作函数包括xSemaphoreGive()
和xSemaphoreGiveFromISR()
用于释放信号量。 - 互斥量:通过
xQueueCreateMutex()
函数创建。操作函数包括xSemaphoreTakeMutex()
和xSemaphoreGiveMutex()
用于获取和释放互斥量。
二 信号量的释放函数
信号量在中断中的释放函数为
xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken )
在中断宏用的时候需要切换需要在末尾添加
portYIELD_FROM_ISR(pxHigherPriorityTaskWoken);