C语言 Freertos的递归锁详解
什么是递归锁
递归锁是一种特殊的互斥锁,允许同一个线程在获得锁之后,可以多次加锁,直到释放所有锁。一般的互斥锁不允许同一个线程重复加锁,否则会导致死锁。
Freertos的递归锁
Freertos是一款基于RTOS(Real-Time Operating System)的实时操作系统,在多线程的环境下,用递归锁实现同步非常方便。
在Freertos中,递归锁使用信号量的方式实现,也就是说,递归锁其实就是一个mutex(互斥锁),允许同一个线程在获得mutex之后,可以多次加锁,直到释放所有锁。
当SemaphoreHandle_t对象作为递归互斥体使用时,必须使用xSemaphoreCreateRecursiveMutex()或xSemaphoreCreateRecursiveMutexStatic( )使其创建。 xSemaphoreCreateRecursiveMutex()创建一个动态递归互斥体,而xSemaphoreCreateRecursiveMutexStatic()创建一个静态递归互斥体。
在使用递归锁时,可以使用以下API:
xSemaphoreCreateRecursiveMutex()
xSemaphoreCreateRecursiveMutexStatic()
xSemaphoreTakeRecursive()
xSemaphoreGiveRecursive()
递归锁示例说明
下面通过两个示例,展示递归锁的使用方法。
示例1:检测当前是否是递归锁持有者
void recusive_task(void *pvParameters)
{
static SemaphoreHandle_t xRecursiveMutex;
xRecursiveMutex = xSemaphoreCreateRecursiveMutex();
xSemaphoreTakeRecursive(xRecursiveMutex, portMAX_DELAY);
if (xSemaphoreGetMutexHolder(xRecursiveMutex) == xTaskGetCurrentTaskHandle())
{
printf("Current Task is Recursive Mutex Holder\n");
}
xSemaphoreGiveRecursive(xRecursiveMutex);
vTaskDelete(NULL);
}
在xRecursiveMutex上对xSemaphoreTakeRecursive()调用成功的任务可以调用xSemaphoreGetMutexHolder()API来确定当前是否是递归锁持有者,以上的示例在确认当前占有递归锁后打印一条消息。
示例2:递归锁的嵌套
void recusive_task(void *pvParameters)
{
static SemaphoreHandle_t xRecursiveMutex;
xRecursiveMutex = xSemaphoreCreateRecursiveMutex();
xSemaphoreTakeRecursive(xRecursiveMutex, portMAX_DELAY);
printf("Acquire Recursive Mutex\n");
xSemaphoreTakeRecursive(xRecursiveMutex, portMAX_DELAY);
printf("Acquire Recursive Mutex again\n");
xSemaphoreGiveRecursive(xRecursiveMutex);
printf("Recursive Mutex release once.\n");
xSemaphoreGiveRecursive(xRecursiveMutex);
printf("Recursive Mutex release once.\n");
vTaskDelete(NULL);
}
在xRecursiveMutex上对xSemaphoreTakeRecursive()调用成功后,可以多次对xRecursiveMutex使用xSemaphoreTakeRecursive() API加锁,最终,必须对xRecursiveMutex使用等效次数的xSemaphoreGiveRecursive() API解锁,以上的示例展示了如何嵌套使用递归锁。
总结
递归锁是一种允许同一线程在获得锁之后,可以多次加锁,直到释放所有锁的锁。在多线程环境下,递归锁可以方便地保护共享资源。在Freertos中,递归锁使用信号量的方式实现,通过xSemaphoreCreateRecursiveMutex()或xSemaphoreCreateRecursiveMutexStatic()创建一个递归互斥体,可以使用xSemaphoreTakeRecursive()和xSemaphoreGiveRecursive() API锁住和释放锁。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言 Freertos的递归锁详解 - Python技术站