光缆保护系统快速性和可靠性的软件设计
引言
为保障光纤通信网络畅通,减小阻断损失,必须对网络进行切实有效的维护。与传统手工维护方式不同,光缆保护系统是一种智能化的光缆维护解决方案,它同时具备了故障监测、预警告警、自动切换保护、应急调度等控制保护功能,可在不影响正常通信的情况下对光缆状况进行实时监测,在发生光缆故障时能立即将通讯链路自动切换到备用光缆上,保证通讯链路的持续畅通。
光缆保护系统必须常年不间断运行,对突发光缆故障要以毫秒级速度进行通信信道切换保护。因此,光缆保护系统的首要设计目标就是使系统做到反应快速、稳定可靠。光缆保护系统的软件运行于保护设备中,负责实现光缆监测和自动保护功能,针对系统运行的环境特点和功能要求,软件必须围绕着保证系统运行的快速性和可靠性进行设计。
1 快速性和可靠性的软件设计
1.1 软件设计的硬件基础
硬件是软件运行的载体与基础,与软件设计紧密相关。光缆保护系统在硬件电路上采用最优化的soc设计方案,在一定程度上减小了软件代码长度,降低了软件设计的复杂程度,相对提高了软件的可靠性。
图1为soc设计方案的硬件电路原理框图,硬件电路主要由电源供电电路、光电变换和对数放大电路、单片智能转换器soc、cpld译码及控制电路、外围控制及指示电路等组成。其中,软件驻存于单片智能转换器soc内,负责数据采集和处理及对外围电路进行控制;光电变换和对数放大电路负责将输入光信号转换为电压信号供adc采集;cpld译码和控制电路负责地址译码及光开关驱动控制;外围控制及指论文联盟http://示电路负责人机接口及运行状态指示。www.133229.CoM
图1 硬件电路原理框图
单片智能转换器soc是硬件系统的核心,除mcu内核外,内部还集成了众多功能电路。soc片上集成了62k字节非易失性闪速/电擦除rom,256字节的片内ram及2k字节的扩展片外ram,4k字节非易失闪速/电擦除数据存储器,如此容量的存储器能满足大多数场合的应用。soc片上集成了一个采样率高达420khz的高性能的8通道12位自校准adc,可胜任大多数的数据采集工作。soc片上还集成了双路16位pwm输出、wdg看门狗定时器、tic定时间隔计数器、3个定时器/计数器、串行端口(spi、i2c、uart),非常方便功能扩展。另外,soc片上还集成了锁相环(pll)电路和可编程时钟分频器,使用外部32.768khz晶体,由片上锁相环可产生高到16.78mhz的时钟频率,通过分频器进行分频,可为用户系统提供合适的工作时钟。如此高集成度的单片智能转换器soc本身可看作是一个高性能的数据采集系统,使得硬件电路上无需额外设计诸如数据采集、程序存储、数据存储、定时器、看门狗复位等电路,极大降低了电路设计的复杂度,同时也相应减轻了软件设计的难度,提高了软件的可靠性。
1.2 软件设计
光缆保护系统的核心任务就是实时监测通信光缆传输功率的变化和快速可靠地自动进行光开关切换。由于保护速度要求为50ms,光开关切换需要占用10~20ms,数据采集和处理的速度则应控制在30ms以内。为此,要求软件设计做到数据采集和处理的快速性和光开关切换的可靠性。
光缆保护系统在软件设计上将数据采集速度的目标设定为1ms,以实现光缆的实时监测。为做到这一点,首先通过软件配置soc使其工作频率达到16.78mhz,以高达0.06us的指令执行速度来保证软件运行的快速性;其次,使soc片内集成的adc以高达420khz(即单次转换时间最大为2.38us)的采样率进行数据采集。由于adc转换速率较高,soc必须在2.38us的极短时间内将数据读出并存储于数据区,以便后续处理,否则下一个采样数据有可能丢失。若采用常规的中断方式读取大量的转换数据,则跳入中断服务子程序会耗时较多,无形中延长了数据采集和处理的时间。为快速稳定的获取数据,最后,在软件上将adc设置为dma工作模式,使其可以在无需软件指令干预的情况下,自动进行连续转换并将捕获的采样值直接置入外部数据空间,这样即可以节省时间,又能保证数据的可靠性。
在光缆保护系统中,当adc被设置为dma工作模式时,对片外数据存储器的设置如图2所示。
图2 dma工作模式下的片外数据存储器设置
其相对应的adc初始配置代码如下:
void initadc(void)
{
unsigned int xdata *p;//指向片外存储器的16位整型数指针
//ch2
p=0x0000; //片外数据存储地址赋值
*p=0x2000;//adc转换通道设置
//ch5
p=0x0002;*p=0x5000;
//temp sensor
p=0x0004;*p=0x8000;
//ch3
p=0x0006;*p=0x3000;
//no conversion
p=0x0008;*p=0x3000;//无效转换
//stop command
p=0x000a; //片外数据存储地址赋值