技术中心
 
 

嵌入式应用软件任务划分的原则

   日期:2012-09-14     来源:互联网    

  本人凭借多年的嵌入式系统开发经验给出了划分任务的3个原则,分别是“对同一个外设的访问放在一个任务中”、“通过任务分割提高系统的实时性”和“软件工程中的‘解耦原则’用于任务的划分”。实践证明,这些任务划分的原则是行之有效的。另外,从实用的角度给出了编写基于RTX51 Tiny实时操作系统应用软件的指导方针。实际上,RTX51 Tiny实时操作系统对目标系统的硬件需求是很低的,随着半导体技术的发展,能够运行嵌入式实时操作系统的单片机芯片是很容易采购得到的。

  嵌入式研发中心是国内最早进入嵌入式技术研发和应用推广的技术型企业之一,成立以来在专注于嵌入式底层应用技术的研究和开发的同时为广大客户提供嵌入式系统开发技术、嵌入式解决方案和嵌入式产品(嵌入式开发板、ARM开发板、ARM9开发板、ARM开发工具、ARM仿真器和ARM工控板、arm实验仪等)。

  人们越来越清楚地认识到,在嵌入式系统设计中引入实时操作系统的必要性。在许多嵌入式系统中,不但要求系统能够及时响应随机发生的外部事件,并对其作出快速处理,通常还需要同时执行多个任务,并对每个任务作出实时响应。实践证明,对于这样的应用,采用嵌入式实时操作系统作为应用软件的设计平台和运行平台是一个良好的选择。

  在基于实时操作系统(RTOS,RealTime Operating System)的单片机应用软件设计中,“任务”是一个很重要的概念。有专家指出,把一个应用系统分为多少个任务且定义每一个任务各负责什么事情,这是一门艺术。

  对于任务的划分,并没有一个人人都要遵守的规则,不同的嵌入式开发工程师来设计一个同样规格要求的系统,会有不同的方案。然而,到目前为止,很难看到有关论文对任务划分的方法有比较详细而系统的介绍。本文将深入研究划分任务的方法,并在此基础上,从实用的角度给出编写基于RTX51 Tiny实时操作系统的应用软件的指导方针。

  1、任务的概念和应用软件开发过程

  在嵌入式实时多任务系统开发中,用C语言代码表示的任务是一个无限的循环程序。任务不能有返回,不能有退出出口,但是任务可以被杀死,包括被别的任务杀死或自杀[2]。任务的概念与操作系统中的进程概念相同,一个任务是独立的执行进程,可以与其他的并发任务竞争CPU时间。

  基于RTOS的单片机应用软件开发过程:首先是根据系统设计方案明确应用软件的功能,然后结合RTOS的并发特性(或准并发特性),对应用软件要实现的功能进行大小适当的划分,也就是把应用软件的功能按照一定的原则划分为若干个任务模块,并对各个任务间的通信和时延进行仔细的确认。

  2、任务划分的原则

  任务划分有3个原则,分别介绍如下。

  2.1 原则1:将同一个外设的访问放在一个任务中。

  2.2 原则2:是要通过任务分割提高系统的实时性。

  在嵌入式多任务实时系统中,任务是指一个程序分段。这个程序分段被操作系统当作一个基本单元来调度。典型地,每个任务都是一个无限的循环。

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

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

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

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

  (1)完全版RTX51 Full

  (2)小型版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)一个运行的任务。

  ⑧ 中断服务程序的编写方式,与不使用RTX51 Tiny操作系统下的编写方式相同。

  ⑨ 编译和链接应用程序有2种途径,一种是使用集成开发环境μVision 2 IDE,另一种是使用命令行工具CommandLine Tools。一般采用德国Keil Software公司提供的集成开发环境 μVision 2 IDE。

 
  
  
  
  
 
更多>同类技术
 
全年征稿 / 资讯合作
 
推荐图文
推荐技术
可能喜欢