前情提要
FreeRTOS ~(四)同步互斥与通信 ~ (2/3)互斥的缺陷
FreeRTOS ~(五)队列的常规使用 ~ (2/5)队列解决互斥缺陷
FreeRTOS ~(六)信号量 ~ (2/3)信号量解决互斥缺陷
举例子说明:利用互斥量解决前述的"互斥的缺陷"问题
/*-----------------------------------------------------------*/
static SemaphoreHandle_t xSemUART; /* 二值信号量的句柄/互斥量的句柄 */void TaskGenericFunction(void * param)
{while (1){/* 将二值信号量/互斥量置0,关闭串口使用权,防止被Tick中断的时候,任务切换后,其他任务使用串口 */xSemaphoreTake(xSemUART, portMAX_DELAY);printf("%s\r\n", (char *)param);/* 将二值信号量置1/互斥量,激活串口使用权 */xSemaphoreGive(xSemUART);/* 每个Task使用完就将自己阻塞掉,否则自己就将一直独占串口使用权详细的解释在 "FreeRTOS ~(五)队列的常规使用 ~ (2/5)队列解决互斥缺陷"中有写. */vTaskDelay(1);}
}
/*-----------------------------------------------------------*/
int main( void )
{prvSetupHardware();#if 0/* 创建二值信号量 */xSemUART = xSemaphoreCreateBinary();/* 将二值信号量置1,激活串口使用权 */xSemaphoreGive(xSemUART);#else/* 创建互斥量 */xSemUART = xSemaphoreCreateMutex();#endifxTaskCreate(TaskGenericFunction, "Task3", 100, "Task 3 is running", 1, NULL);xTaskCreate(TaskGenericFunction, "Task4", 100, "Task 4 is running", 1, NULL);vTaskStartScheduler();return 0;
}
从上述代码就可以明确的知道:
互斥量就是特殊的二值信号量,除了创建时调用的API不同之外,take和give使用的都是信号量的函数;
对于这种常规使用,互斥量简化了一步,创建二值信号量之后,要先give一次;
而对于互斥量而言,这个give是在创建互斥量 xSemaphoreCreateMutex 这个函数内部就操作了的.
互斥量还有其他的用法,详见后续.