基于NucleusPLUS的嵌入式系统的软件设计
扫描二维码
随时随地手机看文章
摘 要:本文介绍了离子迁移谱仪的工作机理、软件系统设计以及嵌入式实时多任务操作系统(RTOS)Nucleus PLUS,重点介绍后者在离子迁移谱仪中的具体实现。 引言 现今社会,毒品走私比较猖獗,对人民的生命财产、社会稳定构成了一定的威胁,同时大气监测以及对有毒气体的监控也是刻不容缓的。所开发的离子迁移谱仪,是一种利用IMS(离子迁移谱技术)的专用探测仪,它在确定的温度、气压、电场条件下,通过精确测定离子在电场作用下穿过固定距离的迁移时间,来认定被测可疑物质中是否具有某些化学成分的分子,并对某些特殊的化学物质能够发出报警信息,从而可用来检测毒品及有毒气体。 该系统的工作原理如下:通过细节匹配,对离化后物质的等离子图的波峰位置(即物质的迁移时间)的提取来鉴定物质的具体成分。系统的原理框图如图1所示。 离子迁移谱仪需要读取实时数据,并作分析、处理,要求每25ms处理1000个离子信号数据,具有一定的实时性。同时,它还需对离子管内的温度、气压、电压等参数进行读取、控制。设备分析时,要求能迅速地判断出物质的成分(不超过20秒),而此过程中,涉及到大量的实时数据处理。可见离子迁移谱仪嵌入式系统对容量和速度要求较高,不仅要实时数据处理,还要对多个参数进行控制。为了保证系统的可靠性,提高开发效率,在离子迁移谱仪中必须引入嵌入式实时操作系统。 嵌入式RTOS选择 可用于嵌入式系统软件开发的操作系统很多,但关键是要选择一个适合的嵌入式实时操作系统。在离子迁移谱仪实时系统的设计中,我们对嵌入式RTOS的要求如下: (1)实时性 (2)稳定性 (3)内核规模较小 综合考虑各个因素,我们选择了嵌入式实时操作系统Nucleus PLUS。NucleusPLUS是美国著名RTOS厂商ATI(AcceleratedTechnologyInc)公司,为实时嵌入式应用而设计的一个抢先式多任务操作系统内核。其95%的代码是用ANSIC写成的,非常便于移植并支持大多数类型的处理器。Nucleus PLUS是一组C函数库,应用程序代码与核心函数连接在一起,生成一个目标代码,下载到目标板的RAM中或直接烧录到目标板的ROM中执行。在典型的目标环境中,Nucleus PLUS核心代码区一般不超过20K字节大小,内核规模非常小。 Nucleus PLUS内核的系统结构 从图2可以看出,利用Nucleus PLUS开发平台,用户只需编写任务代码和中断服务程序代码,在任务代码和中断服务程序代码中利用系统调用实现和Nucleus PLUS的交互,由Nucleus PLUS来调度多个任务并行执行,实现CPU的共享。由于NucleusPLUS根据优先级和时间片方式来共享CPU资源,所以只要任务和中断服务程序的优先级设置得当,系统的实时性就能保证。 [!--empirenews.page--] 各个任务之中,只能有一个任务处于运行状态;处于挂起状态的任务可以被某些系统调用或事件激发而转到就绪状态;处于执行状态的任务被高优先级抢占之后也处于就绪状态;就绪状态除了对CPU的控制外,该任务已经获得了运行所需的一切资源。 任务的调度 Nucleus PLUS对任务的调度有两种方式,优先级调度和时间片调度。如图3所示。当一个更高优先级的任务就绪时,Nucleus PLUS中断低优先级的任务,保存现场,并先运行更高优先 级的任务,这就是抢占。通过优先级调度可以保障高优先级的任务优先运行。相同优先级的任务间也可以采用时间片的方式轮流使用CPU资源,用户只需指定每一个任务的时间片大小,Nucleus PLUS通过时钟中断来计算任务的运行时间,当任务的时间片耗尽后,Nucleus PLUS会自动进行任务切换。NucleusP LUS对任务的调度利用类似双向链表数组TCD_Priority_List数据结构实现。 系统软件设计 建立BSP 软件功能描述及多任务功能划分 a1每10ms完成一次串行A/D采样,对内部的16个通道采样数据保持同时采样。实时要求较高。 依据DARTS设计方法,对这些功能要求,我们总共划分以下十个任务: 以NucleusPLUS为开发平台,首先以Application_Initialize(void*first_available_memory)为入口点,以上各个任务均在这里定义,其中的多通道数据采集、实时控制、以及分析任务用定时器来实现,键盘扫描用中断实现。 [!--empirenews.page--] 等离子图处理及波峰位置提取算法 对等离子图处理将直接影响迁移时间的提取,该部分是软件实现的难点之一。一个周期内采样的离子信号所产生的等离子图,往往具有干扰,含有许多毛刺,无法正确判断出波峰,也就无法得到迁移时间。为此,我们一个周期取1000个采样点,首先采用算法平均滤波法,对多个周期的采样信号做算术平均:y[i]=(y1[i]+y2[i]+⋯+yn[i])/n,去除随机干扰信号;而后,采用横向平均滤波法:y[i]=(y[i+1]+y[i+2]+⋯+y[i+m])/m,减少等离子图上的毛刺;在此基础上,再将多个由上述方法得到的y[i]值作平均。经过采样值的多次处理后,可得到相对清晰的等离子图。而要正确提取波峰位置,关键是要找出波峰。对波峰的提取,并非找最优值问题,因为当物质含有多种成分时,会出现多个峰,根据物质的基本性质,其所含成分一般不超过20种,所以需找出最多20个波峰。另外,处理后的等离子图也不是毫无毛刺,相距几十微秒的两个峰往往只有一个是真正的峰。为解决这一难题,我们首先找出第一个波峰,采用试探法测出这个峰的大致宽度,再找出假想的第二个峰,若两个波峰之间的距离小于第一个波峰的宽度,则认为第二个峰只是第一个峰的一个毛刺,抛弃第二个峰,继续找,否则,保留第二个峰,继续找第三个波峰,此时以与第三个峰相邻的峰的宽度作为比较对象;依此类推,直到找完所有的波峰为止。其中,用试探法测波峰宽的程序部分如下: …… 实时操作系统内核的多任务机制不仅可以满足应用系统的实时性要求,而且简化了系统的开发设计过程,可以将一个复杂的问题分解成多个子问题,用任务来实现。在一定程度上保证了离子迁移谱仪的实时性和可靠性。但在实时多任务系统设计时,任务划分却是一门艺术,不同的人对同一系统的任务划分会不同,导致系统的性能也有所差异。究竟该如何划分任务,也需要在实际开发实时系统时不断地总结。本文主要介绍了基于Nucleus PLUS的离子迁移谱仪嵌入式系统的设计,在不久的将来,它将在毒品、爆炸物等探测领域发挥用武之地。
关键词:嵌入式;实时操作系统;任务;迁移时间
使用时,必须保证进程调用和处理的快速性,因为检测的样品信息需及时分析处理。
作为系统设计的软件平台,需要具有相当的稳定性。从而保证离子迁移谱仪检测系统即使在多变的外部环境下如气压、温度等,也能够正确执行预定的动作。
由于整个系统的硬件资源有限(我们配备了2M的FLASH),因此源代码必须足够的小,以便写入存储器,提高运行效率。
Nucleus PLUS的特点
Nucleus PLUS的系统结构如图2所示。Nucleus PLUS内核的主要目的是管理实时任务的竞争运行,为应用提供各种便利,快速响应外部事件,实现实时性。Nucleus PLUS为系统开发提供以下支持:多任务管理,任务之间可以按照优先级和时间片方式来共享CPU资源,通过邮箱、队列和管道进行通信,任务之间的同步和互斥通过信号量、事件组和信号进行;NucleusP LUS提供动态和分区内存两种存储器管理机制,还提供定时器来处理周期性事件及任务的睡眠和挂起超时。Nucleus PLUS将这些机制称之为软件组件,它为每一个软件组件提供了一系列的系统调用,任务与Nucleus PLUS的交互是在系统调用的界面上进行的。
多任务管理
Nucleus PLUS实时操作系统中的任务(task)相当于分时操作系统中的进程。在NucleusPLUS操作系统中,任务可划分为5种基本状态:运行状态、就绪状态、挂起状态、终止状态和完成状态,具体见表1所述。
根据RTOS的编程模型,软件设计分两步走,首先建立BSP。即根据目标环境进行系统配置,建立板级支撑程序BSP(相当于标准PC的BIOS)。主要完成系统初始化及与硬件相关的设备驱动,引导目标机硬件到一个确定的状态。分别以Board_Init(),INTInitialize(),UARTInit(),LCDInit()等来实现。
根据离子迁移谱仪的工作原理,软件必须实现实时数据采集(离子信号和各通道模拟量)、实时控制(离子管上温度的恒定控制、维持气路的恒定流量、还包括对系统中的高压电源、整机电流、整机温度、试纸状态等实时跟踪和控制)、键盘响应、菜单图形显示以及与PC机的通信接口等模块。其中前面2个模块的功能与时间密切相关,下面将功能具体化:
b1采用CPLD每25ms开启一次门信号,采集1000个离子信号数据。实时要求很高。
c110ms完成一次各个温度控制规律的计算,使各个温度维持在设定的点上。
d1用户按下分析键后,几秒内解析馆内温度需达到的预定点,并且整个分析需在20秒内完成。
e1对用户通过键盘下达的命令及时给与响应,并在液晶屏上给出对应的显示。
1对检测到的违禁成分立即给予报警。
g1与PC机进行通信,通过PC机能够对存于串行flash中的样本库、工作参数等进行修改,或者对其存储的样本库及报警结果传送到PC机上。
MainTask:主任务,负责从主队列中收消息,根据消息类别与其他任务通信,激活不同的任务。
UITask:图形界面显示任务。
MCTask:多通道数据采集任务。
RCTask:对温度的实时控制任务。
MVTask:数据搬移任务。
ANTask:分析处理任务。
ALTask:报警处理任务。
AVTask:等离子图处理任务。
KBTask:键盘扫描任务。
SCTask:与PC机通讯任务。
if(PeakPosition[maxm-1]>PeakPosition[nearest])
{low=PeakPosition[nearest];high=PeakPosition[maxm-1];}
else
{low=PeakPosition[maxm-1];high=PeakPosition[nearest];}
for(m=low;m<=hight;m++)
if(SignalStrength[m]>=Pvalue)
Pinstant=SignalStrength[m];
if(Pinstant==Pvalue)
{
maxm-=1;
Pwidth+=10;∥波峰的宽度增加
width[nearest]=Pwidth; }
……
找出了波峰、波峰位置后迁移时间也就容易获得了。
结束语