一种onu升级的方法_2

文档序号:9923491阅读:来源:国知局
存,直至所有升级数据包处理结束后退出第二线程,转S5。
[0050]S5、判断升级数据是否成功写入flash,如果成功,转S6;否则,转S8。
[0051]S6、判断累积计算的整个升级数据包的CRC与OLT下发的CRC值是否相同,如果相同,转S7;否则,转S8。
[0052]S7、升级成功,激活备份分区并重启0NU。
[0053]S8、升级失败。
[0054]如图2所示,S3中第一线程的具体执行步骤如下:
[0055]S301、0NU开始接收OLT下发的升级数据包,在接收完一个升级数据包后,判断该升级数据包的长度加上当前节点中的数据长度是否大于等于当前节点的容量,如果是,转S302;否则,转 S307。
[0056]需要说明的是,升级数据包的长度根据上层协议的不同一般为几十到一千多字节不等,链表中的一个节点定义为一个结构体,包含的成员变量包括:存取升级数据的定长数组(256K、512K等)、记录节点数据长度的变量、标识该节点是否填充完成的变量以及用于保存next节点首地址的指针变量。
[0057]S302、判断当前节点中的定长数组是否被填满,如果是,转S304;否则,转S303。
[0058]S303、用升级数据包中的数据将当前节点的剩余容量填满,并记录当前节点中的数据长度,转S304。
[0059 ] S304、为当前节点的next节点申请内存,存储升级数据包中的剩余数据。
[0060]S305、对next节点地址进行赋值,进行链表维护,然后将当前节点的填充完成标识置I,表明当前节点中的定长数组已填充完成。
[0061]S306、将next节点切换为当前节点,将升级数据包中的剩余数据填充当前节点,并记录当前节点中的数据长度,转S308。
[0062]S307、将升级数据包中的数据依次填充到当前节点中的定长数组,并记录当前节点中的数据长度。
[0063]S308、判断OLT是否结束发送升级数据包,如果是,转S309;否则,转S301,即开始下一轮的接收OLT下发的升级数据包。
[0064]S309、将当前节点的填充完成标识置I,并将当前节点的next节点地址置null。
[0065]需要说明的是,当前节点填充完成后,当前节点中的数据长度可能小于定长数组的容量。OLT结束发送升级数据包后,当前节点为整个链表的最后一个节点,所以需要将当前节点的next节点地址置nu11进行标识。
[0066]如图3所示,S4中第二线程的具体执行步骤如下:
[0067]S401、获取当前节点中的升级数据,并判断当前节点的填充完成标志位是否为I,如果是,转S402;否则,转S401。
[0068]S402、分块累积计算整个升级数据包的CRC,并计算当前节点中数据部分的CRC。
[0069]需要说明的是,由于升级数据包在传输的过程中可能会有误码,所以需要对整个升级数据包进行CRC计算,并与OLT在发送升级数据包前的CRC计算值作比较,以判断ONU接收到的升级数据包是否有效。同时,由于数据在写入flash时可能会因为某种异常情况而发生错误,所以有必要对写入flash的数据进行CRC校验。
[0070]S403、将当前节点中的数据部分写入flash。
[OO71 ] S404、从f lash中回读出写入的当前节点的数据,并重新计算CRC。
[0072 ] S40 5、判断重新计算的CRC与将数据写入f I ash之前计算的当前节点中数据部分的CRC是否相等,如果相等,转S406;否则,转S410。
[0073]S406、获取next节点的首地址并记录。
[0074]S407、释放当前节点的内存空间,并将next节点切换为当前节点。
[0075]S408、判断当前节点是否为空,如果为空,表明链表中的所有节点均已处理完毕,转S409;否则,转S401。
[0076]S409、标识将整个升级数据包写入flash成功。
[0077]S410、标识将升级数据包写入flash失败。
[0078]本发明不局限于上述最佳实施方式,任何人应该得知在本发明的启示下作出的结构变化,凡是与本发明具有相同或相近的技术方案,均落入本发明的保护范围之内。
【主权项】
1.一种ONU升级的方法,其特征在于,包括以下步骤: S1.0NU检测到OLT下发的即将发送升级数据包命令后,初始化用于升级的全局标识变量; 52.获取ONU当前使用的分区并擦除其备份分区,申请链表的头结点,并使用全局指针变量记录链表首地址,转S3和S4 ; 53.创建第一线程,第一线程循环执行以节点为单位申请内存存储升级数据包,并进行链表维护,直至OLT下发结束命令后退出第一线程,转S5; 54.创建第二线程,第二线程循环读取链表并对链表进行处理,包括分块累积计算整个升级数据包的CRC并将升级数据包中的数据写入flash,处理完成后立即释放对应节点的内存,直至所有升级数据包处理结束后退出第二线程,转S5; 55.判断升级数据是否成功写入flash,如果成功,转S6;否则,转S8; 56.判断累积计算的整个升级数据包的CRC与OLT下发的CRC值是否相同,如果相同,转S7;否则,转S8; 57.升级成功,激活备份分区并重启ONU; 58.升级失败。2.如权利要求1所述的一种ONU升级的方法,其特征在于,S3中第一线程的具体执行步骤包括: S301.0NU接收完OLT下发的一个升级数据包后,判断该升级数据包的长度加上当前节点中的数据长度是否大于等于当前节点的容量,如果是,转S302;否则,转S307; 5302.判断当前节点中的定长数组是否被填满,如果是,转S304;否则,转S303; 5303.用升级数据包中的数据将当前节点的剩余容量填满,并记录当前节点中的数据长度,转S304; 5304.为当前节点的next节点申请内存,存储升级数据包中的剩余数据; 5305.对next节点地址进行赋值,进行链表维护,然后将当前节点的填充完成标识置I; 5306.将next节点切换为当前节点,将升级数据包中的剩余数据填充当前节点,并记录当前节点中的数据长度,转S308; 5307.将升级数据包中的数据依次填充到当前节点中的定长数组,并记录当前节点中的数据长度; 5308.判断OLT是否结束发送升级数据包,如果是,转S309;否则,转S301; 5309.将当前节点的填充完成标识置I,并将当前节点的next节点地址置nu11。3.如权利要求1所述的一种ONU升级的方法,其特征在于,S4中第二线程的具体执行步骤包括: 5401.获取当前节点中的升级数据,并判断当前节点的填充完成标志位是否为I,如果是,转S402;否则,转S401; 5402.分块累积计算整个升级数据包的CRC,并计算当前节点中数据部分的CRC; 5403.将当前节点中的数据部分写入flash; 5404.从fI ash中回读出写入的当前节点的数据,并重新计算CRC ; 5405.判断重新计算的CRC与将数据写入flash之前计算的当前节点中数据部分的CRC是否相等,如果相等,转S406;否则,转S410; 5406.获取next节点的首地址并记录; 5407.释放当前节点的内存空间,并将next节点切换为当前节点; 5408.判断当前节点是否为空,如果为空,表明链表中的所有节点均已处理完毕,转S409;否则,转S401; 5409.将整个升级数据包写入flash成功; 5410.将升级数据包写入flash失败。4.如权利要求1所述的一种ONU升级的方法,其特征在于,所述ONU检测到所述OLT下发的即将发送升级数据包命令后,释放之前升级过程中由于异常情况发生而未释放掉的线程和链表。5.如权利要求1所述的一种ONU升级的方法,其特征在于,所述第一线程和所述第二线程并发执行。
【专利摘要】本发明公开了一种ONU升级的方法,包括以下步骤:OLT下发升级命令后,初始化全局标识变量;获取ONU当前使用的分区并擦除其备份分区,申请链表的头结点,使用全局指针变量记录链表首地址;创建第一线程,循环执行以节点为单位申请内存存储升级数据包,并进行链表维护,直至OLT下发结束命令后退出第一线程;创建第二线程,循环读取链表并对链表进行处理,处理完成后立即释放对应节点的内存,直至所有升级数据包处理结束。本发明以节点为单位申请内存存放升级数据包,并创建两个线程分别用于接收升级数据包和对升级数据包进行处理,实现了下载升级数据包的同时将升级数据写入flash,既节约了内存空间又缩短了升级时间。
【IPC分类】H04Q11/00, G06F9/445, H04L1/00, H04L12/24
【公开号】CN105703945
【申请号】CN201610012269
【发明人】肖云鹏
【申请人】烽火通信科技股份有限公司
【公开日】2016年6月22日
【申请日】2016年1月8日
当前第2页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1