您的位置:控制工程论坛网论坛 » 教程与手册 » 基于裸机编程的实时系统设计?

dqfxm2003

dqfxm2003   |   当前状态:离线

总积分:3995  2024年可用积分:0

注册时间: 2005-10-21

最后登录时间: 2011-01-14

空间 发短消息加为好友

基于裸机编程的实时系统设计?

dqfxm2003  发表于 2006/1/11 11:57:55      1320 查看 3 回复  [上一主题]  [下一主题]

手机阅读

 


  在嵌入式控制系统的设计中,如何对被控制的多个任务进行有效协调,使其动作顺序合理、响应速度快捷,往往是设计者所考虑的一个很重要的方面,也是衡量检验一个系统的综合性能的重要指标。为了在多个任务的协调控制中满足实时性的要求,设计者往往会考虑在系统中嵌入目前流行的某种实时操作系统。现在也有一些通过验证的比较优秀的实时操作系统可供选择,有的源代码甚至是免费提供的,网上也有大量的移植成功的源代码范例。基于实时操作系统编程可以大大缩短开发的周期,实时性也有足够的保证。基于实时操作系统编程的代价之一是,增加了程序代码的长度;代价之二是,需要较多的RAM空间,在不扩展片外存储器的情况下,中低档单片机是难以胜任的。另一方面,大部分中低档应用系统通过合理的设计,采用基于裸机编程(没有实时操作系统)的方法,也可以保证一定的实时性,从而达到实时控制的要求,这是本文所要介绍的内容。

1 系统设计原理


  1.1 通过定时中断间隔的设计来保证实时性

  为了完成控制系统中多任务的实时响应要求,可以利用定时中断作为系统的时钟。每个中断的间隔作为时钟的最小基本单位,这个值要小于或等于被控制的各个任务中对时间要求最苛刻的任务的最大允许响应时间。定时间隔越短,响应越快捷,但系统CPU的负担也越重(因为CPU休眠的时间也越来越少)。这是一对相互矛盾的事物,需要设计者谨慎的协调才能达到最完美的效果。例如在配料控制系统中,如果加料速度为20 kg/s,要求配料误差为1 kg,则系统的实时性必须保证在50 ms之内。为了留有余地,可将定时中断间隔设置为20 ms。

  1.2 通过对所有任务的及时“照看”来管理多任务

  可以根据各个任务对实时性要求的不同程度,将任务分为不同的类型。对实时性要求越是苛刻的任务,就需要得到系统越频繁的“照看”。对于实时性要求不高的任务,系统对它的“照看”时间间隔可以长一些。例如,有两个任务A和B,任务A每秒必须“照看”10次,任务B每秒必须“照看”2次,则控制流程如图1所示。从图1中可以看出,任务A每隔0.1 s“照看”1次,任务B每隔0.5 s“照看”1次。对实时性要求基本相同的若干任务,可依次“照看”,其程序流程如图2所示。

  

图1处理实时性要求不同的任务 
图2处理实时性要求基本相同的任务 


  将所有任务都放在定时监控循环中来“照看”,就可以使各个任务得到实时“照看”,问题的关键是系统如何“照看”各个任务。如果某任务运行一次所需要的时间远小于定时间隔,则该任务可安排在系统“照看”它时完整地执行一次。在这种情况下,“照看”某任务和“运行”某任务是一回事。如果某任务的运行时间远大于定时间隔,例如在配料系统中,一次配料任务需要数十秒钟,而定时间隔只有20 ms,因此,在“照看”该任务时不可能等待它完成后再“照看”其他任务,否则系统就会崩溃。为此,系统对任何任务的“照看”时间必须远小于定时间隔,只有这样才能保证系统在一个定时间隔中完成对所有任务的“照看”。由此可以看出,在本方法中,任何任务都不能较长时间单独占有CPU,而是在不断地得到系统的“照看”,通过“照看”来维持各个任务的正常运行。

  1.3将任务分解为若干状态

  对于执行时间大于定时间隔的任务,其执行过程都是由若干不同状态构成的。在不同状态下,需要系统进行不同方式的“照看”,为此,为这个任务设置一个状态变量,以指示该任务当前的状态。当系统“照看”该任务时,首先读取该任务的状态变量,然后根据状态变量的值来执行对应的“照看”操作。

   为了使系统能够及时从某个任务脱身,以便及时“照看”另外的任务,则任何“照看”操作都必须非常简短(远小于定时间隔)。如果某个任务的某种状态需要系统较长时间的“照看”(如进行一段比较复杂的数据处理),则必须将这个状态再分解为若干状态,直到每个状态需要的处理时间均比定时中断间隔短得多。也可以设置若干标志,将这些耗时的处理过程放在后台处理。

  1.3将任务分解为若干状态

  ① 本方法没有优先级的概念,所有任务都一视同仁得到“照看”,不存在“任务调度”问题,从根本上简化了系统软件设计,也大大降低了对硬件资源的要求。

  ② 本方法与“时间片轮回”方法类似,但有两点不同:第一是每个任务得到的“时间片”是不固定的,与该任务的当前状态有关,当该任务处于停止状态时,其“照看”操作所需要的时间就比较短,占用的“时间片”也就比较短;第二是以“照看”操作来划分“时间片”,每个任务的“照看”都是一个完整的过程,不存在被打断的情况,故不需要为每个任务配置“堆栈”。各个任务之间的通信和同步可以通过变量和标志来完成,实现起来也比较简单。

  ③ 由于本方法对处于“停止状态”的任务也要不停地“照看”,显然时间利用率不高,当系统任务数量较多或实时性要求很高时就难于胜任,故本方法只能在任务数量较少的中低档系统中采用;任务数量较多或实时性要求很高的系统,仍然应该采用基于实时操作系统的编程方法。

