用于行为同步的通信手段
行为同步一般有一方为控制方,另一方为被控制方。
二值信号量
取值只能为0或1的信号量。被控制方总是能够及时响应控制方发出的信号,完成相应的任务,并在下一次信号来临之前进入等待状态。
计数信号量
在信号量上进行了升级,可以实现一个简单的缓冲,当被控制方响应之后,就将信号量的值减一。
事件标志组
将若干个二值信号量进行组合,每一个二值信号量都是某个事件是否发生的标志。
消息邮箱
能够向被控制方提供内容信息(数据或字符串)。类似于二值信号量。
消息邮箱就是连接两个任务的桥梁
数据采集任务,数据处理任务,显示输出任务构成了典型的信息链条。
消息队列
能够缓存多条信息,消息邮箱的升级版。但是,消息的平均生产事件比消息的平均消费事件长,否则在长的消息队列也会溢出。
ISR和任务之间的同步
一个由异步事件触发的ISR通常和一个任务关联,他们之间就是单向同步关系。这个被关联任务总是处于等待状态。
两个任务之间的单向同步
当控制方的优先级高于被控制方(一般如此),控制方任务发出信息后,被控制方进入就绪,当控制方使自己挂起时,被控制方运行。这种适用于实时性要求不高,或者采取由缓冲功能的通信手段时,可以接受,并且一般采用首尾触发方式,同时也可以在控制方发出信息的时候立刻调用延时函数,进行任务切换。
当然也可以把控制方的优先级调的比被控制方低。
两个任务之间的双向同步
通信双方相互制约,达到产销平衡,避免单向同步的消息溢出。
即生产者必须得到消费者的恢复后才能进行下一个消息的生产
简单的双向同步过程一般被称为“交汇”,也就是不管谁先先到达交汇点,都必须完成一次双向同步的过程才能继续往下执行。
两个以上的任务同步一个任务
采用事件标志组来实现。
事件标志组可以启动总装型任务,这是按“逻辑与”来进行触发同步。也就是说,能保证被同步的那个任务更上另外两个任务的脚步,至少不超过(等于)发出信号最少的任务的执行次数。只要被同步的执行速度足够快,它的执行次数就可以等于各个同步任务中发出信号最少的任务的执行次数。“逻辑与”能保证一个重要任务在万事俱备的条件下执行。
当逻辑关系为“逻辑或”时,任意一个任务的执行都将触发被同步的任务。**“逻辑或”具有补充控制的特点,可以在一个基本控制方式下增加若干个补充控制,以满足某些特殊情况的需要。
多个任务相互同步
即每个任务都应该执行一次之后,再进行下一轮的操作。可以使用时间标志组来实现多任务的同步。每个任务运行到设定的同步点之后都要签到,即调用发送标志函数,然后调用等待标志函数,进入等待状态。
只是这样的设计大致一看可以,仔细想想还需要手动加入相关代码,以实现同步,以及代码的健壮性。
最后一个到达同步点的任务必须先清空签到内容(防止高优先级任务多次执行),同时将同步信号发送给其他信号,而它自己则不需要进行签到与等待信号,直接进入就绪状态。
- 用一个初始值为零的全局变量作为签到计数器,每个任务到达同步点加1表示签到。
- 从签到内容判断自己是不是最后一个到达,如果是,则清空签到内容,同时下发同步信号,如果不是则进行签到并且等待同步。
- 全局变量是共享资源,必须加以保护,在这里需要关中断进行操作,否则存在一些偶然情况,使得系统崩溃,所有任务被挂起。
多任务同步再任何情况下各个任务的有效执行次数都相同,这种团队作战的特点,适合用于多个任务配合进行的循环作业中,入配料系统,需要所有配料完成才能开始混合。