FreeRTOS源码阅读笔记5--mutex

互斥量是一种特殊的二值信号量,拥有优先级继承的机制,所以适合用在临界资源互斥访问。

5.1创建互斥量xSemaphoreCreateMutex()

5.1.1函数原型

5.1.2函数框架

FreeRTOS源码阅读笔记5--mutex_第1张图片

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函数框架

相较于信号量的获取函数,添加了优先级继承的机制。

FreeRTOS源码阅读笔记5--mutex_第2张图片

5.5获取递归互斥量xSemaphoreTakeRecursive()

5.5.1函数原型

5.5.2函数框架

5.6释放互斥量xSemaphoreGive()

5.6.1函数原型

FreeRTOS源码阅读笔记5--mutex_第3张图片

5.6.2函数框架

因为互斥量的优先级继承机制,暂时改变了任务的优先级,在释放互斥量时要恢复成原来的优先级。互斥量释放函数与信号量的释放函数唯一的不同:在prvCopyDataToQueue函数中,判断了如果队列是互斥量,调用了xTaskPriorityDisinherit函数恢复任务的优先级。

FreeRTOS源码阅读笔记5--mutex_第4张图片

5.7释放递归互斥量xSemaphoreGiveRecursive()

5.7.1函数原型

5.7.2函数框架
FreeRTOS源码阅读笔记5--mutex_第5张图片

结语:

不能在中断中释放(获取)互斥量的原因(个人总结):在中断中释放(获取)互斥量没有意义,从源码中可以看出互斥量相较于信号量,多了优先级继承机制,这个机制是对于任务而言的,对于中断来说没有意义,不可能用互斥量的这个机制去改变中断的优先级。所以,在中断中释放(获取)互斥量没有意义,直接释放(获取)信号量即可。

你可能感兴趣的:(笔记)