DSP(数字信号处理器)在现今的工程应用中使用越来越频繁。其原因主要有三点:第一,它具有强大的运算能力,能够胜任FFT、数字滤波等各种数字信号处理算法;第二,各大DSP厂商都为自己的产品设计了相关的IDE(集成开发环境),使得DSP应用程序的开发如虎添翼;第三,具有高性价比,相对于它强大的性能,不高的价格有着绝对的竞争力。
TI为本公司的DSP设计了集成可视化开发环境CCS(Code Composer Studio),而DSP/BIOS是CCS的重要组成部分。它实质上是一种基于TMS320系列DSP平台的实时操作系统内核,也是TI公司实时软件技术——eXpress DSP技术的核心部分。DSP/BIOS主要包含三方面的内容:多线程内核、实时分析工具、外设配置库。
1 系统功能需求
电能质量监测终端主要功能是对电网(三相电压、电流)的电能质量进行实时监测与分析。其主要监测量有:电压、电流有效值,有功、无功功率,电压频率,三相不平衡,各次谐波电压、电流含有率,功率因素,相移功率因素,电压波动,长时间、短时间闪变。
系统选用TI公司的高性能DSP芯片TMS320F2812作为处理核心,其150 MIPS的处理速度足以满足本系统的实时性要求。按照系统需求,将本系统分成以下功能模块:引导自检模块、采集任务执行模块、电能质量数据预处理模块、电能质量分析运算模块、数据存储模块、通信模块、人机交互模块。按照传统的编程方式,这些功能模块将以顺序结构形式组织在一起,各模块之间的调用和切换都由各模块自身的代码来完成,使得应用程序各模块之间处于一种耦合状态。如果要添加新的功能模块或者修改已有的功能模块,不但要修改与之相关模块的调用代码,而且新增模块也会明显影响到原有系统的时间响应特性,使得升级、维护起来相当麻烦。DSP/BIOS的出现提供了另外一种组织应用程序各功能模块的机制。它将各功能模块作为任务线程来看待,通过可配置的内核服务使各任务线程在系统调度器的安排下按照优先级的高低分时复用CPU资源,各个任务线程之间通过同步、通信、数据交换等进行协调。这种机制使得应用程序可维护性提高,并且提供了更方便、更高级的谪试手段。根据以上特点,本系统采用DSP/BIOS作为实时内核,并以此为基础对整个系统进行设计。
图1为系统在DSP/BIOS下的功能模块分类。
2 基于DSP/BIOS的软件设计
2.1 执行线程规划
系统的实时运行中,一些功能函数由外部控制信号驱动或者按既定周期运行,所以,函数的驱动方式和执行周期对实时系统非常重要。DSP/BIOS支持多线程应用,线程可以定义为不同的优先级。高优先级线程可以中断低优先级的线程,而且不同的线程之间可以实现交互,比如阻塞、通信和同步,线程分为以下4种类型(优先级由高到低):硬件中断(HWI)、软件中断(SWI)、任务(TSK)、后台线程(IDL)。按照电能质量监测终端系统的功能需求,将系统各子功能模块分为以上4种类型线程。
首先,安排硬件中断线程(HWI)。一般情况下,系统的主要程序代码放在软件中断或任务中;但是,与外部设备密切相关、实时性要求很高的功能模块程序代码必须放置在硬件中断中。本系统按照上述要求,将以下几个子功能模块设置为硬件中断线程:A/D采集任务模块和通信模块(接收)。A/D采集是本系统的重要基础,并且与系统底层硬件紧密相连,所以将它设置为硬件中断线程(HWI)。其主要流程是:A/D芯片以一定的频率采集电网的实时数据,然后与DSP的McPSP口进行通信。DSP接收A/D芯片采集的数据,并存储在片内RAM的特定区域,为其他线程的运算作好准备。通信模块采用RS485与上位机通信,其与系统的底层硬件密切相关,而且DSP本身的SCI接口只有最大16个字的FIFO,如不及时对接收数据进行处理,将会造成数据丢失。
下面介绍HWI模块在DSP/BIOS中的参数设置。McBSP串口的接收中断放在HWI模块的HWI_INT6位置上,并且将接收中断的ISR函数ad_rx_isr()填写到HWI_INT6中断的函数调用项中;同时选择使用DSP/RI-OS的HWI调度功能,当响应McBSP串口接收中断时,系统将自动调用ad_rx_isr()函数。McBSP串口接收中断设置如图2所示。与McBSP串口接收中断设置类似,设置SCIA接收中断为通信接收中断,将其ISR函数scia_rx_isr()填写到HWI_INT9中断的函数调用项中。响应接收中断时,系统调用scia_rx_isr()函数进行处理。CLK线程也属于HWI硬件中断线程之一,它为整个系统的运行提供了时间基准,为用户周期性地调用函数提供了方法,同时为一些代码评估工具提供了时间参考。CLK模块完全依赖于DSP的定时器中断,TMS320C2812为DSP/BIOS提供了2个定时器。
其次,安排软件中断线程(SWI)。所有的软件中断都是通过DSP/BIOS内核的API调用来启动的,为了便于控制,系统为每个SWI对象都设置一个16位的邮箱(Mailbox),可以利用这个邮箱的值有条件地启动对应的软件中断。可以将相对于普通任务比较重要的、发生频率比较频繁的子功能模块安排在软件中断线程(SWI)中。其子功能模块包括:电能质量数据预处理模块、通信模块(发送)。电能质量数据预处理模块主要完成对A/D转换结果的后续处理。对A/D转换结果进行预处理是必要的。因为A/D芯片选用固定频率进行采集,但是电网的频率fo是波动的,所以直接对采集数据进行FFT运算会产生频谱泄漏,因此,必须对采集数据进行预处理。例如,对4个周波每个周渡256点一共l024个数据进行1024点的FFT运算。假设4个周波的平均频率为f,则频率分辨率为f/4,FFT运算结果依次为f/4、2f/4、3f/4、f、5f/4……频率上的强度。因此,当电网频率fo发生变化时,进行FFT运算的电网数据频率f也要随之变化,使得进行FFT运算前的电网数据频率f始终与当前电网的频率fo保持一致。电能质量数据预处理模块具体操作是对A/D转换后的数据进行插值,插值算法采用线性插值。经过验证,额定电压下,线性插值算法造成的FFT运算的误差在O.1‰以内。除此之外,该模块还有一个功能就是计算一个周波内的电压有效值。这是计算电压波动和长时间、短时间闪变的必要数据。通信模块(发送)负责向上位机发送数据,虽然其实时性要求不高,但是与硬件底层密切联系,所以设置为软件中断线程。当串口接收中断发生时,调用scia_rx_isr()函数对接收数据命令进行处理,根据相关的命令发送相应的电能质量数据。DSP/BIOS为软件中断对象提供了O~14的优先级,按照上述线程的重要程度,将采集数据处理线程优先级设为14,主机通信线程设为8,其他优先级预留以便将来软件升级。
需要注意的是:中断线程(包括硬件中断和软件中断)都运行于相同的堆栈。当高优先级中断发生导致系统进行任务切换时,高优先级中断线程会中断低优先级中断线程;在运行高优先级中断线程前会保存低优先级中断线程相关寄存器内容,在高优先级中断线程运行结束后,寄存器会恢复为原先的内容,继续完成原先低优先级线程。所以,如果设置硬件中断或软件中断线程过多,则堆栈将会溢出,为此必须将大部分任务模块放置在任务线程中。接下来,安排任务线程(TSK)。如同绝大多数实时系统,任务线程是整个系统的主要组成部分。任务线程中的函数可以独立运行,也可以并行运行。DSP/BIOS任务管理模块根据任务线程的优先级安排运行,并通过切换函数完成从一项任务到另一项任务的转换。每个任务有4种执行状态:运行(run)、就绪(ready)、暂停(blocked)和终止(terminated)。一月任务被创建,它总是处在4个状态之一。DSP/BIOS为每个任务对象提供了-l~15的优先级。任务会按照严格的优先级顺序来执行,相同优先级的任务会按照“先来先服务”的原则来安排执行顺序。需要注意的足,当创建一个任务线程时,需要同时建立一个属于该任务的专用堆栈。该堆栈用于存储奉地局部变量或进一步的函数调用嵌套。
我们将电能质量分析运算模块、数据存储模块、人机交互模块设置在任务线程(TSK)中。电能质量分析运算模块又可以分为谐波计算任务线程、电压波动计算任务线程、闪变计算任务线程3部分。谐波计算任务线程主要负责对电能质量数据预处理后的结果进行FFT运算。FFT运算主要包括位转换运算、加窗运算、以2为基的蝶形运算、分裂基运算、平方和运算5个部分。电压波动计算任务线程负责记录3 min内电网电压的波动情况。前面电能质量数据预处理模块已经得出每个周波的电压有效值,这样,只须记录3min内电压有效值最大值和最小值,两者之差就是电压波动。闪变计算仟务线程包括计算短时间闪变和长时间闪变。现在一般采用IEC闪变仪设计方法,输入适配自检信号通过平方解调器、带通加权滤波、平方一阶低通滤波、在线统计评价4个过程最终得到闪变值;但足此方法复杂、耗时多。通过算法简化,得出一种简单可行的运算方法:对连续256个周波的电压有效值进行FFT运算,结果再经过加权等一系列运算后可以得到12.8s的闪变值,10min内闪变值经过相关运算就可得到短时间闪变,12次连续短时间闪变(2 h内)经过运算可以得到长时间闪变。经过验证,此种算法与IEC闪变仪算法相比,误差在l‰以内。
数据存储模块也放置在任务线程中,其过程是将电能质量分析结果、电压波动以及闪变值存储在FIash中。人机交互模块包括键盘检测任务和液晶显示任务两部分。键盘检测任务线程可以通过周期函数PRD来完成。PRD可以根据实时时钟来确定函数运行的时间。这里,设置键盘检测任务100ms运行1次,检测按键。根据按键情况,液晶显示任务显示当前最新电能质量数据。
最后,就是后台线程(IDL)。后台线程(IDL)的优先级最低,一般,将实时分析模块(TRA)放在其中运行,其可以在应用程序执行期间对DSP应用程序进行实时交互与诊断。CCS巾有CPU负载图、执行图示、主机通道控制、信息记录、统计观察、实时控制板和内核/对象观察等实时分析工具。这一系列功能模块都可以放置在IDL线程中,通过这些工具,整个DSP系统的运行情况将一目了然。
2.2 线程之间的通信与同步
在这个多线程系统中,对共享资源的访问需要线程之间的相互协调来解决。
DSP/BIOS环境下有3种通信方式,即基于管道(PIPE)的通信、基于流(SIO)通道的通信以及基于主机(HST)通道的通信。
表l显示了4种线程共享数据和实现同步的途径。
本系统中,选用数据管道来管理线程之间的数据交换,因为它适用于高速实时或大批量的数据交换。每个数据管道对象保留一个缓存,并将该缓存分成一定数据的定长帧,所有通过数据管道的I/O操作1次处理l帧。多线程之间的同步主要采用邮箱方式。
3 系统实时分析与调试
DSP/BIOS内核本身的开销对系统程序实时性会有影响,为此需要对DSP/BIOS内核进行优化。可以使用CCS中提供的DSP/BIOS分析工具确定DSP/BIOS的开销以及整个应用系统的运算量。比如,DSP/BIOS提供的实时分析工具中的CPU负载图就是常用工具之一。
在最后的集成阶段,由于实时交互等原因,会经常出现一些错误或者响应不及时的现象。一般来说,由于这些现象是非周期性的并且出现的频率很低,因此难于发现和跟踪。然而,由于DSP/BIOS中的RTA模块是嵌入到其内核中去的,再结合开发人员所提供的定制检测向量,从而提供了对错误产生根源的独一无二的町视性。该可视化功能极大地帮助了隔离和修正错误,是一般嵌入式开发系统所不具备的。
可以从下面四个方面提高整个系统中应用程序的执行性能:为不同的程序函数仔细选择线程的类型;把系统堆栈放置在片上内存中;降低时钟中断频率;增加流式输入输出缓冲器的大小。
4 总 结
DSP/BIOS作为CCS提供的一套工具,其本身仅占用极少的CPU资源,但却提供相当高的性能,加快了开发进度。采用DSP/BIOS作为电能质量监测终端实时操作系统,编写DSP程序时控制硬件资源容易、协调各个软件模块灵活,大幅加快软件的开发、调试进度。最终实验证明,整个系统实时性好,运行稳定可靠。(许康平 陈建元 韦海锋)