目录
1. 创建
2. 获取
3. 释放
4. 测试
FreeRTOS不支持调度方式的设置,所以下面2个宏定义可以随意设置值。
#define RTOS_IPC_FLAG_FIFO 0x00
#define RTOS_IPC_FLAG_PRIO 0x01
互斥量对应的句柄定义:
#define rtosMutex_t SemaphoreHandle_t
1. 创建
#define rtosMutexCreate( \
handle, /*Mutex Handle*/ \
name, /*Mutex Name*/ \
flag \
) \
{ \
handle = xSemaphoreCreateMutex(); \
}
其中参数name,flag无意义。
2. 获取
#define rtosMutexTake( \
handle, \
time, \
ret \
) \
{ \
ret = xSemaphoreTake(handle, time); \
}
3. 释放
#define rtosMutexRelease( \
handle \
) \
{ \
xSemaphoreGive(handle); \
}
4. 测试
之前的测试RT Thread的代码会和RT Thread不同,分析大概原因。
任务1获取到Mutex后没有释放Mutex就进入Sleep了,而任务2运行后尝试获取Mutex失败,系统重新调度,任务1等待Sleep结束后继续运行,释放Mutex后又开始获取Mutex,这时FreeRTOS和RT Thread不同的地方是FreeRTOS还是任务1获取Mutex,即按照优先级获取,而RT Thread则是按照申请时间的优先级调度。所以要实现相同的效果,则需要把任务1的释放Mutex放在Sleep之前。
static void threadMutexShow(void *parameter)
{
while(1)
{
uint32_t ret;
rtosMutexTake(mutex, RTOS_WAIT_FOREVER, ret);
Printf("Mutex Value = %c\n", gMutexValue);
rtosMutexRelease(mutex);
rtosThreadSleep(100);
}
}