我的uC/OS-II,我的读书笔记之行为同步
一个任务的运行过程需要和其他任务的运行配合,才能得到预定的效果。任务之间的这种动作配合的协调关系称为“行为同步”。其结果表现为任务之间的运行按某种预定的顺序来进行,故又称为“顺序控制”。
计数信号量
计数信号量初始值为0,控制方需要发出同步信号时,就调用“发出一个信号量”的服务函数,使计数信号量的值加1.被控制方在任务的“同步点”调用“等待一个信号量”的服务函数,如果计数信号量的值不为0,就将计数信号量减1,并继续运行下去;如果计数信号量的值为0,便将自己挂起,等待控制方的信号。
计数信号量的使用范围:被控制方不能保证在下一次信号到来之前处理完本次控制方发出的信号,但总体上可以响应所有信号。在uC/OS-II中,“信号量”就是“计数信号量”。
事件标志组
“事件标志组”可以实现多个任务(包括ISR)协同控制一个任务,当各个相关任务(包括ISR)先后发出自己的信号后(使事件标志组的对应标志有效),预定的逻辑运算结果有效,触发被控制的任务。
消息邮箱
“数据采集”任务、“数据处理”任务和“显示输出”任务构成了典型的“信息链条”,前一个任务为后一个任务提供数据,它们之前就可以用“消息邮箱”来进行“行为同步”。
由于“消息邮箱”里只能存放一条消息,所以在用“消息邮箱”进行同步控制时,必须满足一个前提:任何时候消息的产生速度都比消息的消费速度慢,即被控制任务总是在等待消息。这和二值信号量的情况类似。
消息队列
“消息队列”可以存放多个消息,能够有效解决消息的“临时堆积”问题。与计数信号量的情况类似,“消息队列”的使用仍然需要满足一个条件:消息的平均生产时间比消息的平均消费时间长;否则,再长的“消息队列”也会“溢出”。
小结
Ø 当同步过程不需要传输具体内容时,可选择信号量类手段,如二值信号量、计数信号量和事件标志组。
Ø 当同步过程需要传输具体内容时,可选择消息类手段(消息邮箱的消息队列)。
Ø 当满足“任何时候同步信息的产生速度都比同步信息的消费速度慢”时,可选择简单的通信手段(二值信号量、事件标志组和消息邮箱)。
Ø 对于非周期性同步信息,当不能保证“任何时候同步信息的生产速度都比同步信息的消费速度慢”时,可选择有缓冲功能的通信手段(计数信号量和消息队列)。
Ø 当同步信号为多个信号的逻辑运算结果时,采用事件标志组作为同步手段。