缓存地址释放方法、系统及逻辑模块
技术领域
本发明涉及数据缓存技术,尤其涉及一种缓存地址释放方法、系统及逻辑模块。
背景技术
在数据通信技术中,逻辑模块(如CPU_RX模块)从外部收到报文后,首先会申请缓存地址对报文进行缓存,如果该报文是普通数据报文,则通过数据通道将该报文发送出去;如果该报文是协议报文,则通过控制通道将该报文上送CPU。无论是数据报文还是协议报文,在该报文发送完毕后,均需要释放之前为该报文申请到的缓存地址。本文主要针对协议报文的地址释放操作进行阐述。
图1示出了现有技术中逻辑模块的结构示意图,下面结合图1对现有技术中的协议报文地址申请和释放过程进行详细说明。如图1所示,逻辑模块包括:报文接收模块、先入先出(FIFO)队列、随机存储器(RAM)、地址管理模块、收包查询模块、读包信息模块、读包数据模块和地址释放模块。报文接收模块从外部接收到协议报文后,向管理缓存地址的地址管理模块申请缓存地址,将接收到的报文存入申请到的缓存地址所对应的RAM空间中,并在一个完整的报文接收完毕后,将该报文的长度、缓存地址等包信息写入FIFO队列,同时将当前包数目加1,并告知收包查询模块当前有报文上送。CPU通过收包查询模块查询当前有无报文上送,如果有,则通过读包信息模块从FIFO队列中读出一个包信息,然后,根据读出的包信息通过读包数据模块从RAM中读出相应的报文,并且,在一个完整的报文从RAM中被读出之后,CPU控制地址释放模块发起地址释放操作,将之前读出的包信息中所包含的缓存地址释放给地址管理模块。其中,读包信息模块从FIFO队列中读出一个包信息后会通知报文接收模块,报文接收模块收到通知后将当前包数目减1,当所有报文都被CPU读出后,报文接收模块告知收包查询模块当前包数目为空。
由以上描述可见,现有的地址释放操作是由CPU控制的。在这种情况下,如果CPU与逻辑模块之间的接口出现异常(比如外界瞬时的不可预知的干扰如雷击,或因网络瞬间CPU链路流量过大而导致信息丢失等)或者CPU释放错误,则会造成逻辑模块中缓存地址的泄漏或错误释放,并最终导致CPU通道不通或出现错包。比如,假设FIFO队列中存储的包信息B1包含的缓存地址为B,如果CPU在应该释放缓存地址A时错误地释放了数据还未被读出的缓存地址B,而报文接收模块之后又向错误释放的缓存地址B中重新写入了新的数据,那么,当CPU下次根据FIFO队列中的包信息B1从缓存地址B中读数据时,被读出的将是报文接收模块后来重新写入的数据,而并非原始的对应包信息B1的数据,这样就出现了错包的现象。另外,当CPU和逻辑模块间的接口出现异常时,很可能会导致CPU发出的地址释放命令丢失,从而使得应该被释放的缓存地址得不到释放,长此以往,就会造成可用的缓存地址逐渐减少,当没有缓存地址可用时,就会导致CPU通道不通。
发明内容
有鉴于此,本发明的主要目的在于提供一种缓存地址释放方法、一种缓存地址释放系统以及一种逻辑模块,以保证缓存地址能够得到正确释放,防止缓存地址释放错误的情况发生。
为达到上述目的,本发明提供的技术方案如下:
一种缓存地址释放方法,该方法包括:
逻辑模块中有报文上送CPU时,CPU先向逻辑模块查询包信息,根据查询到的包信息从逻辑模块中读取报文,并在该报文读取完毕后,从逻辑模块中读出该报文对应的包信息;逻辑模块在所述包信息被读出时,释放该包信息中包含的缓存地址。
所述逻辑模块包括包信息查询读取模块和用于存储包信息的先入先出队列,所述CPU向逻辑模块查询包信息的过程包括:CPU向逻辑模块中的包信息查询读取模块发送查询包信息请求,包信息查询读取模块收到该请求后,查询先入先出队列中的第一个包信息,并将查询到的包信息上报给CPU。
所述逻辑模块包括读包数据模块和用于存储报文的随机存储器,所述CPU读取报文的过程包括:CPU根据查询到的包信息向读包数据模块发出读数据命令,读包数据模块收到读数据命令后,从随机存储器中读出与所述包信息对应的报文,并将读出的报文发送给CPU。
所述从逻辑模块中读出包信息的过程包括:CPU向逻辑模块中的包信息查询读取模块发送读包信息命令,包信息查询读取模块收到读包信息命令后,从先入先出队列中读出一个包信息。
所述逻辑模块还包括地址管理模块,所述释放缓存地址的过程包括:包信息查询读取模块从先入先出队列中读出一个包信息后,向地址管理模块发出地址释放请求,将读出的包信息中包含的缓存地址释放出来。
所述逻辑模块还包括报文接收模块,所述包信息查询模块从先入先出队列中读出一个包信息后进一步包括:包信息查询读取模块向报文接收模块发送包信息读出通知,报文接收模块收到通知后将当前包数目减一。
一种逻辑模块,与CPU相连,包括报文接收模块、先入先出队列、随机存储器、地址管理模块、收包查询模块和读包数据模块,该逻辑模块还包括:
包信息查询读取模块,用于在收到CPU下发的查询包信息请求后,查询先入先出队列中的第一个包信息,将查询到的包信息上报给CPU,在收到CPU下发的读包信息命令后,从先入先出队列中读出一个包信息,并向地址管理模块发出地址释放请求,将该包信息中包含的缓存地址释放出来。
所述包信息查询读取模块还用于在从先入先出队列中读出一个包信息之后,向报文接收模块发送包信息读出通知,报文接收模块收到通知后将当前包数目减一。
一种缓存地址释放系统,包括CPU和逻辑模块,该逻辑模块包括报文接收模块、先入先出队列、随机存储器、地址管理模块、收包查询模块和读包数据模块,所述逻辑模块还包括包信息查询读取模块,其中,
所述CPU,用于在通过收包查询模块查询到有报文上送时,向包信息查询读取模块发出查询包信息请求,在收到包信息查询读取模块返回的包信息后,通过读包数据模块从随机存储器中读出与查询到的包信息对应的数据报文,并在该报文读取完毕后,向包信息查询读取模块发送读包信息命令;
包信息查询读取模块,用于在收到CPU下发的查询包信息请求后,查询先入先出队列中的第一个包信息,将查询到的包信息上报给CPU,在收到CPU下发的读包信息命令后,从先入先出队列中读出一个包信息,并向地址管理模块发出地址释放请求,将该包信息中包含的缓存地址释放出来。
所述包信息查询读取模块还用于在从先入先出队列中读出一个包信息之后,向报文接收模块发送包信息读出通知,报文接收模块收到通知后将当前包数目减一。
由此可见,在本发明所提供的技术方案中,缓存地址释放操作是由逻辑模块在包信息被读出的同时完成的,而不是由CPU发起的。本发明中的缓存地址释放操作不受CPU控制,也没有经过CPU与逻辑模块间的接口,从而有效避免了因CPU与逻辑模块间的接口异常或CPU释放错误而造成缓存地址释放错误的情况发生,保证了缓存地址的正确释放,不会因缓存地址释放错误而出现CPU通道不通或错包现象。
附图说明
图1为现有技术中的逻辑模块结构示意图;
图2为本发明实施例中的逻辑模块结构示意图;
图3为本发明实施例中的缓存地址释放方法流程图。
具体实施方式
为使本发明的目的、技术方案及优点更加清楚明白,下面参照附图并举实施例,对本发明作进一步详细说明。
本发明的基本思想是:去掉逻辑模块内部专用的地址释放模块,不由CPU控制地址释放模块进行缓存地址释放,而是利用逻辑模块自身进行缓存地址释放,以防止由于CPU与逻辑模块间的接口异常或CPU释放错误而造成缓存地址的错误释放。
图2示出了本发明实施例中的逻辑模块结构示意图。在图2所示结构中,报文接收模块、FIFO队列、RAM、地址管理模块、收包查询模块及读包数据模块的功能均与图1中相应模块的功能一致,这里不再一一赘述。与图1不同的是,图2所示的逻辑模块中去掉了地址释放模块,并且,将原有的读包信息模块变成了包信息查询读取模块。
在图2所示逻辑模块结构中,报文接收单元收到协议报文后进行缓存的过程与现有技术一致,这里不再赘述。下面主要针对CPU从逻辑模块中读取报文及缓存地址的释放过程进行详细阐述,如图3所示,该过程主要包括以下步骤:
步骤301:CPU通过收包查询模块查询当前有无报文上送,如果有,则向包信息查询读取模块发出查询包信息请求。
步骤302:包信息查询读取模块收到CPU的查询包信息请求后,查询FIFO队列中的第一个包信息,并将查询到的包信息上报给CPU。
需要注意的是,在步骤301中,CPU向包信息查询读取模块发出的是查询包信息请求,而不是读包信息命令;并且,在步骤302中,包信息查询读取模块并没有从FIFO队列中读出包信息,而只是查询了FIFO队列中的包信息。也就是说,在步骤302执行完毕后,FIFO队列中的包信息没有发生任何改变。
步骤303:CPU收到包信息查询读取模块上报的包信息后,根据收到的包信息向读包数据模块发送读数据命令,读包数据模块收到读数据命令后,从RAM中读出与所述包信息相对应的报文,并将读出的包信息上报给CPU。
步骤304:一个完整报文读取完毕后,CPU向包信息查询读取模块发送读包信息命令。
步骤305:包信息查询读取模块收到CPU发出的读包信息命令后,从FIFO队列中读出一个包信息,并且,向地址管理模块发起地址释放请求,将该包信息中包含的缓存地址释放出来。
另外,包信息查询读取模块从FIFO队列中读出一个包信息后,还会通知报文接收模块,报文接收模块收到通知后将当前包数目减1,当所有报文都被CPU读出后,报文接收模块告知收包查询模块当前包数目为空。
需要说明的是,在图3所示流程中,之所以选择先查询包信息,在报文读取完毕后再从FIFO中读出包信息并进行地址释放,是因为:如果CPU一开始就直接通过包信息查询读取模块从FIFO中读出包信息,且包信息查询读取模块在包信息读出后就进行地址释放,那么,就很可能造成在CPU还未来得及将与该包信息对应的报文读出时,该报文所占用的地址就已经被过早释放掉了,从而造成丢包现象。
由以上描述可见,在本发明提供的技术方案中,缓存地址的释放是由逻辑模块内部的包信息查询读取模块完成的,该释放操作不受CPU控制,也没有经过CPU与逻辑模块间的接口,从而有效避免了因CPU与逻辑模块间的接口异常或CPU释放错误而造成缓存地址释放错误的情况发生,保证了缓存地址的正确释放,不会因缓存地址释放错误而出现CPU通道不通或错包现象。
以上所述对本发明的目的、技术方案和有益效果进行了进一步的详细说明,所应理解的是,以上所述并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。