在《前后台系统VS嵌入式OS,何时该上OS?》一文中介绍了何时应该将OS应用于嵌入式设计中,本文将介绍基于OS的任务设计,一般来说,应用程序设计包括两个方面,一个是业务逻辑的设计,另一个是业务逻辑的调度设计(这个由OS来完成)。有了OS,我们现在可以把更多的精力转到业务逻辑的设计上,前面讲了,业务逻辑只是电影的剧本,剧本要动起来,还的交由播放器播放(OS调度),所以在设计业务逻辑的同时,必须要考虑业务逻辑的调度,这就是我们今天要讲的任务设计。任务设计包括任务的划分;任务的优先级按排;任务的函数结构设计;任务之间的同步设计。
1任务的划分
任务的划分好坏直接关系到系统的设计的成败,往往好的任务划分,能够使设计更简单,任务多了,资源开销多,增加了任务之间的同步及频繁切换的开销,任务少了,可以减少共享资源的数量,降低了任务之间切换及同步的开销,不利于业务逻辑的并发调用。
(1)设备依赖性任务的划分
我们知道,并发性是任务的基本特性,而控制输入/输出设备的程序具有先天的并发性,把它们分别封装为不同的任务是合理的,这样,就可以划分出第一批任务,如键盘任务,显示任务、数据采集任务,控制任务和通信任务。
(2)关键任务的划分
所谓关键任务就是该任务不能遗漏,即使一次遗漏也不可以,这类任务往往交由中断处理程序来处理,若不能交给中断处理,则应给该任务安排最高优先级,保证其能得到及时调度,由于其优先级最高,为了不影响其他任务的调度,因此这类任务应尽量简短快速,若这类任务执行时间长,应将任务的处理交由优先级较低的任务去处理,该任务仅保存关键任务的通知信息(这些信息往往通过队列方式保存,只要保证消费能力大于生产能力就ok了)。
(3)数据处理任务的划分
这类任务往往需要消耗CPU过多时间,而对实时性要求不高,只需要数据的生产能力小于数据的消费能力就行了,它们的优先级必须安排的比较低,只使用其它任务剩余的机时来进行数据处理。
(4)触发条件相同的任务的划分
如果若干功能由相同的事件触发,则可以将这些功能组合为一个任务,从而免除将事件发给多个任务的工作量。
(5)运行周期相同任务的划分
将周期相同的功能组合在一起封装为一个任务,就可以避免一个时间事件触发几个任务,省去事件分发操作和他们之间的通信。
(6)顺序操作任务的划分
如果若干功能按固定顺序进行流水作业,相互之间完全没有并发性,则应该将这些功能组合为一个任务。这样一来也可以减少任务之间的同步过程。
(7)功能聚合任务的划分
将关系密切的若干功能组合成为一个任务,达到功能聚合的效果。这样也会减少任务之间的同步过程。
最后,若按照上述步骤,还存在多过任务之间需要同步的情况,可以试着将这些任务合并,但前提是不影响系统性能的情况下。总而言之,任务的划分首先要满足系统的性能,其次,就要使设计简单,再就是尽可能降低任务之间的同步过程,能不用同步尽量不用。