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