如何进行嵌入式应用软件任务划分

技术分类: 嵌入式系统  | 2007-11-08
来源:单片机与嵌入式系统

  2.2.3 长任务问题的解决方法

  解决长任务问题最有效的途径是进行任务分割。所谓“任务分割”是指将影响系统实时性的长任务分割成若干个小任务。这样单个任务的执行时间变短,系统的任务响应时间变短,实时性得以提高。

  (1)对任务的分析与计算

  当然,长任务的分割必须结合系统中所使用的内核,以及各任务对实时性的要求等情况,进行必要的分析与计算,才能保证分割的合理性和有效性,具体的步骤如下。

  ① 分析系统共有多少个任务,这些任务对实时性的要求有多高,求出各个任务所要求的最低执行频率(f1,f2,…,fn)。

  ② 计算目前各任务的实际执行时间(t1,t2,…,tn)

  ③ 确定系统中的长任务。如果max(t1,t2,…,tn)≤min(1f1,1f2,…,1fn),则此系统中不存在长任务。如果max(t1,t2,…,tn)>min(1f1,1f2,…,1fn),则存在长任务,而且执行时间为max(t1,t2,…,tn)的那个任务就是要找的长任务。

  ④ 分析此长任务是否需要分割,分析一下是什么原因导致执行的时间过长,这个时间是否能够通过程序的优化来缩短?如果能,则不需要进行任务分割;否则,要对这个长任务进行分割。

  (2)实施长任务分割

  常用的任务分割的方法有以下两种:

  ① 将长任务按功能分为若干个小模块,每一个模块构成一个小任务,每个小任务实现一种相

对独立的功能,且要保证执行时间tmin(1f1,1f2,…,1fn)。各个小任务被内核顺序调用,合起来实现长任务功能。

  本文将深入研究划分任务的方法,并在此基础上,从实用的角度给出编写基于RTX51 Tiny实时操作系统的应用软件的指导方针。

  ② 有的长任务比较特殊,例如键盘任务和动态LED数码管显示任务,很难按照上面的方法把它分成若干个功能相对独立的小模块。这时,一般是按照方便保存现场信息的原则,将其强制分割成若干个小任务,每个小任务在min(1f1,1f2,…,1fn)时间内主动保存现场信息、放弃CPU的控制权,等到再次被内核调度时继续执行。这种分割方法相对而言较复杂,各任务之间界限不是很明显,看似未经分割,但实际上它却是由多次任务中断来完成的。

  2.3 原则3

  原则3是要将软件工程中的“解耦原则”用于任务划分

  可以采用软件工程中的解耦原则对应用程序进行任务的划分。任务之间的耦合是影响软件复杂程度的一个重要因素,应该采取下述设计原则:尽量使用数据耦合,少用控制耦合和特征耦合,限制公共环境耦合的范围,完全不用内容耦合。具体方法可参见软件工程方面的书籍。

  3、基于RTX51 Tiny的应用软件设计指

  RTX51是一个德国Keil Software公司开发的用于8051系列单片机的多任务实时操作系统[4]。RTX51有2个不同的版本。

  (1)完全版RTX51 Full

  完全版RTX51 Full允许4个优先级的任务时间片轮转调度和抢先式的任务切换,可以并行地利用中断功能。信号和信息可以通过邮箱系统在任务之间互相传递,可以从一个存储池中分配和释放内存,可以强迫一个任务等待中断、超时以及从另一个任务或中断发出的信号或信息。

  (2)小型版RTX51 Tiny

  小型版RTX51 Tiny是RTX51的一个子集,它可以很容易地在没有任何外部存储器的单片8051系统上运行。RTX51 Tiny仅支持时间片轮转任务切换和使用信号进行任务切换,不支持抢先式的任务切换,可以并行地利用中断功能,可以强迫一个任务等待中断、超时以及从另一个任务或中断发出的信号,不能进行信息处理,也不支持存储器分配或释放。RTX51 Tiny是一种不可剥夺型实时操作系统内核。

  基于RTX51 Tiny实时操作系统的单片机应用软件设计,首先应该根据RTX51 Tiny操作系统的准并发特性,对应用软件要实现的功能进行大小适当的划分——按照上述3个原则划分为若干个任务模块,并对各个任务间的通信和时延进行仔细的确认。

  编写基于RTX51 Tiny的应用软件的指导方针如下:

  ① 包含头文件rtx51tny.h在应用程序中。

  ② 不要写C语言主函数main()。RTX51 Tiny操作系统内核中已经有它自己的主函数main()。

  ③ 应用程序应该至少包括1个任务函数(task function)。

  ④ RTX51 Tiny应用程序必须中断使能(EA=1),因为RTX51 Tiny操作系统使用了定时器T0中断。

  ⑤ 应用程序至少调用1个RTX51 Tiny系统函数(如os_wait);否则,链接器将不会把RTX51 Tiny的系统库包含到应用程序中。

  ⑥ 任务task0是应用程序中第一个执行的函数。在任务task 0中,必须调用os_create_task函数来运行其他任务。

  ⑦ 任务task函数不必退出或返回。任务task必须使用一个while(1)结构或其他类似的结构。任务task函数不带参数,也没有返回值。使用系统函数os_delete_task挂起(halt)一个运行的任务。

0
0
(请您对文章做出评价)
1】【2】【3
加载中

对文章的评论

更多评论

剩余字数:  

浏览该文章的用户还看过...

  • 文 章

  • 论 坛

  • 博 客

  • 小 组

  • 博客推荐

  • 论坛推荐

  • 在线研讨会