《基于嵌入式实时操作系统的编程技术》笔记清单:第七章资源同步

《基于嵌入式实时操作系统的编程技术》笔记清单:第三章任务划分.
《基于嵌入式实时操作系统的编程技术》笔记清单:第四章任务设计.
《基于嵌入式实时操作系统的编程技术》笔记清单:第五章中断服务程序设计.
《基于嵌入式实时操作系统的编程技术》笔记清单:第六章行为同步.
《基于嵌入式实时操作系统的编程技术》笔记清单:第七章资源同步.
《基于嵌入式实时操作系统的编程技术》笔记清单:第八章数据通信.
《基于嵌入式实时操作系统的编程技术》笔记清单:第九章时间管理.
《基于嵌入式实时操作系统的编程技术》笔记清单:第十章采集任务设计.

前言

任务对共享资源进行访问的代码段落称为关键段落,各个任务访问同一个资源的关键段落必须互斥,才能保障共享资源信息的可靠性和完整性。这种使得不同任务访问共享资源时能够确保共享资源信息可靠和完整的措施称为“资源同步”。

本章笔记清单

1. 资源同步的四种方式

1)关中断;
2)关调度;
3)使用互斥信号量;
4)使用计数信号量。

2. “只读”的共享资源,不需同步。

此类资源,只能够读取,不能改写。比如:OLED的字符数组。

3. 关中断(保障数据正确性)

在公共函数中使用关中断
void synch(void)
{
	OS_ENTER_CRITICAL(); //关闭关中断
	if(count == total - 1)
	{
		count = 0;
		OS_EXIT_CRITICAL();		//打开中断
		OS_MboxPostOpt(...);
	}
	else
	{
		count ++;
		OS_EXIT_CRITICAL();
		OS_MboxPend(...);
	}
}

1)在公共函数中,访问全局变量时,暂时将中断关闭,从而不能产生调度,不会破坏原数据。加上“关中断”操作,将不可重入函数变为可重入函数。
2)优点:操作简单。
3)缺点:①在关中断期间,不能调用挂起自己的函数;②关闭中断期间,执行的内容尽可能简单,不能占用太多时间,否则整个系统的实时性变差。

4. 关中断(保障数据的完整性)

在这里插入图片描述
1)任务1直接显示(读取)结构体A的数据成员的话,可能由于任务2的修改而导致显示有误。
比如:实现一个时钟功能,在屏幕上,正要显示 “7:59:59” 正好读取完 “7” 这个数字。
接下来还要读取“分,秒”,此时,来了一个定时器中断,任务1被打断。任务2被定时中断调用了,更新了一下时间,A结构体的数据变为 “8:00:00”。
等调度任务1后,任务1继续读取“分、秒”,最终,屏幕上显示的是“7:00:00”,与实际的时间相差1小时。

2)针对以上情形,我们需要在执行屏幕显示函数的时候关一会儿中断。但是,执行显示函数的时间有点慢,这样关闭中断,影响实时性。
这时,我们可以采取“拍照”方式。在任务1中,定义一个结构体B,在关闭中断期间,把A结构体复制给B。这样,花费的时间是最短的。任务2中,也需将“写”操作保护起来。避免数据发生损害。

5. 关调度

1)当共享资源比较复杂,或规模较大时,采用“拍照”的方法也很费时,有些共享资源是功能部件(函数),根本不能“拍照”。
2)共享资源的调用者全是任务,不包含ISR,则可用关调度来访问共享资源。
3)关调度但没关中断,故系统对异步事件仍然可以及时响应,并使相关任务进入就绪状态,但不会立即进入运行状态。
4)关调度的缺点是:使与该共享资源无关的任务受到牵连,如ISR关联的任务无法立即执行。
5)关调度的优点不多,缺点也不少,尽可能不要使用。

6. 使用互斥信号量

1)互斥信号量具有处理优先级反转问题的功能,特别适合对共享资源的访问。
2)互斥信号量的初始值为1(用0XFF表示),表示共享资源有效(共享资源尚未使用)。
3)使用互斥信号量进行共享资源访问对系统的实时性影响最小。
4)使用共享资源过程中,插入延时函数,可以较好地模拟实际情况,模拟出并发的模式。延时不需太长。



7.题外话

1+1=2

那是学生时代的事了,那是线性关系,正比例相关。

如今我们步入社会,发现这世界处处都是非线性关系,并不是我一直努力,就一直会正比例增加回报,非线性关系的典型特征就是付出和努力不一定成正比,它有随机性,有不可预测性。

我们学了太多关于如何攀登人生高峰,但我们也应该多学学如何应对人生低谷,因为人生如浪,起起伏伏才是常态。

愿你学会独处,面对起落人生。

——转自水木然学社公众号文章《人在低谷时,千万别打扰任何人!学会独处,才能翻身》

猜你喜欢

转载自blog.csdn.net/weixin_38956024/article/details/107246598
今日推荐