引言
随着IT技术、电子技术、通信技术、以及自动控制技术的飞速发展,对工业现场数据的高速实时采集就成为电子产品和工业控制技术发展不可避免的一个环节。
本文针对高速实时多任务数据采集中的多任务实现算法以及实时性、实效性和高速性的要求,提出了基于ARM9和μC/OSII操作系统的智能化设计方案,实现了任务优先级动态调度、系统工作参数动态设定、系统内部软件智能化设计,针对低速外围设备进行了系统优化,并提高了系统可靠性改善了内部任务同步性。
1 整体电路设计
整个采集系统的硬件电路如图1所示。首先利用多路调制电路对12路信号进行调制,这部分包含相应的信号转换、抗干扰、以及初步的信号处理等,使得各路采集信号能够达到ARM9内核对信号采集的要求。经多路选择和ADC采样后进入ARM9内核。为了实现对整个系统工作状态的实时监视、实时控制和实时调节,设置了上位机监视器和现场显示触摸屏,将用户所有要求显示的信息在上位机显示输出或者在现场LCD同步显示输出。采样按照采样频段分为高频段(300~200 ksps)、中频段(200~100 ksps)、和低频段(小于100 ksps)3个频段,每个频段由4个外部采样通道组成。ARM9内核与上位机的通信利用UART和RS232转换电路来实现。系统工作电源由统一的电源供给,在实现电压转换后对PC机和ARM9内核以及相应的工作电路提供电源支持。
图1 数据采集系统硬件电路
2 系统总体软件设计思路
系统的软件设计原理如图2所示。12路采集信号经调制电路多路选择和ADC采样后进入各个采集任务内部通道。每一路采集通道都设计独立的数据采集、数据存储、数据处理以及数据提交任务。也就是说,每一路外部采集通道都对应一个独立的内部数据通道,而且本通道数据只在本通道内进行存储、处理和传递。各个内部数据通道任务之间只有在系统调度时执行时间上的先后关系、优先级关系,没有数据耦合关系。
图2 系统软件设计原理图
命令扫描部分由独立的上位机和下位机扫描任务完成对上位机监视器和下位机触摸屏的实时监控,一旦检测到用户命令,立即将其发送给命令解析和处理任务,由该任务对用户命令进行分析处理。命令处理完后将提取的结果发送给用户要操作的采样通道,使之按照用户要求运行。
各个频段的各个通道采集任务均设置两个数据缓冲区。双数据缓冲区为采样任务顺利存储提供了双重保证,使得采样工作一旦结束就有可用缓冲区,就可立即将数据存储而后进行下一次采集。也使得后续的数据处理任务减少数据等待时间,能迅速得到当前采样通道需要处理的数据,并在最短的时间内处理发送给下一级任务。
采样、数据显示、命令扫描都涉及外围设备,是整个系统所有任务里面运行速度最慢的,针对采样任务设置双数据缓冲区可以很大幅度地改善由于采样速度慢而造成的系统速率下降问题,显示和命令扫描部分的优化设计将在下文中详细说明。
3 内部软件调度算法
系统内部各个频段命令如图3所示。命令扫描函数捕捉到用户命令后,对用户命令进行验证、分析、提取,而后将提取结果以广播的方式发送至各个频段的命令等待队列。该队列如得到新的命令,将用户命令发送给本队列下辖的各个采样任务函数,用户命令将立即得到执行,包括通道切换、变换采样周期、改变当前任务优先级、显示特定通道数据等。如没有得到新的命令,等待超时后采样任务按照原有方式继续工作。这也是一种智能化设计,以很简单的方式实现了按照用户命令随时对任何通道的查看、监督、操作、工作状态切换、通道切换、由单通道到所有通道并行实时采集切换等所有功能的任意切换。
图3 各个频段内部命令
3.1 任务优先级设置及采样任务优先级动态调度
μC/OSII操作系统是基于优先级的抢占式操作系统,所有任务必须有各自独立且唯一的优先级[1]。命令扫描和数据显示分别设置为最高优先级和最低优先级。扫描函数的最高优先级可以确保随时对用户命令进行响应,而显示任务由于其运行速速慢,将其设置为最低优先级。只要系统设计合理,适当避免低优先级任务的饥饿现象,即可实现将用户有效信息显示输出。
内部优先级设置规则是,低频段、中频段、高频段3个频段的任务之间优先级依次递减。低频段的采样周期明显比高频段长,在低频段数据采集的空闲时间里系统可以顺利地将CPU使用权切换给其他任务,使其他任务得到CPU使用权并执行。每个频段内部的各个任务的优先级从采样到数据存储、数据处理、数据提交依次递减。
为了使得整个系统实现优先级动态调度也可以修改其他采样参数,在软件设计时将所有频段采样任务的优先级、采样周期以全局变量的形式在进入操作系统之前进行设置,并将其定义为volatile格式分配独立的变量存储地址。而后设立独立的扫描任务,来专门完成这些参数的判断、修改、存储和动态更新。这样便使得系统除了可以按照根据采样周期设计的初始化优先级和初始化参数运行外,还可以依据用户自身需要对各个频段、各个通道的采样任务优先级以及采样频率进行设置和修改。修改完并确认后,修改任务会保存、更新当前系统工作参数并退出操作系统,而后重新启动并初始化,整个采集系统将按照全新的状态开始工作。当然,在这里用户优先级和采样周期设置是受限的,必须符合上文提及的优先级规则及各个频段对采样周期的要求。
3.2 任务时限设置
为了对整个系统的时间调度进行优化,首先说明几个内部工作时间。i386体系和Linux2.5内核中操作系统节拍率都设置为1000 Hz[2]。在这里将μC/OSII操作系统调度时间OS_TICKS_PER_SEC也设置为1000,也就是说操作系统的任务调度以ms为单位。ARM9内核CPU工作频率设置为400 MHz,即CPU机械周期以ns为单位。外设包括上位机命令扫描和上位机、下位机显示部分工作都以s为单位。μC/OSII系统中任务切换、调度及延时都以系统节拍率为单位,而内部代码的运行是以机械周期为单位。内部任务时限可以以节拍律为单位,也可以以实时时间为基准,获得一个绝对时间差。
单个采样任务通道内部只有采样任务需要时限设置。为了达到智能化,用消息队列的等待延时替代了采样任务时限,而该延时便是本通道的采样周期。其他的后续任务包括内存开辟、数据处理、数据发送,都依次等待上一级任务消息,受上一级任务钳制不设置任务时限。显示任务时限按ms设置为绝对时间差。
3.3 针对外设的时间优化
针对命令扫描和解析任务,将其设置为中断方式,在检测到有用户命令输入时发生中断,在中断里对用户命令进行解析、分析、提取和处理。在中断下半部分对命令进行广播式发布,发布到各个采样任务函数使其立即刷新执行。因为用户工作方式改变,命令刷新频率并不高而且任务量不大,所以完全可以利用中断的快速处理来实现这种功能。
图4 显示任务工作原理图
在处理完命令扫描和采样任务之后,影响整个系统性能的就剩下上位机和下位机显示部分了。显示任务工作原理如图4所示,利用μC/OSII系统提供的消息队列对显示部分进行改善。分别建立两个长度为16的消息队列和内存块链表,数据提交任务从空闲内存池中得到可用内存块之后将本任务要显示的数据存入该内存块,此时该内存就变成了带有数据的待显示数据块。而后将该内存块的地址以消息的形式注册在显示消息队列上。消息队列的长度设置为16,虽然这里只有12个任务会发送消息给消息队列,但在实时多任务程序中,各个任务的运行是随机的,消息队列在一段时间内得到的消息个数是个不定值,所以留出4个空位作为裕度。而且设置初始值为16的计数信号量来保护消息队列,数据提交任务在提交数据之前先检测该信号量,如该信号量有效就可以发送信号,如信号量无效则需等待,直到有可用信号位时方可将信号发出。在外部硬件操作端,由外部发送任务将消息队列中的消息按照固定速率发送到外部信号线上。
这样设计,消息队列就相当于一个缓冲区,使得所有提交任务都可以向这个缓冲区发送待显示数据,有效地避免了多个任务争用一个外围设备而引起的死锁、竞争冒险等问题。同时减少了任务数量,减少了任务切换的次数,充分利用了系统时间,提高了系统性能。
3.4 关键区保护
多任务设计中每个任务在任何时刻都可能被其他任务打断,必须充分考虑代码的安全性、可重入性、可靠性、饥饿、互锁、死锁等情况。
为了避免上述情况,任务间消息发送和传递时以及在数据采样时对相应函数体进行关键区保护,在这些函数运行的时候禁止中断和任务调度,以保证数据传递和数据采样的绝对正确性和系统运行的绝对安全性。
4 极限频率测定及总结
上位机超级终端接收到的极限频率测试结果如图5所示。
图5 极限频率测量结果
分别测试了高频段、中频段和低频段的极限频率,结果在CPU使用率80%~90%的情况下测定。该系统成功实现了智能化设计和优先级动态调度、系统参数动态设置等功能,达到了设计指标。