仪器仪表中基于邮箱监控的嵌入式软件系统设计与应用(-2)

   2024-02-18 互联网1040
核心提示:[B]1 引 言 [/B] 现代仪器仪表产品已成为最具典型性的高科技产品。随着科技发展,仪器仪表正朝着数字化、智能化、网络化、微


[B]1 引 言 [/B]
现代仪器仪表产品已成为最具典型性的高科技产品。随着科技发展,仪器仪表正朝着数字化、智能化、网络化、微型化、高性能、高可靠性、高稳定性的方向发展[1]。面对行业发展需求,仪器仪表产品在软件上有必要引入新的设计思想和方法。


[B]2 仪器仪表存在的问题[/B]
早期的仪器仪表,考虑成本,性能等方面的要求,大多基于8位和16位单片机按单任务顺序机制进行软件开发,因此不可避免地存在中断延迟与频繁复位问题。由于应用程序是一个无限的大循环,所有的事件都必须按顺序执行,由大循环程序调用相应的函数完成相应的操作,而与时间相关性较强的事件只能靠定时中断来保证。但中断服务提供的信息一直要等到后台程序运行到中断标志位时才能得到相应处理[2],最坏情况下的任务级响应时间取决于整个循环的执行时间。由于仪器仪表所处的运行环境干扰较严重,常导致程序跑飞或是陷入死循环,影响系统稳定运行,一般只能依靠看门狗复位重新启动后再投入运行。


近年来在通信、电子、自动化等领域,随着高端单片机以及32位系列芯片应用的普及,引入嵌入式的实时操作系统既能满足复杂的应用需求又能充分发挥硬件功能[3]。现在采用嵌入式操作系统以提高系统实时性与稳定性已成为主流。


本文讨论采用嵌入式实时操作系统统μC/OS-II,借助操作系统提供的消息邮箱服务,设计仪器仪表系统中的监控任务,较好地解决了仪器仪表的实时性和稳定性问题。


[B]3 基于邮箱监控的系统设计[/B]
μC/OS-II是一种免费的且源码公开的嵌入式操作系统,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点。其内核提供任务调度与管理、时间管理、任务间的同步与通信、内存管理和中断服务等功能,最小可编译至2KB左右,很适合用于小型控制系统应用,以下对一些关键技术作些讨论。


[B]3.1 任务优先级与调度[/B]
基于操作系统的应用程序设计过程,就是把问题分解成多个任务的过程。每个任务都是整个应用程序的某一部分,无限循环地各自实现某一特定的功能。每个任务被赋予一定的优先级,有自己的一套CPU寄存器和栈空间。将复杂问题分解成各自独立的多个任务进行设计,可以简化应用软件的开发难度,并有助于从整体上提高系统的稳定性与可靠性[4]。


μC/OS-II控制下的任务可以分为休眠态、就绪态、运行态、中断态和挂起态。在仪器仪表系统中,为节省存储器空间不会保留休眠态的任务。正在使用CPU的某个任务处于运行态。当系统运行时,如某一就绪态任务优先级高于该运行态任务的优先级时,内核的任务调度服务就会将该运行态任务转入挂起态,以等待某一消息或信号量[5],或者转入就绪态。处于就绪态中拥有较高优先级的任务将占有CPU的使用权而转为运行态。挂起态任务在所规定的时间内,如果得到所期待的数据(可能是消息邮箱,也可能是信号量等),就将自动转为就绪态;如果等待超时,将被时间管理模块强制转化为就绪态,等待任务的调度。当中断发生时,系统将强行剥夺运行态任务对CPU的使用权,将其转入中断态,在保存相关数据到堆栈区之后,执行相应的中断服务程序。在中断返回时,系统返回函数重新进行任务调度,将优先级最高的就绪态任务转为运行态。多任务运行的实现实际上是由CPU的转换、调度完成的,图1是任务状态切换示意图。

[img]200691310481355046.jpg[/img]
[B]3.2 任务的设计[/B]
仪器仪表系统中常用的有4个任务模块:信号采集模块、信号处理模块、控制运算模块和输出模块,并按照上述顺序从低到高依次设定优先级,即信号采集任务优先级较低,输出任务优先级较高。输出任务可以是对键盘、触摸屏的响应或液晶显示,作为人机交互信息最直接的通道,能否实时地响应用户的需求直接影响到用户满意程度。所以将输出任务的优先级设定较高,只要系统进入就绪态就可及时响应,可很好地解决在单任务环境下很难解决的键盘查询和显示处理的实时性问题。任务优先级均设定为静态优先级,在运行过程中任务优先级不变。


