前情提要
FreeRTOS ~(四)同步互斥与通信 ~ (2/3)互斥的缺陷
FreeRTOS ~(五)队列的常规使用 ~ (2/5)队列解决互斥缺陷
举例子说明:利用信号量解决前述的"互斥的缺陷"问题
/*-----------------------------------------------------------*/
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();
/* 创建二值信号量 */
xSemUART = xSemaphoreCreateBinary();
/* 将二值信号量置1,激活串口使用权 */
xSemaphoreGive(xSemUART);
xTaskCreate(TaskGenericFunction, "Task3", 100, "Task 3 is running", 1, NULL);
xTaskCreate(TaskGenericFunction, "Task4", 100, "Task 4 is running", 1, NULL);
vTaskStartScheduler();
return 0;
}