FreeRTOS ~(四)同步互斥与通信 ~ (2/3)互斥的缺陷

文章通过示例展示了在FreeRTOS中,由于任务调度和打印操作的耗时可能导致的打印乱序问题,即互斥的缺陷。为了解决这个问题,文中提出了使用标志位配合vTaskDelay来控制任务间的冲突,但同时也指出这种方法在特定情况下仍可能出现错误。文章强调在实际工程中,FreeRTOS需要更可靠的机制来处理这类问题。

举例子说明:互斥的缺陷

验证互斥:
创建两个任务,Task3和Task4,用来打印字符串;
我们创建一个新的函数,通用函数,被Task3和Task4使用
void TaskGenericFunction(void * param)
{
	while (1)
	{
		printf("%s\r\n", (char *)param);
	}
}
int main( void )
{
	TaskHandle_t    xHandleTask1;
	/* 硬件初始化 */
	prvSetupHardware();
	
	//xTaskCreate(Task1Function,"Task1",100,NULL,1,&xHandleTask1);
	//xTaskCreate(Task2Function,"Task2",100,NULL,1,NULL);
	xTaskCreate(TaskGenericFunction, "Task3", 100, "Task 3 is running", 1, NULL);
	xTaskCreate(TaskGenericFunction, "Task4", 100, "Task 4 is running", 1, NULL);
	
	/* Start the scheduler. */
	vTaskStartScheduler();

	return 0;
}
我们期望得到的是打印顺序是:
...
Task 3 is running
Task 4 is running
Task 3 is running
Task 4 is running
Task 3 is running
...
但是我们这样写代码是否可以做到呢?

在这里插入图片描述

分析一下;
为什么会造成上述打印乱的现象呢?
由于本次打印的字符较多,如:Task 3 is running,想要打印完这几个字符所需的耗时超出了1ms任务调度周期,
比如当前Running任务是Task3,可能才刚打印了Task 3 i 这几个字符,就被Tick中断打断,
任务调度切换到Task4去了,因此造成上图中的现象。
这里面如果波特率提高,可能会出现打印N次完整的Task 3 is running,但是总有新的一行打印会被Tick中断掉
这就是互斥的缺陷,并且下面可以对互斥进一步说明,看似没有问题的代码,就真的没有问题吗?
看下面的代码示例:
void TaskGenericFunction(void * param)
{
	while (1)
	{
		if (!flagUARTused)
		{
			flagUARTused = 1;
			printf("%s\r\n", (char *)param);
			flagUARTused = 0;
			vTaskDelay(1);
		}
	}
}
上述代码通过加入一个标志位卡控一下,但是要注意必须加上延时;
可以使用vTaskDelay(1);也可以使用vTaskDelayUntil(a,b);
原因是,如:这里是先创建的Task3,后创建的Task4且两者优先级均大于0且一致,那么先执行的就是Task4;
然后由于这里标志位的卡控,导致Task3可能无法打印成功;
然后一切就绪,Debug可以看到串口一直按照想要的结果进行输出,也就是:
...
Task 3 is running
Task 4 is running
Task 3 is running
Task 4 is running
Task 3 is running
...
但是,这样的代码真的没有问题吗?请看下面的分析:

在这里插入图片描述

如果Tick中断在上图中的红色箭头所示的地方发生了切换,该怎么办?
Task3和Task4将出现一次错误;
这里仅是一个示例,实际工程代码往往不会这么简单,上述的代码在执行了几天几夜后,总是有出现这样错误的时候;
而FreeRTOS是要解决更多问题的,因此针对这样问题,必然是有相应的手段的。
基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究”展开,提出了一种结合数据驱动方法Koopman算子理论的递归神经网络(RNN)模型线性化方法,旨在提升纳米定位系统的预测控制精度动态响应能力。研究通过构建数据驱动的线性化模型,克服了传统非线性系统建模复杂、计算开销大的问题,并在Matlab平台上实现了完整的算法仿真验证,展示了该方法在高精度定位控制中的有效性实用性。; 适合人群:具备一定自动化、控制理论或机器学习背景的科研人员工程技术人员,尤其是从事精密定位、智能控制、非线性系统建模预测控制相关领域的研究生研究人员。; 使用场景及目标:①应用于纳米级精密定位系统(如原子力显微镜、半导体制造设备)中的高性能预测控制;②为复杂非线性系统的数据驱动建模线性化提供新思路;③结合深度学习经典控制理论,推动智能控制算法的实际落地。; 阅读建议:建议读者结合Matlab代码实现部分,深入理解Koopman算子RNN结合的建模范式,重点关注数据预处理、模型训练控制系统集成等关键环节,并可通过替换实际系统数据进行迁移验证,以掌握该方法的核心思想工程应用技巧。
基于粒子群算法优化Kmeans聚类的居民用电行为分析研究(Matlb代码实现)内容概要:本文围绕基于粒子群算法(PSO)优化Kmeans聚类的居民用电行为分析展开研究,提出了一种结合智能优化算法传统聚类方法的技术路径。通过使用粒子群算法优化Kmeans聚类的初始聚类中心,有效克服了传统Kmeans算法易陷入局部最优、对初始值敏感的问题,提升了聚类的稳定性和准确性。研究利用Matlab实现了该算法,并应用于居民用电数据的行为模式识别分类,有助于精细化电力需求管理、用户画像构建及个性化用电服务设计。文档还提及相关应用场景如负荷预测、电力系统优化等,并提供了配套代码资源。; 适合人群:具备一定Matlab编程基础,从事电力系统、智能优化算法、数据分析等相关领域的研究人员或工程技术人员,尤其适合研究生及科研人员。; 使用场景及目标:①用于居民用电行为的高效聚类分析,挖掘典型用电模式;②提升Kmeans聚类算法的性能,避免局部最优问题;③为电力公司开展需求响应、负荷预测和用户分群管理提供技术支持;④作为智能优化算法机器学习结合应用的教学科研案例。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,深入理解PSO优化Kmeans的核心机制,关注参数设置对聚类效果的影响,并尝试将其应用于其他相似的数据聚类问题中,以加深理解和拓展应用能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值