确定实时系统任务的优先级是一项比较复杂的工作,因为并非所有的任务都至关重要,不那么重要的任务其优先级自然可以相对低一些。实际工程设计中,可采用单调执行率调度法RMS[5](Rate MonotoNIc Scheduling),以分配任务的优先级,该方法基于任务执行次数,执行最频繁的其优先级就设定为最高。


[B]3.3 监控的任务[/B]
仪器仪表系统的工作环境存在强烈的工业干扰,有时会引起程序跑飞或死机现象,这种情况发生时,一般采用看门狗电路复位方法使系统恢复到正常工作状态,这将导致系统要重新启动后才能再次运行,因此系统可靠性不高。本文专门设计了一个系统监控任务,并将其优先级设为最高,用以监视其它任务是否正常运行。若未能正常运行则采取相应控制措施,尽量减少看门狗复位的次数,以改进系统的可靠性。


监控任务设计的具体做法是:被监控任务运行时,监控任务处于等待态,等待被监控任务给它发送消息,等待时间被设定为预计的任务正常运行所需的最大时间。被监控任务在其即将结束运行时向监控任务发送一条消息,以表示其运行正常。若等待时间内监控任务收到消息,则认为发送消息的任务运行正常,然后监控任务挂起自身,由内核的任务调度服务启动下一个任务的运行,监控任务又开始等待该任务运行完毕时发送的消息。若等待时间已过,监控任务仍未收到消息,则系统的时间管理模块将强行把监控任务置为就绪态。因监控任务的优先级是最高的,它将抢占对CPU的控制权,监控任务将出错任务的运行任务堆栈改为该任务的起始地址,并将其置为就绪态,然后挂起自身。这样,前面出错的任务得以重新开始执行,避免了看门狗复位。根据不同类型的仪器仪表系统可设计其对应的控制措施,以提高系统的可靠性。图2是任务设计的示意图。

[img]200691310481922329.jpg[/img]
[B]3.4任务间的通信设计[/B]
在监控任务管理其它任务的过程中,存在着信息传递,即任务间的相互通讯问题。任务间信息的传递有两个途径:全程变量传递和通过发消息给另一个任务。


用全程变量传递信息时,必须保证每个任务或中断服务程序独享该变量。中断服务中保证独享的唯一办法是关掉中断再打开中断。如果两个任务共享某变量,各任务实现独享该变量的办法可以是关中断后再开中断。任务只能通过全程变量与中断服务程序通讯,而任务并不知道什么时候全程变量被中断服务程序修改了,除非中断程序以某种方式向任务发信号,或者是该任务以查询方式不断周期性地查询变量的值,这样增加了系统的负担。要避免这种情况,可以考虑使用消息邮箱解决这个问题。


[B]3.5 消息邮箱[/B]
消息邮箱实质是用一个指针型变量,通过内核服务,无论任务或中断服务程序都可以把一则消息(即一个指针)放到邮箱里去。同样,任务可以通过内核服务接收这则消息。发送和接收消息的任务约定:“该指针指向的内容就是那则消息的内容”。


每个邮箱有相应的正在等待接收消息的任务列表,等待接收消息的任务会因为邮箱是空的而被挂起,并被记录到等待消息的任务表中,直到收到消息。一般地说,内核允许用户定义的等待超时,若等待消息的时间超时,仍然没有收到该消息,该任务自动进入就绪态,报告等待超时错误,并返回出错信息。消息放入邮箱后,μC/OS-II只支持把消息传给等待消息任务表中优先级最高的那个任务。


可设计4个消息邮箱,各消息邮箱用途分别为:1号消息邮箱用于信号采集模块发送消息给监控任务,并对信号作相应处理;2号邮箱用于信号处理模块发送消息给监控任务,并作控制运算处理;3号邮箱用于控制运行模块发送消息给监控任务,并作输出显示;4号邮箱用于输出模块发送消息给监控任务。对消息的读取采取优先级的原则,即各任务从消息邮箱读取的顺序为:监控任务先读,其它任务后读。


