一种onu升级的方法

文档序号:9923491阅读:1119来源:国知局
一种onu升级的方法
【技术领域】
[0001 ]本发明涉及光通信技术领域,具体涉及一种ONU升级的方法。
【背景技术】
[0002]随着光通信技术的发展,FTTX(Fiber-T0-The-X,光纤接入)终端是目前各大运营商采用的主流接入设备,作为电信级的产品,各大运营商对ONlKOptical Network Unit,光网络单元)的功能要求越来越高,除基本功能外,一般还需要涵盖IPTV(交互式网络电视)功能、三层路由功能、语音功能和WIFI功能等,这无疑会导致ONU软件升级文件大幅度增加,但同时各设备生产商在终端设备ONU上竞争异常激烈,降低ONU硬件和软件成本是运营商在ONU开发时需考虑的重要因素之一,具体例如减小内存容量,选用系统级芯片Soc替代CPU及操作系统、由VxWorks切换到开源免费的Linux等。其中,减少内存容量显然与扩展ONU功能导致的升级文件大幅度增加是矛盾的。
[0003]传统的ONU升级一般处理流程如下:首先,ONU的协议模块(0AM、OMCI或私有协议)收到0LT(0ptical Line Terminal,光线路终端)下发的即将发送升级数据包的命令后,调用升级模块的初始化内存接口函数,分配一段专门用于存放升级数据包的连续的一整块完整内存。然后,ONU的协议模块持续收到OLT下发的升级数据包的分包,并依次复制到之前申请的内存空间。在接收完所有的升级数据包的分包后,OLT的OMCI (ONU Management andControl Interface,光网络单元管理控制接口)模块下发升级数据包传送结束的命令,此时ONU将收到的整个升级数据包的CRC(Cyclic Redundancy Check,循环冗余校验码)校验值算出后,与OLT下发的CRC值进行比较,相同则认为校验通过,否则,认为升级数据包在传输过程中出错。在CRC校验通过后,ONU对升级数据包的头部部分进行分析并获取版本和模块信息后,以flash的分区为单位进行擦写flash升级操作。
[0004]由此可见,传统的ONU升级方法需要连续的一整块完整内存用于存放升级数据包,而当ONU在有大量业务运行的情况下升级时,很有可能因为没有足够的内存而导致升级失败,另外,该升级方法要求在接收完所有升级分片后才能进行擦写flash操作,这样会导致ONU的升级时间过长。

【发明内容】

