文章目录
前言
互斥信号量其实就是一个拥有优先级继承的二值信号量,在同步的应用中(任务与任务或中
断与任务之间的同步)二值信号量最适合。互斥信号量适合用于那些需要互斥访问的应用中。在
互斥访问中互斥信号量相当于一个钥匙,当任务想要使用资源的时候就必须先获得这个钥匙,
当使用完资源以后就必须归还这个钥匙,这样其他的任务就可以拿着这个钥匙去使用资源。
优先级继承并不能完全的消除优先级翻转,它只是尽可能的降低优先级翻转带来的影响。
注意:
互斥信号量不能用于中断服务函数中:
1.互斥信号量有优先级继承的机制,所以只能用在任务中,不能用于中断服务函数。
2.中断服务函数中不能因为要等待互斥信号量而设置阻塞时间进入阻塞态。
提示:以下是本篇文章正文内容,下面案例可供参考
一、创建互斥信号量
1、函数 xSemaphoreCreateMutex()
此函数用于创建一个互斥信号量,所需要的内存通过动态内存管理方法分配。
SemaphoreHandle_t xSemaphoreCreateMutex( void )
返回值:
NULL:
其他值:
互斥信号量创建失败。
创建成功的互斥信号量的句柄。
二、释放互斥信号量
xSemaphoreGive() 任务级信号量释放函数
xQueueGiveFromISR()。中断级信号量释放函数
三、获取互斥信号量
xSemaphoreTake() 任务级获取信号量函数
xSemaphoreTakeFromISR() 中断级获取信号量函数
四、互斥信号量实验
把所有二值信号量的地方改成互斥信号量。
五、递归互斥信号量
递归互斥信号量可以看作是一个特殊的互斥信号量,已经获取了互斥信号量的任务就不能
再次获取这个互斥信号量,但是递归互斥信号量不同,已经获取了递归互斥信号量的任务可再次获取这个递归互斥信号量,而且次数不限!一个任务使用函数 xSemaphoreTakeRecursive()成功的获取了多少次递归互斥信号量就得使用函数 xSemaphoreGiveRecursive()释放多少次!比如某个任务成功的获取了 5 次递归信号量,那么这个任务也得同样的释放 5 次递归信号量。
递归互斥信号量也有优先级继承的机制,所以当任务使用完递归互斥信号量以后一定要记
得释放。同互斥信号量一样,递归互斥信号量不能用在中断服务函数中。
1、创建递归互斥信号量
1、函数 xSemaphoreCreateRecursiveMutex()
此函数用于创建一个递归互斥信号量,所需要的内存通过动态内存管理方法分配。
SemaphoreHandle_t xSemaphoreCreateRecursiveMutex( void )
返回值:
NULL: 互斥信号量创建失败。
其他值: 创建成功的互斥信号量的句柄。
2、释放递归互斥信号量
递归互斥信号量有专用的释放函数:xSemaphoreGiveRecursive()
BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) //函数(任务句柄)
3、获取递归互斥信号量*
递归互斥信号量的获取使用函数 xSemaphoreTakeRecursive()
BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, //要获取的信号量
TickType_t xTicksToWait )//阻塞时间
总结
互斥信号量:
(1)、调用函数 xSemaphoreCreateMutex()创建互斥信号量 MutexSemaphore。
(2)、任务 high_task 获取互斥信号量。
(3)、互斥信号量使用完成以后一定要释放!
(4)、任务 low_task 获取互斥信号量 MutexSemaphore,阻塞时间为 portMAX_DELAY。
(5)、模拟任务 low_task 长时间占用互斥信号量 portMAX_DELAY。
(6)、任务 low_task 使用完互斥信号量,释放!
递归互斥信号量:
递归互斥量使用方法也是如此,在使用递归互斥信号量时,获取了几次就要释放几次,要特别注意!
细节!!!!