文章目录
一、什么是同步互斥
同步即按照顺序一个完成,另一个才能继续。
代码举例:
两个任务交替执行,但是
Task2
在等待flagCalcEnd
为1时候一直在while(1)浪费时间。
c
void Task1Function(void * param)
{
volatile int i = 0;
while (1)
{
for (i = 0; i < 10000000; i++)
sum++;
//printf("1");
flagCalcEnd = 1;
vTaskDelete(NULL);
}
}
void Task2Function(void * param)
{
while (1)
{
if (flagCalcEnd)
printf("sum = %d\r\n", sum);
}
}
所以
Task2
在flagCalcEnd为1前应该处于Block状态,节约资源。
互斥即两个任务不能同时进行。
代码举例:
c
void TaskGenericFunction(void * param)
{
while (1)
{
printf("%s\r\n", (char *)param);
}
}
}
//任务调用伪代码
xTaskCreate(TaskGenericFunction, "Task3", 100, "Task 3 is running", 1, NULL);
xTaskCreate(TaskGenericFunction, "Task4", 100, "Task 4 is running", 1, NULL);
在串口信息中,
Task3
和Task4
信息参杂在一起,不能互斥独占串口。解决办法:添加一个标志位只能让一个任务同时使用串口。
代码如下:
c
void TaskGenericFunction(void * param)//通用
{
while (1)
{
if (!flagUARTused)
{
flagUARTused = 1;
printf("%s\r\n", (char *)param);
flagUARTused = 0;
vTaskDelay(1);//避免同一个任务重复执行
}
}
}
二、FreeRTOS解决同步互斥
以上虽然方法虽然能解决同步互斥问题,但均有缺陷。
- 正确性
- 效率:等待者要进入阻塞状态
FreeRTOS给出了解决方案,我们后续介绍: