uC/OS-II在配电监测终端仪表中的应用
摘要:讲述嵌入式操作系统μC/OS-II在电力监控仪表中的应用;通过实时多任务系统对所有任务的调度管理,解决在单任务系统中难以处理的实时性差的问题,同时增强系统工作的可靠性;较详细地给出系统软件的整体设计思路,以及软件中各任务的具体运行过程。
关键词:嵌入式系统 内核 任务 消息阵列
引言
随着各种电子系统在各领域中应用的不断深入,对电子系统本身的各方面性能提出了越来越高的要求,使应用软件朝着系统化方向加速发展。传统的嵌入式系统设计中,大多采用单任务的顺序机制。应用程序是一个无限的大循环,所有的事件都得按顺序执行,与时间相关性较强的事件靠定时中断来保证。这种方式编程的优势在于程序较为直观,但由此带来一个重要的问题,那就是系统的稳定性、实时性较差。尤其当系统功能较复杂,同时对实时性要求较严格时,这种单任务机制的弱点使暴露无遗。
在配电监测终端软件的设计中,笔者将买时操作系统μC/OS-II用于TMS320F206的程序设计;将系统所要的功能细化成为几个核心任务,由μC/OS-II实时内核进行调度,实现了多任务的并行执行,系统的可靠性和实时性得到大幅提升。ΜC/OS-II是免费的、源代码公开的、微内核嵌入式实时操作系统,其实时性能和内核的健壮性早已经在大量的实际应用中得到了证实。
1 系统概述
在电力系统中,对电子设备的要求是比较高的。配电监测终端是监测电网运行状况的一种重要设备,主要完成以下功能:对电压、电流信号进行采样,A/D转换;对所采集到的数据进行计算分析,得出各种监测指标参数;对所有指标参数进行统计分析,处理液晶显示和键盘扫描,响应按键命令,进行数据通信处理。在对电压、电流模拟通道信号的采样和A/D转换过程中,为保证严格的等时间间隔,将这部分事件处理放到实时器中断中进行。数字信号分析处理作为一个程序模块,完成数据的分析运行。键盘扫描和液晶显示处理部分程序,作为人机交换信息最直接的通道。它的设计是否合理,直接影响到用户使用的满意程序。在单任务系统中,程序循环的周期不确定,因此键盘扫描周期无法确定。当程序运算量较大时,容易造成明显的键盘响应迟钝。键盘扫描周期很大程序上受到主程序循环时序的影响,而且,当主程序中某个程序模块出现问题时,将出现程序卡住,直到看门狗复位为止。
javascript:window.open(this.src);" style="cursor:pointer;"/>
在多任务系统中,这些问题可以得到很好的解决。利用嵌入式实时操作系统内核对所有“任务”进行统一调度和管理,使CPU的使用权在建立的“任务”间切换;同时,在多任务机制下,使应用程序模块化,使开发任务层次化。
整个系统的设计可以分为三个层次:最底层为硬件平台是,包含微处理器系统及相关应用电路,第二层为任务层,包含电路驱动程序和应用程序;最高一层为μC/OS-II操作系统层,是整个系统的管理核心,如图1所示。
2 硬件描述
配电监测终端的设计采用定点DSP TMS320F206作为处理器。它是采用先进的改进型哈佛结构、多级流水高速设计,具有极其强大的数据处理能力和管理能力。该终端从功能上可分为数据采集部分,液晶显示及键盘阵列部分,数据存储、通信部分及微处理器小系统部分。数据采集部分用来对电压、电流信号进行采样和A/D转换;液晶显示和键盘阵列为人机信息交换硬件接口;数据存储部分存储大量历史统计数据,采用掉电保护设计,在系统掉电情况下数据不会丢失。
3 系统软件设计
按系统所要求实现的功能,将整个系统划分为几个并行存在的任务层。占先式操作系统对任务的调度是按优先权的高低进行的,将系统的几个任务按其优先级从高到低顺序排列依次是:系统监视任务、键盘扫描和液晶显示任务、通信任务、数据运算统计处理任务。数据采集部分放到定时器中断程序中执行。其中,系统监视任务是用来监视除系统监视任务外其它任务的。当被监视任务在执行过程中出现差错时,系统监视任务将按照预先设定的处理表对其进行处理,使出现差错的任务恢复正常运行,提高系统运行的可靠性。优先权的设置是按照整个系统运行的时序来确定的,对系统安全运行较重要和对实时性要求较严格的任务,设成较高的优先级。一般而言,在系统运行过程中,各任务的优先级是固定不变的。
μC/OS-II控制下的任务可以分为休眠态、就绪态、运行态、中断态和挂起态。在嵌入式系统中,为节省存储器空间不会保留休眠态的任务。当某个任务正在占用CPU的使用权时,该任务处于运行态。处于运行态任务的优先权一定高于其它所有就绪态任务的优先权。当系统运行致使某一就绪态任务优先权高于运行态任务的优先权时,调用调度函数,运行态任务将转入挂起态等待某一消息或信号量,或者转入就绪态;而那个拥有较高优先权的任务将占有CPU的使用权而转为运行态。某一时刻只有个任务占有CPU的使用权,也就是说,某一时刻只有一个任务处于运行状态。挂起态的任务在所规定的时间内,如果得到所期待的数据(可能是消息阵列,也可能是信号量),就自动转为就绪态;如果等待超时,就被时间管理函数强制转化为就绪态,等待任务调度。中断发生时,系统将强行剥夺运行态任务对CPU的使用权,将它转入中断态,保存相关数据到堆栈区之后,执行中断服务程序。在中断返回时,系统返回函数将重新进行任务调度,将优先权最高的就绪态任务转为运行态。
在实际系统中,每个任务都是一个无限循环的,分别实现某一特定的功能,由μC/OS-II内核来进行调度。电力行业中对设备可靠性的要求是很高的。对于监测设备,由于在启外运行,所受的电力谐波干扰相当大,有时会引起程序跑飞、死机现象,直到看门狗复位可使系统恢复正常;但在看门狗复位这段时间内,设备对电流、电压的采样不能正常进行,相关采样数据就会丢失,直接影响到电能量计算的准确度,同时会影响到数据通信。笔者利用软件狗的原理设计了一个系统监视任务,用来对其它任务进行监视。在系统运行中,当发现某一个任务运行出现异常时,该任务将按相关步骤做出相应处理。具体做法是:系统监视任务在正常运行情况下处于挂起状态,在某一时间范围内,等待每个被监视任务向它发送代表该被监视任务正常运行的消息。每个被监视的任务在运行状态下向系统监视任务发送这一消息,用以说明本任务运转正常。系统监视任务等待这一消息的时间范围按每个任务执行所需时间的最大值设定。系统监视任务在等待时间范围内收到消息,说明被监视任务运转正常,否则,系统内核自动将系统监视任务由挂起态转为就绪态。由于系统监视任务优先权最高,所它将取得CPU使用权,系统监视任务将出错任务的运行任务堆栈改为该任务的起始地址,并将其置为就绪态,挂起自身。如此,刚才出错的任务以重新开始执行,避免看门狗复位。
系统运行时,首先进行系统初始化操作,初始化所有数据结构,分别堆栈空间,然后建立任务间通信的信号量或者消息队列,进行任务建立,并且分配任务优先权。所有新建任务被置为就绪态,系统程序从优先权最高的任务开始执行。
该配电监测终端软件中,系统监视任务优先权最高,最先进入运行态。该任务分别查询每一个被监视的任务是否向其发送消息。如果没有,则该任务进入挂起态。按优先权级别顺序,键盘扫描和液晶显示任务将由就绪态转为运行态。在该任务将要执行完毕时,向系统监视任务发送消息,然后执行延时函数将自身转为挂起态,交出CPU使用权让其它任务得以执行。此时系统监视任务得到消息转为运行态,继续查询其它被监视任务的运行消息。如果没有,则进入挂起态,再次等待其它被监视任务的运行消息,系统按任务优先级继续执行优先级高的就绪态任务等等,依此类推。当键盘扫描和液晶显示任务延时时间到时,系统内核自动将它再次转为就绪态。一般键盘扫描和液晶显示任务延时时间按人手触摸按键反应时间而定,大约在100ms。在正常情况下,由于系统监视任务只是查询消息量,程序执行时间很短,甚至可以忽略,同时键盘扫描和液晶显示任务优先权排在第二。所以,只要键盘扫描和液晶显示任务进入就绪态就可以得到及时响应,能够很好地满足键盘扫描和液晶显示的实时性,解决在单任务环境下很难解决的键盘查询处理的实时性问题;同时,数据分析处理任务和通信任务可以在键盘扫描和液晶显示任务延时时间间隔内执行。由于TMS320F206处理器速度足够快,所有任务得以在满足时序的前提下顺利执行。
当系统响应定时中断时,中断程序将占据CPU的使用权进行电流和电压采样,设置下一次中断时间。在退出中断时,内核将重新进行任务调度。
结语
μC/OS-II是一套优秀的嵌入式实时操作系统。将该操作系统应用于配电监测终端中,大大提高了系统的稳定性和可靠性,提高了产品性能,成功地解决了一系列在单任务环境下不可避免的问题。