同步互斥认识

文章目录


一、什么是同步互斥

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

代码举例:

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


相关推荐
Amonter2 天前
Ubuntu下搭建zephyrOS开发环境
rtos·zephyr·esp32c3
驱动探索者9 天前
Zephyr 获取 cpu 占用率异常bug分析
bug·rtos·zephyr
apolloyhl11 天前
FreeRTOS内核:核心数据结构与任务切换原理解析
arm开发·嵌入式·rtos
SXSBJS_XYT21 天前
在资源有限的M0单片机上运行RTOS
单片机·rt-thread·rtos
赋能大师兄1 个月前
嵌入式软件的几种程序架构
rtos·事件驱动·前后台系统·时间片轮询·面向对象/组件化
华清远见IT开放实验室1 个月前
STM32学习路线!软硬件兼修:裸机+RTOS+LVGL+硬件设计+项目实战 (STM32多核心开发板)
stm32·嵌入式·开发板·rtos·课程·软硬件·裸机开发
linweidong2 个月前
跨平台驱动开发:打造兼容多款MCU的硬核方案
驱动开发·单片机·嵌入式硬件·bsp·rtos·spi驱动·hal设计
义薄云天us2 个月前
Apache NuttX 入门指南
apache·rtos·nuttx
要做朋鱼燕2 个月前
解析UART空闲中断与DMA接收机制
开发语言·笔记·单片机·嵌入式硬件·rtos·嵌入式软件
jz-炸芯片的zero3 个月前
【Zephyr炸裂知识系列】11_手撸内存泄露监测算法
驱动开发·算法·iot·rtos·内存泄露·zephyr