2 设计实例

  现结合一个配料系统的设计实例来说明该类系统的设计方法。在配料系统中,配方中的每种成分都由一个独立的料斗来配置,并由一个独立的电子秤来计量。进行配料操作时,为了提高工作效率,各个料斗同时进行加料,达到配方中各自规定的重量后则停止加料。当所有料斗都完成加料过程后,便同时(或按预定顺序)出料,进行混合处理。各个料斗均出料结束后,间隔若干秒钟自动开始下一轮配料过程。
    
  在该系统中有如下任务需要运行:

  ◆ 键盘管理任务。采集操作者的按键动作并解释执行,用来设置配方数据和配料次数,控制系统运行。
  ◆ 显示任务。显示系统当前状态和相关数据。
  ◆ 数据采集任务。读取各个电子秤当前的数据。
  ◆ 配料控制任务。根据配方要求和电子秤当前的数据来决定料斗的工作状态。
  ◆ 控制信号输出任务。根据料斗状态,输出相应的各路控制信号。
  ◆ 时钟任务。为系统提供时间基准,使各个任务可以按规定节奏来运行。
  ◆ 睡眠任务。让系统在空闲时间里进入睡眠状态,以提高系统的抗干扰能力。 

  系统的软件结构如图3所示。左边是主程序,只安排了睡眠任务;右边是定时中断子程序,安排了其他所有任务。

        

                  图3系统软件结构示意图

  除配料控制任务外,其他任务运行一次的时间均远小于定时间隔,在每次定时中断中均可以完整地运行一次,故采用普通的编程方法将其运行过程写出来即可。配料控制任务无法在一次定时中断里完成,只能用不断“照看”的方法来完成。如果配料任务的运行时间(运行周期)为40 s,定时中断间隔时间为20 ms,则每次配料过程都是通过2000次“照看”来实现的。设配方有四种成分,则系统有四个料斗并行工作,“配料控制”任务的“照看”操作实际上由“照看料斗1”、“照看料斗2”、“照看料斗3”、“照看料斗4”组成(如图2所示),即每次定时中断都要依次“照看”四个料斗。四个料斗的“照看”操作方式基本相同。由于配方数据的差异,四个料斗的状态不一定每时每刻都同步。如果不考虑加料时的“落差”现象,就一个料斗而言,“照看”操作内容设计如表1所列。

  配料过程由键盘操作来启动(使“允许配料”标志=1),以后各次配料操作由前一次配料的状态5来启动,直到完成预定的配料次数。

  从表1中可以看出,所有的“照看”操作都是由“判断-分支”结构组成,操作时间也很短,满足设计要求。

3 小结 

         

  注:当状态变量的值为5时,为了同步和避免重复计算配料次数,只有料斗1执行指定的操作,其他料斗均不进行任何操作,直接结束照看。

  在实时多任务系统中,为了保证系统的实时性,采用实时操作系统是首选设计方案;但在中低档系统中,为了简化设计和降低成本,利用本文介绍的方法,基于裸机编程同样可以满足要求。在中低档系统占有很大比例的产品市场中,本文介绍的编程方法对降低成本和提高产品竞争力显然是有帮助的。

1楼 0 0 回复
总共 , 当前 /