前情提要
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();
#endif
xTaskCreate(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 这个函数内部就操作了的.
互斥量还有其他的用法,详见后续.