同步互斥认识

文章目录


一、什么是同步互斥

同步即按照顺序一个完成,另一个才能继续。

代码举例:

两个任务交替执行,但是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);

在串口信息中,Task3Task4信息参杂在一起,不能互斥独占串口。

解决办法:添加一个标志位只能让一个任务同时使用串口。

代码如下:

c 复制代码
void TaskGenericFunction(void * param)//通用
{
	while (1)
	{
		if (!flagUARTused)
		{
			flagUARTused = 1;
			printf("%s\r\n", (char *)param);
			flagUARTused = 0;
			vTaskDelay(1);//避免同一个任务重复执行
		}
	}
}

二、FreeRTOS解决同步互斥

以上虽然方法虽然能解决同步互斥问题,但均有缺陷。

  • 正确性
  • 效率:等待者要进入阻塞状态

FreeRTOS给出了解决方案,我们后续介绍:


相关推荐
aspirestro三水哥2 天前
6.7RTIPC之XDDP实例分析
rtos·xenomai
切糕师学AI9 天前
NuttX RTOS是什么?
嵌入式·rtos
aspirestro三水哥10 天前
6.4非POSIXskin进程间通信
rtos·xenomai
aspirestro三水哥11 天前
6.2POSIX线程间通信
rtos·xenomai
鸿蒙小白龙12 天前
OpenHarmony轻量系统(Hi3861)RTOS API开发详解
openharmony·rtos·liteos·轻量系统
无聊到发博客的菜鸟21 天前
STM32 手册寄存器属性
stm32·单片机·嵌入式·rtos·寄存器
aspirestro三水哥21 天前
5.3RTDM用户层驱动
rtos·xenomai
无聊到发博客的菜鸟21 天前
STM32 RTC时钟不准的问题
stm32·嵌入式·rtc·rtos
aspirestro三水哥24 天前
4.7POSIX进程与线程实例
rtos·xenomai
无聊到发博客的菜鸟24 天前
使用STM32对SD卡进行性能测试
stm32·单片机·rtos·sd卡·fatfs