同步互斥认识

文章目录


一、什么是同步互斥

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

代码举例:

两个任务交替执行,但是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给出了解决方案,我们后续介绍:


相关推荐
橘色的喵5 天前
从文件系统到 SD 卡:数据写入的四层路径
dma·文件系统·sd·rtos·数据拷贝
WWJA王文举10 天前
从设备地址到寄存器地址:I²C驱动完整流程详解
嵌入式开发·rtos·通信协议·i2c
Qt程序员10 天前
做嵌入式必备|12 个 RTOS 核心机制,建议收藏
嵌入式·嵌入式开发·rtos
ocean210314 天前
2025-2026年嵌入式开发大厂面试高频问题
面试·秋招·嵌入式开发·rtos·面经·嵌入式面试
笨笨饿1 个月前
#111_关于FreeRTOS面试的一些题目
linux·ubuntu·面试·职场和发展·centos·rtos
jufeng13071 个月前
【系列:uC/OS-II 内核源码精读:从 6736 行代码看懂一个 RTOS · 第 3 篇】
嵌入式·实时操作系统·rtos·uc/os-ii
橘色的喵1 个月前
SD 卡在上电后的完整加载流程:从中断信号到文件系统挂载
单片机·嵌入式硬件·嵌入式·rt-thread·rtos
捷瑞电子工坊1 个月前
嵌入式秋招面经:5大核心模块高频考题与实战避坑总结
c语言·stm32·嵌入式工程师·rtos·通信协议·嵌入式面试
小羊先生car2 个月前
RTOS-F429-HAL-Freertos内存管理(2026/8/5)
c语言·单片机·rtos
小羊先生car2 个月前
RTOS-F429-HAL-绝对延时和相对延时(2026/7/31)
c语言·rtos