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

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

前言

在实时操作系统的支持下,系统的整体功能是通过各个任务(包括ISR)的协同运行来实现的,这种协同关系包括运行步骤的协同,这种协同操作就是“行为同步”。

本章笔记清单

1. 二值信号量

1)使用范围:生产的产品永远“供不应求”,消费者“总是处于等待状态”。即:生产的速度比消费的速度慢。

2. 计数信号量

1)生产速度可以比消费的速度快,当然也可以慢。它的内部实现的机制是一个计数器,每生产一次,计数+1;每消费一次,计数-1。
2)场合:比如一个步进电机,转一圈需要1分钟。触发一次按键,电机就转一圈。按键相当于生产者,电机相当于消费者。电机消费的速度比按键生产的速度要慢,当然,快与慢取决于你按下的频率。此时,我一次性按10次,则计数信号量累加到10。接着,电机任务收到释放的信号,每转一圈,信号量减1,直到为0,最后挂起。这期间,电机一共花费了10分钟。
3)在ucos-ii中,“信号量”实际上就是“计数信号量”。

3. 事件标志组 (OSFlagCreate )

1)多个任务协同控制一个任务。
2)创建一个事件标志组,实际上是二值信号量组成的表。
3)举例:
在这里插入图片描述
假如,完成了功能4,功能5,功能7,功能10。接着,将它们对应的位置都置1,最后,在某个任务中判断这四个功能是否都完成了,完成了就执行下一步。

4. 消息邮箱

1)消息邮箱只能存放一条消息。消息是void类型,意味着,可以存放任意数据类型的消息。
2)使用的前提:生产速度低于消费速度,与二值信号量类似。
3)通常放入“空邮箱”(放入一个空指针(void
)0)表示事件没有消息,用“非空邮箱”(放入一个非空指针(void*)1)表示事件已经发生。也就是说,”消息邮箱可以当作“二值信号量”使用。系统中需要同时使用二值信号量和消息邮箱时,可以只使用消息邮箱一种通信手段,将有关二值信号量的代码全部剪裁掉,达到简化系统的目的。

5. 消息队列

1)可存放多个消息,与计数信号量情况类似。
2)满足条件:生产速度大于消费速度。当然,消费时候需要快速处理邮箱的内容,不然邮箱会存满。
3)消息队列可当作缓冲区。

6. 两个任务之间的单向同步

1)如果控制方优先级低于被控方,控制方发出信号后,被控方立即发生任务切换(因为,释放一个信号时,产生一次调度),瞬间的同步效果好。
2)如果控制方优先级高于被控方,控制方发出信号后,则瞬间同步效果差。被控方实时要求不高,或采用有缓冲功能的通信手段,这是可以接受的。通常采用“尾触发方式”来改善同步效果,即控制方发出信号后,立即调用延时,延时时间打与被控制方任务的处理时间。

7. 两个任务之间的双向同步

在这里插入图片描述
1)特点:它使生产者生产速度受到了消费者的反向控制,达到“产销平衡”的理想状态。
2)举例:蜂鸣器任务响一声后,向显示任务发送消息,并等待回答,显示任务得到消息后进行一次更新,再对进行蜂鸣器进行回复。最终效果为,蜂鸣器响一次,显示数字加1。

8. 两个任务以上同步一个任务

1)使用”事件标志组“

1. OSFlagPend(FLAG, 0X03,			//最低两位
					OS_FLAG_WAIT_SET_ALL	//满足的条件使,最低两位为1
					+ OS_FLAG_CONSUME,		//获取成功后,清楚标志位
					0, &err);
//一直挂起,知道FLAG的值为0x03才继续往下执行。

2.OSFlagPost(FLAG,0X01,OS_FLAG_SET,&err);
3.OSFlagPost(FLAG,0x02,OS_FLAG_SET,&err); //在其他任务将最低两位置为1,表明当前任务完成了。

9. 多任务相互同步

在这里插入图片描述
1)当三个任务都”签到“后,才能从同步点(等待点)往下执行。根据被挂起任务优先级顺序来执行。
2)假如第三个任务是最后的”签到“者,它”签到“后,立马产生调度,寻找最高优先级的任务,此时,第三个任务还没被OSFlagPend挂起。在等待中的高优先级任务执行完被挂起后,第三个任务才有机会执行OSFlagPend, 此时它无需等待就能往下执行。如果最后执行的任务是最高优先级,Post之后就直接往下执行,无需等待。
3)上述方法存在一些问题:①怎么知道最后一个”签到“是哪个任务;②在最后一个任务未清除标志组之前,更高优先级可能执行了多次。
4)针对以上问题,做出了调整:使用”签到“计数器,并且配合一个邮箱。每个任务插入这一段代码,很轻松地解决上述的问题,实现多个任务互相同步。

while(1)
{
	if(count == total-1) //total是需要同步任务的个数,判断是否到达最后一个
	{					//是达到最后一个
		count = 0;		//清除”签到“计数器
		OSMboxPostOpt(MyBox, (void*)1, OS_POST_OPT_BROADCAST);  //发送消息同步,进行消息分发,广播
	}
	else
	{					//不是最后一个
		count ++; 		//”签到“
		OSMboxPend(Mybox, 0, &err);		//等待同步消息
	}
}

5)多任务同步,保证在任务情况下,各个任务的有效执行次数都相同,而且等于运行速度最低的任务执行的执行次数。相当于木桶理论。
6)多任务同步方式具有”团队作战“特点,它可用在一个需要多任务配合进行的循环作业。如:在配料系统。
在这里插入图片描述



10.题外话

既然大众都活在假象里,那么在世界上要想取得成功,真正的逻辑是什么?

请记住下面这八个字:看清真相,制造幻象。

这就是一切商业/政治/艺术的核心要领,大众从不想要真相,它们只是渴望被理解,被认同。所以千万不要用你认为的真相强加于人,你只需要理解它们目光的狭隘,制造故事和幻想让它们沉迷,你就能大获成功了。
——转自水木然学社公众号文章《99%的人都活在假象里,只能被反复收割!》

猜你喜欢

转载自blog.csdn.net/weixin_38956024/article/details/107226487