[0005]本发明所要解决的技术问题是解决传统的ONU升级方法需要连续的一整块内存用于存放升级数据而且在接收完所有升级分片后才能进行擦写flash操作,导致因为没有足够的内存而升级失败和ONU升级时间过长的问题。
[0006]为了解决上述技术问题,本发明所采用的技术方案是提供一种ONU升级的方法,包括以下步骤:
[0007]S1.0NU检测到OLT下发的即将发送升级数据包命令后,初始化用于升级的全局标识变量;
[0008]S2.获取ONU当前使用的分区并擦除其备份分区,申请链表的头结点,并使用全局指针变量记录链表首地址,转S3和S4 ;
[0009]S3.创建第一线程,第一线程循环执行以节点为单位申请内存存储升级数据包,并进行链表维护,直至OLT下发结束命令后退出第一线程,转S5;
[0010]S4.创建第二线程,第二线程循环读取链表并对链表进行处理,包括分块累积计算整个升级数据包的CRC并将升级数据包中的数据写入flash,处理完成后释放对应节点的内存,直至所有升级数据包处理结束后退出第二线程,转S5;
[0011 ] S5.判断升级数据是否成功写入flash,如果成功,转S6;否则,转S8;
[0012]S6.判断累积计算的整个升级数据包的CRC与OLT下发的CRC值是否相同,如果相同,转S7;否则,转S8;
[0013]S7.升级成功,激活备份分区并重启0NU;
[0014]S8.升级失败。
[0015]在上述技术方案中,S3中第一线程的具体执行步骤包括:
[0016]S301.0NU接收完OLT下发的一个升级数据包后,判断该升级数据包的长度加上当前节点中的数据长度是否大于等于当前节点的容量,如果是,转S302;否则,转S307;
[0017]S302.判断当前节点中的定长数组是否被填满,如果是,转S304;否则,转S303;
[0018]S303.用升级数据包中的数据将当前节点的剩余容量填满,并记录当前节点中的数据长度,转S304;
[00?9 ] S304.为当前节点的next节点申请内存,存储升级数据包中的剩余数据;
[0020]S305.对next节点地址进行赋值,进行链表维护,然后将当前节点的填充完成标识置I;
[0021]S306.将next节点切换为当前节点,将升级数据包中的剩余数据填充当前节点,并记录当前节点中的数据长度,转S308 ;
[0022]S307.将升级数据包中的数据依次填充到当前节点中的定长数组,并记录当前节点中的数据长度;
[0023]S308.判断OLT是否结束发送升级数据包,如果是,转S309 ;否则,转S301 ;
[0024]S309.将当前节点的填充完成标识置I,并将当前节点的next节点地址置null。
[0025]在上述技术方案中,S4中第二线程的具体执行步骤包括:
[0026]S401.获取当前节点中的升级数据,并判断当前节点的填充完成标志位是否为I,如果是,转S402;否则,转S401;
[0027]S402.分块累积计算整个升级数据包的CRC,并计算当前节点中数据部分的CRC;
[0028]S403.将当前节点中的数据部分写入flash;
[0029]S404.从flash中回读出写入的当前节点的数据,并重新计算CRC;
[0030 ] S405.判断重新计算的CRC与将数据写入f I ash之前计算的当前节点中数据部分的CRC是否相等,如果相等,转S406;否则,转S410;
[0031 ] S406.获取next节点的首地址并记录;
[0032]S407.释放当前节点的内存空间,并将next节点切换为当前节点;
[0033]S408.判断当前节点是否为空,如果为空,表明链表中的所有节点均已处理完毕,转S409;否则,转S401;
[0034]S409.将整个升级数据包写入flash成功;
[0035]S410.将升级数据包写入flash失败。
[0036]在上述技术方案中,所述ONU检测到所述OLT下发的即将发送升级数据包命令后,释放之前升级过程中由于异常情况发生而未释放掉的线程和链表。
[0037]在上述技术方案中,所述第一线程和所述第二线程并发执行。
[0038]本发明,当ONU接收到升级命令后,同时创建两个线程分别用于接收升级数据包和对升级数据包进行处理,其中第一线程循环执行以节点为单位申请内存存放升级数据包,并以链表的形式进行维护,这样无需一次性申请一大块连续内存;第二线程将填充完成的节点中的升级数据写入flash,写入成功后立即释放该节点的内存,实现了下载升级数据包的同时将升级数据写入flash,既节约了内存空间又缩短了升级时间。
【附图说明】
[0039]图1为本发明实施例提供的一种ONU升级的方法流程图;
[0040]图2为本发明实施例提供的第一线程的具体执行方法流程图;
[0041 ]图3为本发明实施例提供的第二线程的具体执行方法流程图。
【具体实施方式】
[0042]下面结合说明书附图和【具体实施方式】对本发明做出详细的说明。
[0043]本发明实施例提供了一种ONU升级的方法,如图1所示,所述方法包括以下步骤:
[0044]S1、0NU检测到OLT下发的即将发送升级数据包的命令后,释放上次升级过程中由于某种异常情况发生而未释放的线程和链表等资源,同时初始化用于升级的全局标识变量。
[0045]需要说明的是,异常情况一般为ONU在接收升级数据包时与OLT的通信中断,导致接收升级数据包的线程及处理升级数据包的线程一直在空转,此时未填充完成的链表节点也未被释放。若上次升级成功,则仅需初始化用于升级的全局标识变量。
[0046]S2、获取ONU当前使用的分区并擦除其备份分区,申请链表的头结点,并使用全局指针变量记录链表的首地址,转S3和S4。
[0047]其中,由于升级数据包大小的不确定性,为了保证升级的稳定性,必须以分区为单位将整个备份分区一次性擦除。
[0048]S3、创建第一线程,第一线程循环执行以节点为单位申请内存存放升级数据包,并进行链表维护,直至OLT下发结束命令时退出线程,转S5。
[0049]S4、创建第二线程,第二线程循环读取链表并对链表进行处理,包括分块累积计算整个升级数据包的CRC并将升级数据包中的数据写入flash,处理完成后立即释放对应节点的内
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1