[B]3.6时间管理模块[/B]
时间管理模块提供的时间管理函数功能是将等待时间超时的等待态任务置位为就绪态,其实质为一个时钟中断的中断服务程序。系统运行时,系统监控任务等待的时间范围可按该任务执行所需时间的最大值设定。若被监控任务正常运行,则在等待时间内,监控任务可从消息邮箱收到消息,恢复运行态,接着设定下一个任务的等待时间。若被监控任务运行异常,将产生时钟中断,强行将监控任务置为就绪态,以便采取相应的控制措施。


[B]4 系统运行过程分析[/B]
系统运行首要环节是系统的初始化,首先建立任务,并为其分配优先级,将其置为就绪态;然后建立消息邮箱及对应的邮箱控制模块,初始化消息邮箱,以便于实现任务间的数据传递。将所有新建任务都置为就绪态,系统程序从优先级最高的任务开始执行,各任务即可开始调度运行。


刚开始时各任务均处就绪态,此时监控任务优先级最高,最先运行,查询1号邮箱,即信号采集模块中是否有给它发送的消息,因1号邮箱为空,因此监控模块变为等待态,并根据信号采集模块正常运行所需的最大时间设定等待时间。此时输出模块在所有就绪态任务中优先级最高,可以运行,但也因3号邮箱为空而变为等待态,依此类推。虽信号采集模块优先级最低,但因其无需等待别的模块给它发送消息,故信号采集模块得到CPU控制权,开始运行。若信号采集模块未能正常运行,等待时间超时,消息邮箱仍然为空。时间管理模块将强制设置监控任务为就绪态,由于监控任务的优先级最高,将自动获得CPU控制权,根据故障情况可采取相应的控制措施。若信号采集模块运行正常,则在等待时间内发送消息至1号邮箱,信号处理模块及监控任务都转为就绪态。相比之下,因监控任务优先级较高,先从1号邮箱获取消息从而确认信号采集模块运行无误。接着监控任务查询2号邮箱,即信号处理模块是否给它发送有消息,因信号处理模块尚未运行,2号邮箱为空,监控任务退出运行态,并转入等待态,以确定下一个信号处理模块的等待时间。信号处理模块获得CPU控制权,读出消息后转入运行态。其余模块的运行依此类推。当所有模块均运行一次后所有任务状态又变为就绪态,开始下一周期的运行。图3是系统运行过程的示意图。

[img]200691310482747542.jpg[/img]
在正常情况下,由于系统监控任务只是查询消息,程序执行时间很短,甚至可以忽略,由于输出模块的优先级排在第二。所以,只要液晶显示和键盘扫描任务进入就绪态,就可以得到及时响应,程序运算量大造成的键盘响应迟钝问题可以得到较好地解决。对于数据处理模块,可在中断服务程序中将其强制进入就绪态,因其优先级设定较高,中断结束后数据处理模块就会被立即执行。这样可以把中断响应时间限制在容许的范围内。


采用上述邮箱监控任务的设计思想,将μC/OS-II 移植到C8051F060芯片中[5],设计开发了电磁流量计的整个软件系统。该流量计支持Modbus、HART、Profibus PA等通讯,可以利用RS232通讯进行参数设定,具有双向流量累积、可编程电流输出、频率输出及报警等功能。工程实践表明,用该设计方法将应用问题分解成多个子模块,可使程序开发变得更容易,并便于系统维护,提高了开发效率,缩短了开发周期,杜绝了关键事件处理在时间上的延误,提高了系统的实时性和稳定可靠性。


[B]5 结束语[/B]
在仪器仪表软件系统设计中,每种具体的仪器仪表可根据其特点和功能的不同,将仪器仪表系统中的软件系统分成不同的任务,其任务优先级的设定应充分考虑该仪器仪表的要求,根据实时性、稳定性和灵敏度等综合因素进行设计。设计者应根据需要,从任务调度、内存管理、内存开销、任务切换时间、最大中断禁止时间等诸多要求选择实时操作系统。合理地利用实时操作系统的高效调度和管理功能,可为仪器仪表软件系统的设计带来新的突破,以进一步提高系统实时性与可靠性。


值得注意的是,如果仪器仪表功能相对简单,数据处理程序并不复杂,引入实时操作系统μC/OS-II就未必合适。因为采用μC/OS-II实时操作系统,要占用更多的资源,任务切换也需要花费一定的时间,相对而言,解决问题的方案也未必是可取的。


本信息来自网络,不代表中国自动化网观点

 
举报收藏 0打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  隐私政策  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  RSS订阅