互斥量是一种特殊的二值信号量,拥有优先级继承的机制,所以适合用在临界资源互斥访问。
5.1创建互斥量xSemaphoreCreateMutex()
5.1.1函数原型
5.1.2函数框架
5.2创建递归互斥量xSemaphoreCreateRecursiveMutex()
5.2.1函数原型
5.2.2函数框架
xSemaphoreCreateRecursiveMutex()
实际调用的函数就是
xQueueCreateMutex()
函数。
5.3删除互斥量vSemaphoreDelete()
5.3.1函数原型
直接调用信号量的删除函数,删除互斥量。
5.3.2函数框架
。。。
5.4获取互斥量xSemaphoreTake()
5.4.1函数原型
5.4.2函数框架
相较于信号量的获取函数,添加了优先级继承的机制。
5.5获取递归互斥量xSemaphoreTakeRecursive()
5.5.1函数原型
5.5.2函数框架
5.6释放互斥量xSemaphoreGive()
5.6.1函数原型
5.6.2函数框架
因为互斥量的优先级继承机制,暂时改变了任务的优先级,在释放互斥量时要恢复成原来的优先级。互斥量释放函数与信号量的释放函数唯一的不同:在prvCopyDataToQueue函数中,判断了如果队列是互斥量,调用了xTaskPriorityDisinherit函数恢复任务的优先级。
5.7释放递归互斥量xSemaphoreGiveRecursive()
5.7.1函数原型
5.7.2函数框架
结语:
不能在中断中释放(获取)互斥量的原因(个人总结):在中断中释放(获取)互斥量没有意义,从源码中可以看出互斥量相较于信号量,多了优先级继承机制,这个机制是对于任务而言的,对于中断来说没有意义,不可能用互斥量的这个机制去改变中断的优先级。所以,在中断中释放(获取)互斥量没有意义,直接释放(获取)信号量即可。