同步互斥认识

文章目录


一、什么是同步互斥

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

代码举例:

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


相关推荐
集大周杰伦1 个月前
FreeRTOS 源码结构解析与 STM32 HAL 库移植实践(任务创建、删除篇)
stm32·freertos·实时操作系统·嵌入式开发·rtos·任务调度·任务控制块
Absorbed_w1 个月前
FreeRTOS(3)列表List
mcu·rtos
PegasusYu1 个月前
STM32CUBEIDE FreeRTOS操作教程(十三):task api 任务访问函数
stm32·操作系统·教程·rtos·free-rtos·task api·任务访问函数
老猿讲编程3 个月前
万字长文介绍ARINC 653,以及在综合模块化航空电子设备(IMA)中的作用
rtos·arinc653
flashier3 个月前
ESP32学习笔记_FreeRTOS(5)——Mutex
c语言·笔记·学习·esp32·rtos
一只搬砖的猹3 个月前
小米vela系统(基于开源nuttx内核)——openvela开源项目
linux·开源·小米·rtos·nuttx·openvela·apache2.0
一只搬砖的猹3 个月前
小米vela系统(基于开源nuttx内核)——如何使用信号量进行PV操作
嵌入式硬件·内核·小米·rtos·信号量·线程通信·vela系统
一只搬砖的猹3 个月前
项目实战——使用python脚本完成指定OTA或者其他功能的自动化断电上电测试
linux·单片机·嵌入式硬件·python自动化·rtos·嵌入式软件·ota
PegasusYu3 个月前
STM32CUBEIDE FreeRTOS操作教程(十二):std dynamic memory 标准动态内存
stm32·freertos·rtos·stm32cubeide·free-rtos·标准动态内存·dynamic memeory
清炒孔心菜3 个月前
RTOS 基础知识
rtos