当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]基于裸机编程的实时系统

摘要:在系统控制过程中,实时性是系统性能的一个重要测试指标。应用实时操作系统是保证实时性的一种普遍方法,但是一些资源相对缺乏的单片机是不适合用操作系统的。本文介绍在中低档控制系统中,在不采用实时操作系统的情况下,如何对多个任务进行控制,以达到实时性要求的方法。


关键词:嵌入式系统 单片机 实时操作系统

引 言

  在嵌入式控制系统的设计中,如何对被控制的多个任务进行有效协调,使其动作顺序合理、响应速度快捷,往往是设计者所考虑的一个很重要的方面,也是衡量检验一个系统的综合性能的重要指标。为了在多个任务的协调控制中满足实时性的要求,设计者往往会考虑在系统中嵌入目前流行的某种实时操作系统。现在也有一些通过验证的比较优秀的实时操作系统可供选择,有的源代码甚至是免费提供的,网上也有大量的移植成功的源代码范例。基于实时操作系统编程可以大大缩短开发的周期,实时性也有足够的保证。基于实时操作系统编程的代价之一是,增加了程序代码的长度;代价之二是,需要较多的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 周航慈.单片机应用程序设计技术.修订版.北京:北京航空航天大学出版社,2002
2 周航慈.单片机程序设计基础.修订版.北京:北京航空航天大学出版社,2003
3 Shem?Tov Levi & Ashok K Agrawala. Real?Time System Design. McGraw?Hill Publishing Company,1990

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

学好电子技术基础知识,如电路基础、模拟电路、数字电路和微机原理。这几门课程都是弱电类专业的必修课程,学会这些后能保证你看懂单片机电路、知道电路的设计思路和工作原理;

关键字: 单片机 编程 电路设计

单片机编程需要使用专门的软件工具,这些工具能够帮助程序员编写、调试和烧录程序到单片机中。以下是一些常用的单片机编程软件:

关键字: 单片机 编程 软件工具

Java语言和C语言是两种不同的编程语言,它们在语法、特性和应用领域上有许多差别。下面将详细介绍Java语言和C语言之间的差异以及它们各自的技术特点。

关键字: Java语言 C语言 编程

嵌入式系统是现代生活中无处不在的一部分。它们包括了我们的家电、汽车、智能手机、医疗设备等等。这些系统的工作必须高效、可靠,因为它们往往控制着生活中的关键方面。而C语言作为一种广泛用于嵌入式系统开发的编程语言,其质量和稳定...

关键字: 嵌入式系统 C语言 编程

在嵌入式系统开发领域中,C语言是使用最广泛的编程语言之一。它具有高效、灵活和可移植的特点,成为嵌入式系统设计师的首选语言。本文将介绍C语言编程的基本概念、特点以及在嵌入式系统开发中的应用。

关键字: 嵌入式系统 C语言 编程

在编程和计算中,运算符优先级是解释和计算表达式的一个关键因素。本文旨在阐述运算符优先级的概念、规则及其在表达式中的应用,以帮助读者更好地理解和运用运算符优先级。

关键字: 表达式 运算符 编程

泰克科技组合软件总经理Rick Khulman:“激发孩子们——尤其是女孩们对STEM的兴趣,对我本人乃至广大工程界都至关重要。”

关键字: 编程 机器人 示波器

PIC单片机采用精简指令集,例如对于PIC16F716单片机,只有35条单字节指令。要用这么少的指令实现复杂的控制或计算,显然要在程序设计上多做文章,以下就程序设计需要注意的问题谈一些看法。 美国微芯公司开发的CMOS工...

关键字: 单片机 控制 编程

PLC编程是一种数字运算操作的电子系统,专为在工业环境下应用而设计。它采用可编程序的存储器,用来在其内部存储执行逻辑运算、顺序控制、定时、计数和算术运算等操作的指令,并通过数字式、模拟式的输入和输出,控制各种类型的机械或...

关键字: plc 编程 plc编程

初学PLC梯形图编程,应要遵循一定的规则,并养成良好的习惯。下面以西门子PLC为例,简单介绍一下PLC梯形图编程时需要遵循的规则,希望对大家有所帮助。

关键字: 西门子 plc 编程
关闭
关闭