freertos互斥锁的定义
时间: 2023-08-24 17:06:01 浏览: 144
STM32F407实现FreeRTOS互斥信号量操作【支持STM32F40X系列单片机】
FreeRTOS中的互斥锁是一种用于保护共享资源的同步机制。它是一个二进制信号量,只有一个任务可以获得该锁,其他任务必须等待锁被释放后才能获得它。在使用互斥锁时,需要在访问共享资源之前获取锁,在访问完成后释放锁,以保证共享资源的正确性和一致性。
互斥锁的定义如下:
```c
typedef struct xSTATIC_MUTEX
{
volatile UBaseType_t uxDummy1;
UBaseType_t uxDummy2;
volatile List_t xTasksWaitingToAcquire;
volatile List_t xTasksWaitingToRelease;
volatile BaseType_t xMutexHolder;
volatile UBaseType_t uxRecursiveCallCount;
volatile BaseType_t xMutexIsRecursive;
#if ( configUSE_TRACE_FACILITY == 1 )
UBaseType_t uxDummy3;
char pcMutexHolderName[ configMAX_TASK_NAME_LEN ];
#endif
#if ( configUSE_MUTEXES == 2 )
volatile UBaseType_t uxPriority;
#endif
} xSTATIC_MUTEX;
typedef xSTATIC_MUTEX *StaticSemaphore_t;
typedef struct xMUTEX
{
UBaseType_t uxDummy1;
UBaseType_t uxDummy2;
List_t xTasksWaitingToAcquire;
List_t xTasksWaitingToRelease;
BaseType_t xMutexHolder;
UBaseType_t uxRecursiveCallCount;
BaseType_t xMutexIsRecursive;
#if ( configUSE_TRACE_FACILITY == 1 )
UBaseType_t uxDummy3;
char pcMutexHolderName[ configMAX_TASK_NAME_LEN ];
#endif
#if ( configUSE_MUTEXES == 2 )
UBaseType_t uxPriority;
#endif
} xSemaphore, *SemaphoreHandle_t;
```
其中,`xMUTEX`是动态分配的互斥锁结构体,`xSTATIC_MUTEX`是静态分配的互斥锁结构体。两者的成员变量含义相同,包括:
- `uxDummy1`和`uxDummy2`:占位符,使结构体大小与内存对齐要求一致。
- `xTasksWaitingToAcquire`:等待获取锁的任务列表。
- `xTasksWaitingToRelease`:等待释放锁的任务列表。
- `xMutexHolder`:持有锁的任务句柄,如果锁未被持有,则为`NULL`。
- `uxRecursiveCallCount`:递归调用计数,记录当前任务反复获取锁的次数。
- `xMutexIsRecursive`:是否是可重入锁的标志。
- `uxPriority`(可选):互斥锁的优先级,用于与任务的优先级进行比较,以决定哪个任务可以获得锁。
- `pcMutexHolderName`(可选):持有锁的任务名称,用于调试和跟踪。
FreeRTOS中的互斥锁使用`SemaphoreHandle_t`类型的句柄来表示,可以通过xSemaphoreCreateMutex()等API函数创建和初始化互斥锁。
阅读全文