1 uC/OSII与ARM系统简介
电力系统微机保护在国内发展近20年,随着计算机技术的迅速发展,微机保护也从原来前后台的程序设计方式,进入到采用实时多任务操作系统时代。
嵌入式操作系统uC/OSII是一个占先式多任务操作系统,它具有可移植性强、裁剪性好的特点,程序执行时间具有可确定性,内核调度开销小,系统稳定可靠。因此该操作系统适合应用于电力系统中低压微机保护装置。
ARM嵌入式系统具有以下特点:
① 其架构是32位的RISC,开放性非常好。它是由ARM公司将其技术授权给世界上许多著名的半导体和OEM厂商,生产出各式各样以ARM为内核的芯片。
② ARM芯片支持JTAG调试,调试方便。
③ 有些厂家又将ISP(系统在线编程)功能作为固件做在ARM芯片的BOOT扇区内,从而方便用户程序的升级。电力系统微机保护越来越向小型化发展,ISP功能在软件升级和维护方向具有很高的应用价值。
④ 很多ARM芯片内置大容量Flash,外设资源非常丰富,便于系统的小型化,可提高系统的性价比。
由此可见,ARM系统也非常适用于中低压微机保护装置。将ARM平台与uC/OSII实时多任务操作系统整合在一起作为微机保护装置的平台,能够充分发挥两者的优点,具有很强的生命力。
2 精确定时问题
将uC/OSII操作系统用于微机保护装置中,不可避免地要遇到精确定时的问题。为了保证微机保护装置交流量计算的准确,要保证交流电量的A/D采样中断间隔的精确。
对于实时多任务操作系统,实现任务间通信最简便的办法是使用共享数据结构。特别是当所有的任务都在一个单一地址空间下时,这种处理特别简便。如果能够使用变量(如全局变量、指针、缓冲区、链表以及循环缓冲区等),使用共享数据结构通信就更为容易。虽然共享数据区法简化了任务间的信息交换,但是必须保证每个任务在处理共享数据时的排它性,以避免竞争和数据的破坏。与共享资源打交道时,使之满足互斥条件最简单的方法是采用关中断,uC/OSII操作系统也采用了此方法。
为了保证操作不出错,uC/OSII操作系统内核运行对一些临界区的变量操作之前要调用OS_ENTER_CRITICAL()关中断;对这些变量修改完成后,再调用OS_EXIT_CRITICAL()开中断。这就带来一个问题,正常情况下,会造成A/D采样中断也会被禁止,导致各个采样点的时间间隔不一致,也就无法保证交流量计算的正确性。
3 解决方案
3.1 FIQ快中断
为解决本问题,先来分析一下ARM芯片中断的特点。ARM芯片具有两种中断类型: IRQ中断和FIQ快中断。快中断是为支持数据传输或快速数据通道而设计的,它有以下特点:
① 快中断被设为最高中断优先级。
② 在快中断模式增设了7个私有工作寄存器,从而避免了由于主工作寄存器数据的保存和恢复而带来额外开销。
③ 快中断处理程序处于异常向量表的最后位置,因此可紧接异常向量表书写快中断处理程序,而不必进行程序跳转操作,避免了刷新指令流水线和高速缓存。
这些特点可保证快中断的响应速度最快,并且进入/退出快中断程序的时间开销最小。根据此特点,选择快中断作为A/D采样的中断。
3.2 精确定时方案
为使采样中断间隔不受uC/OSII操作系统影响,采用以下措施:
① 改进uC/OSII中移植文件os_cpu_c.c中的OS_ENTER_CRITICAL()和oS_EXIT_CRITICAL()两个函数,保证快中断不受这两个函数影响。
② 在A/D采样的快中断函数中,只对A/D采样缓冲区进行写操作,快中断以外的中断或操作系统任务只对A/D采样缓冲区进行读操作,以保证没有临界区的数据产生。
③ 其他所有中断都采用IRQ中断。
3.3 CPSR程序状态寄存器
ARM的程序状态寄存器为CPSR,它可以控制IRQ和FIQ中断的允许与中断。CPSR的各位如图1所示。
图1 程序状态寄存器
中断禁止位包括I和F位:当I位置位时,IRQ中断被禁止;当F位置位时,FIQ中断被禁止。
因此,uC/OSII操作系统只控制I位(而不控制F位)来解决A/D采样中断间隔定时问题。
3.4 开中断、关中断函数
要实现开中断、关中断函数,涉及uC/OSII操作系统的两个文件: os_cpu.h和os_cpu_c.c。
首先在os_cpu.h中定义:
__swi(0x02) void OS_ENTER_CRITICAL(void);
/*关中断*/
__swi(0x03) void OS_EXIT_CRITICAL(void);
/*开中断*/
然后在os_cpu_c.c中实现OS_ENTER_CRITICAL和OS_EXIT_CRITICAL函数。这两个函数的功能在软件中断服务程序中实现,OS_ENTER_CRITICAL对应2号软件中断,OS_EXIT_CRITICAL对应3号软件中断。本文给出宏定义NoInt为0x80,即它只控制I位。
#define NoInt0x80
void SWI_Exception(int SWI_Num, int *Regs) {
OS_TCB*ptcb;
switch(SWI_Num) {
case 0x02:
/*关中断函数OS_ENTER_CRITICAL()*/
__asm{
MRSR0, SPSR
ORRR0, R0, #NoInt
/*“或”操作,禁止IRQ中断*/
MSRSPSR_c, R0
}
OsEnterSum++;
break;
case 0x03:/* 开中断函数OS_EXIT_CRITICAL()*/
OsEnterSum;
if ((OsEnterSum&0x0000ffff) == 0) {
__asm {
MRSR0, SPSR
BICR0, R0, #NoInt
/* BIC位清除指令,将NoInt求反后按位
“与”R0*/
MSRSPSR_c, R0
}
}
break;
}
}
4 实现与测试
4.1 硬件方案
选择NXP(原Philips)公司的ARM芯片LPC2292作为微机保护测控装置的CPU,它主要具有以下特点:
◆ 256 KB片内Flash 程序存储器,128 位宽度接口/加速器实现高达60 MHz 的操作频率;
◆ 可外扩总线,外部8、16 或32 位总线(144 脚封装);
◆ 支持片内Boot 装载程序实现ISP 和IAP;
◆ 2 个互连的CAN 接口,带有先进的验收滤波器;
◆ 2 个32 位定时器(带4 路捕获和4 路比较通道);
◆ PWM 单元(6 路输出);
◆ 多个串行接口,包括2 个16C550 工业标准UART、高速I2C 接口(400 kHz)和2 个SPI 接口;
◆ 通过片内PLL 可实现最高为60 MHz 的 CPU 操作频率。
为了便于验证测试结果,本文选用LPC2292的PWM脉宽调制器,它具有一个带可编程32位预分频器的32位定时器/计数器,并支持双边沿控制的PWM输出,而PWM定时中断产生而引发的PWM输出不用CPU干预,电平翻转时间精确,可以利用该信号作为A/D采样间隔的测试信号。
采用100 MHz的逻辑分析仪检测PWM输出,可以实测到A/D采样中断间隔。
4.2 软件实现
对微机保护测控装置,采用每个工频周期(50 Hz)采样32点数据,即A/D采样间隔为625 ms。
本文在PWMInit函数中实现了对PWM定时器的初始化、对PWM输出引脚的配置,开放PWM定时中断。
//初始化PWM0,A/D采样FIQ中断
void PWMInit(void) {
PINSEL1 = (PINSEL1&0xFFFFF3FF) | 0x00000400;
//将LPC2292的P0.21引脚配置为功能脚PWM5
PWMPR=0x00;
//PWM预分频计数器
PWMMCR =0x0000003;
//PWM匹配控制寄存器。D0=1,PWMMR0中断允许;
//D1=1,PWMTC复位允许
PWMMR0=Fpclk*20/32/1000;
//设置PWM周期,即采样周期 32点采样,Fpclk为CPU
//的外设频率
PWMMR5=Fpclk*20/32/1000/2;
//PWM占空比,用于测试FIQ的响应时间,翻转是PWM
//周期的一半
PWMLER = 0x21;//PWM锁存使能寄存器
PWMPCR = 0x2000;
//PWM控制寄存器。D13=1,使能PWM5输出;D5=0,
//PWM5选择单边沿控制模式
PWMTCR = 0x09;
//D3=1,PWM模式使能; D0=1,PWM定时器计数器和
//PWM预分频使能计数
VICVectAddr = 0;
PWMIR = 0x000070F;//复位PWMMR0~PWMMR6中断
PWMTC = 0;//PWM定时器计数器清0
VICIntEnable = 1 << 8;//允许PWM0中断
}
软件还包括uC/OSII操作系统、A/D采样程序以及有关交流电量计算任务等程序。
在系统运行后,使用逻辑分析仪检测到: PWM输出脉宽最大为625.94 μs,最小为624.23 μs,定时误差在μs级,完全满足微机保护测控装置要求。逻辑分析仪检测波形如图2所示。
图2 逻辑分析仪检测波形
如果关中断将IRQ中断和FIQ中断都禁止,则检测PWM脉宽最大误差为18 μs,这会给测量精度带来很大误差。
5 结论
本文讨论使用ARM芯片、uC/OSII操作系统来实现微机保护测控装置的可能性,针对使用操作系统会带来A/D采样间隔时间不准的问题,给出了解决方案和验证结果。本技术已在微机保护装置上得到实际应用,交流量的测量精度取得很好的结果。
如果使用其他操作系统时遇到精确定时问题,也可参考本文的解决方案。