CN103605485B - 一种变长数据的存储方法与装置 - Google Patents

一种变长数据的存储方法与装置 Download PDF

Info

Publication number
CN103605485B
CN103605485B CN201310631997.6A CN201310631997A CN103605485B CN 103605485 B CN103605485 B CN 103605485B CN 201310631997 A CN201310631997 A CN 201310631997A CN 103605485 B CN103605485 B CN 103605485B
Authority
CN
China
Prior art keywords
data
storage area
size
pointer
read
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201310631997.6A
Other languages
English (en)
Other versions
CN103605485A (zh
Inventor
余世均
李红京
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hunan Provincial Highway Technology Co., Ltd.
Original Assignee
Autel Intelligent Technology Corp Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Autel Intelligent Technology Corp Ltd filed Critical Autel Intelligent Technology Corp Ltd
Priority to CN201310631997.6A priority Critical patent/CN103605485B/zh
Publication of CN103605485A publication Critical patent/CN103605485A/zh
Application granted granted Critical
Publication of CN103605485B publication Critical patent/CN103605485B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Abstract

发明属于数据队列缓存技术,尤其涉及一种变长数据的存储方法与装置,包括:查询缓存区域的空闲空间大小;缓存区域包括数据存指针存放区、数据读指针存放区、保留区以及数据存放区;当所述空闲空间大小大于变长数据的大小时,判断所述变长数据的大小是否大于数据存放区中最后一组数据的末地址到数据存放区结束地址之间的内存大小;是则在所述数据存放区中最后一组数据的末地址后设置数据缓存终止标识,并将所述变长数据从数据存放区的首址开始存入,否则将所述变长数据从数据存放区的最后一组数据的末地址后开始存入。本发明使得存放的数据始终存放在一块连续的内存中,实时性高,数据存取相对较快,稳定性强,且这种实现方式,占用代码空间小。

Description

一种变长数据的存储方法与装置
技术领域
本发明属于数据队列缓存技术,尤其涉及一种变长数据的存储方法与装置。
背景技术
数据队列缓存技术,在计算机领域应用非常广泛。在嵌入式应用中,经常用于外部设备与处理器之间进行数据交互,比如UART(Universal Asynchronous Receiver/Transmitter,异步串行通信接口)设备,当我们需要利用UART与外设进行指令和数据交互的时候,就需要将接收到的指令或数据保存在接收数据缓冲区中,然后再对接收到的数据或指令逐个进行处理,将设备的状态和数据回送到主机,主机同样也会建立数据收发缓冲区,缓存接收到的数据或将要被发送的指令。
通常的对于定长数据缓存方式,只要保存好数据输入和输出指针就能比较方便的实现数据的出入队列。对于变长的数据,通过STL模板库里的vector、list、queue能够实现,变长数据的存储,但是这样编译出的代码冗长,执行效率明显降低,在嵌入式编程实时性、代码空间、内存空间要求非常严格的应用场合,就显得非常吃力。
现有的环形数据缓存技术,大多以自定义一个缓存区域或使用STL模板为主。自定义一个数据缓存区域主要是开辟一块空闲的内存空间,申请两个指针变量,一个用于保存写数据指针,另一个用于保存读数据指针,当有新的数据需要保存的时候,就将数据放入写数据指针指向的内存区域,而发送模块需要发送的数据的时候就从读数据指针所指向的内存块取出数据,送入串行发送模块,将数据发送出去。而STL模板的主要是申请一个数据容器(VECTOR、LIST、QUEUE等),需要出(入)队列的时候通过调用pop或push方法按字节(或将接收/发送数据的缓存地址)取出并保存在容器中。
现有技术在嵌入式应用领域存在的缺点:
使用STL标准模板库:
代码冗长:代码量会增大许多,在代码空间有限的情况下很难实现。
执行效率低:由于STL模块是标准的、通用性的容器,代码会比自实现的缓存多,执行效率自然会变低。
容易产生内存碎片:如果用STL保存内存指针,会不停的申请和释放内存,容易造成内存碎片。
使用环形数据缓存技术:
灵活性低:在使用环形数据缓存技术的时候,比较适用于定长的数据应用场合,对于变长的数据,需要自由的进行存取和访问变得比较复杂。例如数据被分别存在内存的结尾和头部的时候,无法使用得到缓存区域首地址的方式访问缓存中的数据。
发明内容
本发明实施例提供一种变长数据的存储方法与装置,旨在解决现有技术中的数据包不能存放在一块连续内存中的问题。
本发明实施例是这样实现的,一种变长数据的存储方法,所述方法包括:
查询缓存区域的空闲空间大小;所述缓存区域包括数据存指针存放区、数据读指针存放区、保留区以及数据存放区;
当所述空闲空间大小大于变长数据的大小时,判断所述变长数据的大小是否大于数据存放区中最后一组数据的末地址到数据存放区结束地址之间的内存大小;
是则在所述数据存放区中最后一组数据的末地址后设置数据缓存终止标识,并将所述变长数据从数据存放区的首址开始存入,否则将所述变长数据从数据存放区的最后一组数据的末地址后开始存入。
本发明实施例还提供一种变长数据的存储装置,所述装置包括:
空间查询单元,用于查询缓存区域的空闲空间大小;所述缓存区域包括数据存指针存放区、数据读指针存放区、保留区以及数据存放区;
空闲空间大小判断单元,用于当所述空闲空间大小大于变长数据的大小时,判断所述变长数据的大小是否大于数据存放区中最后一组数据的末地址到数据存放区结束地址之间的内存大小;是则在所述数据存放区中最后一组数据的末地址后设置数据缓存终止标识,并将所述变长数据从数据存放区的首址开始存入,否则将所述变长数据从数据存放区的最后一组数据的末地址开始存入。
本发明的缓存区域包括数据存指针存放区、数据读指针存放区、保留区以及数据存放区,在判断变长数据的大小大于数据存放区中最后一组数据的末地址到数据存放区结束地址之间的内存大小时,通过在数据存放区中最后一组数据的末地址后设置数据缓存终止标识,并将变长数据从数据存放区的首址开始存入,使得存放的数据始终存放在一块连续的内存中,在存取数据时相当于直接在内存内访问,不需要开辟新的内存区域,实时性高,数据存取相对较快,稳定性强,所有数据缓存区域是一块连续的内存,都会被循环利用,且不会不停的分配和释放内存,所以不存在内存碎片,且这种实现方式,占用代码空间小。
附图说明
图1表示本发明实施例提供的一种变长数据的存储方法流程图。
图2表示本发明实施例提供的一种变长数据的存储方法流程图。
图3表示本发明实施例提供的一种变长数据的存储装置结构图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
图1示出了本发明实施例提供的一种变长数据的存储方法流程图,详述如下:
在步骤S101中,查询缓存区域的空闲空间大小;缓存区域包括数据存指针存放区、数据读指针存放区、保留区以及数据存放区;
在本发明实施例中,将缓存区域分为数据存指针存放区、数据读指针存放区、保留区以及数据存放区,其中,将数据存放区分为数据首址存放区、有效数据存放区、数据缓存终止标识存放区以及数据缓存结束地址存放区,如下表1所示:
表1
其中,将缓存区域空间内存的0-3字节用于存放数据存指针,4-7字节用于存放数据读指针,8-15字节为保留区,16-1023为数据存放区(B为起始地址0x10(十六进制为16),E为结束地址0x400(十进制为1024))。
本发明需要实现的函数模块如表2所示:
1.SetSize(int size)设置数据缓存区域尺寸
2.Clear()清除缓存区域里的保存数据
3.bool Empty()检查缓存区域是否存有有效数据
4.Push(void*pdata)将数据压入缓存区域
5.Pop()将最前一笔数据出栈
6.void*Front()取出最前一笔数据,即得到这笔数据的缓存区首址
7.int GetFree()得缓存区域剩余空间的大小
表2
在步骤S102中,当空闲空间大小大于变长数据的大小时,判断变长数据的大小是否大于数据存放区中最后一组数据的末地址到数据存放区结束地址之间的内存大小;是则执行步骤S103,否则执行步骤S104;
在步骤S103中,在数据存放区中最后一组数据的末地址后设置数据缓存终止标识,并将变长数据从数据存放区的首址开始存入;
在步骤S104中,将变长数据从数据存放区的最后一组数据的末地址后开始存入。
在本发明实施例中,要保存的数据通过调用GetFree函数得到缓存区空闲空间的大小,如果有空闲空间,调用Push函数将数据存入内存块。另外,需要读取该缓存中的数据时,可以调用Empty函数检查是否存在有效数据包,如果不为空表示存在有效数据包,调用Front函数直接读取里面的数据,可以通过memcpy(C语言标准库函数,内存数据复制函数)、数组、指针等以先进先出原则访问方式访问该数据,因为里面的数据存放在一块连续的内存中,不需要开辟新的内存区域。当时用完这块数据后,然后在调用Pop将修改读取指针到下一个有效数据包位置。这种数据缓存机制可以存放不定长度的数据,且无内存数据碎片,同时,具有STL模板相似的函数API,便于学习和使用。
数据存入内存指针到最大内存地址E之间的空间不能存放新数据包时,假如数据存指针位置在D,E-D=128字节空间,要存放的新数据包长度为256,这时我们将在D处设置0X12345678标识,从这块内存地址开始到缓冲区末地址无有效数据,新的有效数据放在头部B开始的区域,取数据时,就从B位置开始取数据包。这样操作虽然会偶尔损失一点内存区域,但存取数据相当于直接在内存中访问,比STL模板实现存取机制快,同时在读取数据时无需开辟新的数据内存,就可以实现数据的处理。
图2示出了本发明实施例提供的一种变长数据出入队列的实现方法流程图,详述如下:
在步骤S201中,开辟内存块,设置数据缓存区域尺寸;
在步骤S202中,查询缓存区域的空闲空间大小;缓存区域包括数据存指针存放区、数据读指针存放区、保留区以及数据存放区;
在步骤S203中,当空闲空间大小大于变长数据的大小时,判断变长数据的大小是否大于数据存放区中最后一组数据的末地址到数据存放区结束地址之间的内存大小;是则执行步骤S204,否则执行步骤S205;
在步骤S204中,在数据存放区中最后一组数据的末地址后设置数据缓存终止标识,并将变长数据从数据存放区的首址开始存入;
在步骤S205中,将变长数据从数据存放区的最后一组数据的末地址后开始存入;
在步骤S206中,判断数据存指针是否不等于数据读指针,是则执行步骤S207,否则执行步骤S208;
在本发明实施例中,读取数据可以通过判断缓存区域是否存有有效数据,是则读取该数据,否则不读取该数据。
在步骤S207中,读取该数据;
在步骤S208中,不读取该数据。
在本发明实施例中,如果需要清除缓存区域空间保存的数据只需要调用clear函数,通过设置数据存指针等于数据读指针可以实现。
图3示出了本发明实施例提供的一种变长数据的存储装置结构图,详述如下:
内存开辟单元31在空间查询单元查询缓存区域的空闲空间大小之前,开辟内存块,设置数据缓存区域尺寸。
空间查询单元32查询缓存区域的空闲空间大小;其中,缓存区域包括数据存指针存放区、数据读指针存放区、保留区以及数据存放区。
空闲空间大小判断单元33当空闲空间大小大于变长数据的大小时,判断变长数据的大小是否大于数据存放区中最后一组数据的末地址到数据存放区结束地址之间的内存大小;是则在数据存放区中最后一组数据的末地址后设置数据缓存终止标识,并将变长数据从数据存放区的首址开始存入,否则将变长数据从数据存放区的最后一组数据的末地址开始存入。
数据读取单元34判断缓存区域是否存有有效数据,是则读取该数据,否则不读取该数据。
在本发明实施例中,读取该数据是通过内存数据复制函数、数组或指针以先进先出原则访问所述有效数据;判断缓存区域是否存有有效数据,是则读取该数据,否则不读取该数据具体为:判断数据存指针是否不等于数据读指针,是则读取该数据,否则不读取该数据;
数据清除单元35清除缓存区域空间保存的数据。
在本发明实施例中,清除缓存区域空间保存的数据具体为:
设置数据存指针等于数据读指针。
本发明的缓存区域包括数据存指针存放区、数据读指针存放区、保留区以及数据存放区,在判断变长数据的大小大于数据存放区中最后一组数据的末地址到数据存放区结束地址之间的内存大小时,通过在数据存放区中最后一组数据的末地址后设置数据缓存终止标识,并将变长数据从数据存放区的首址开始存入,使得存放的数据始终存放在一块连续的内存中,在存取数据时相当于直接在内存内访问,不需要开辟新的内存区域,实时性高,数据存取相对较快,稳定性强,所有数据缓存区域是一块连续的内存,都会被循环利用,且不会不停的分配和释放内存,所以不存在内存碎片,且这种实现方式,占用代码空间小。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

Claims (10)

1.一种变长数据的存储方法,其特征在于,所述方法包括:
查询缓存区域的空闲空间大小;所述缓存区域包括数据存指针存放区、数据读指针存放区、保留区以及数据存放区;
当所述空闲空间大小大于变长数据的大小时,判断所述变长数据的大小是否大于数据存放区中最后一组数据的末地址到数据存放区结束地址之间的内存大小;
是则在所述数据存放区中最后一组数据的末地址后设置数据缓存终止标识,当数据取出指针指向的位置到数据存放区首址之间的内存大于变长数据的大小时,将所述变长数据从数据存放区的首址开始存入;当所述变长数据的大小小于等于数据存放区中最后一组数据的末地址到数据存放区结束地址之间的内存大小时,将所述变长数据从数据存放区的最后一组数据的末地址后开始存入。
2.如权利要求1所述的存储方法,其特征在于,在所述查询缓存区域的空闲空间大小之前还包括:
开辟内存块,设置数据缓存区域尺寸。
3.如权利要求1所述的存储方法,其特征在于,所述方法还包括:
判断所述缓存区域是否存有有效数据,是则读取该数据,否则不读取该数据。
4.如权利要求3所述的存储方法,其特征在于,所述读取该数据是通过内存数据复制函数、数组或指针以先进先出原则访问所述有效数据。
5.如权利要求3所述的存储方法,其特征在于,所述判断所述缓存区域是否存有有效数据,是则读取该数据,否则不读取该数据具体为:
判断数据存指针是否不等于数据读指针,是则读取该数据,否则不读取该数据。
6.如权利要求1所述的存储方法,其特征在于,所述方法还包括:
清除缓存区域保存的数据。
7.如权利要求6所述的存储方法,其特征在于,所述清除缓存区域保存的数据具体为:
设置数据存指针等于数据读指针。
8.一种变长数据的存储装置,其特征在于,所述装置包括:
空间查询单元,用于查询缓存区域的空闲空间大小;所述缓存区域包括数据存指针存放区、数据读指针存放区、保留区以及数据存放区;
空闲空间大小判断单元,用于当所述空闲空间大小大于变长数据的大小时,判断所述变长数据的大小是否大于数据存放区中最后一组数据的末地址到数据存放区结束地址之间的内存大小;是则在所述数据存放区中最后一组数据的末地址后设置数据缓存终止标识,当数据取出指针指向的位置到数据存放区首址之间的内存大于变长数据的大小时,将所述变长数据从数据存放区的首址开始存入;当所述变长数据的大小小于等于数据存放区中最后一组数据的末地址到数据存放区结束地址之间的内存大小时,将所述变长数据从数据存放区的最后一组数据的末地址开始存入。
9.如权利要求8所述的装置,其特征在于,所述装置还包括:
内存开辟单元,用于在空间查询单元查询缓存区域的空闲空间大小之前,开辟内存块,设置数据缓存区域尺寸;
所述装置还包括:
数据读取单元,用于判断所述缓存区域是否存有有效数据,是则读取该数据,否则不读取该数据;
所述装置还包括:
数据清除单元,用于清除缓存区域空间保存的数据。
10.如权利要求9所述的装置,其特征在于,所述读取该数据是通过内存数据复制函数、数组或指针以先进先出原则访问所述有效数据;
所述判断所述缓存区域是否存有有效数据,是则读取该数据,否则不读取该数据具体为:
判断数据存指针是否不等于数据读指针,是则读取该数据,否则不读取该数据;
所述清除缓存区域空间保存的数据具体为:
设置数据存指针等于数据读指针。
CN201310631997.6A 2013-11-29 2013-11-29 一种变长数据的存储方法与装置 Active CN103605485B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201310631997.6A CN103605485B (zh) 2013-11-29 2013-11-29 一种变长数据的存储方法与装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201310631997.6A CN103605485B (zh) 2013-11-29 2013-11-29 一种变长数据的存储方法与装置

Publications (2)

Publication Number Publication Date
CN103605485A CN103605485A (zh) 2014-02-26
CN103605485B true CN103605485B (zh) 2017-01-18

Family

ID=50123717

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201310631997.6A Active CN103605485B (zh) 2013-11-29 2013-11-29 一种变长数据的存储方法与装置

Country Status (1)

Country Link
CN (1) CN103605485B (zh)

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
GB2540216B (en) * 2015-07-10 2020-01-01 Advanced Risc Mach Ltd Comparison of wide data types
CN106886529A (zh) * 2015-12-16 2017-06-23 天脉聚源(北京)科技有限公司 一种奖池显示容量控制方法及系统
CN106990917B (zh) * 2017-03-02 2020-03-24 信雅达系统工程股份有限公司 文件读写方法及系统
CN107016054A (zh) * 2017-03-03 2017-08-04 京信通信技术(广州)有限公司 一种日志信息存储的方法及装置
CN107395565B (zh) * 2017-06-15 2020-03-17 北京机械设备研究所 一种定长单字节格式报文协议下串口接收预处理方法
CN109240944B (zh) * 2018-08-16 2021-02-19 上海天数智芯半导体有限公司 一种基于可变长缓存行的数据读写方法
CN112035379B (zh) * 2020-09-09 2022-06-14 浙江大华技术股份有限公司 存储空间的使用方法、装置、存储介质以及电子装置

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS62297952A (ja) * 1986-06-18 1987-12-25 Hitachi Ltd 可変長デ−タの記憶方式
JP2005184179A (ja) * 2003-12-17 2005-07-07 Fujitsu Ltd 可変長パケット蓄積装置及び方法
CN102169460A (zh) * 2010-02-26 2011-08-31 航天信息股份有限公司 变长数据管理方法及装置
CN102340453A (zh) * 2011-10-31 2012-02-01 航天恒星科技有限公司 一种变长数据流的调度方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS62297952A (ja) * 1986-06-18 1987-12-25 Hitachi Ltd 可変長デ−タの記憶方式
JP2005184179A (ja) * 2003-12-17 2005-07-07 Fujitsu Ltd 可変長パケット蓄積装置及び方法
CN102169460A (zh) * 2010-02-26 2011-08-31 航天信息股份有限公司 变长数据管理方法及装置
CN102340453A (zh) * 2011-10-31 2012-02-01 航天恒星科技有限公司 一种变长数据流的调度方法

Also Published As

Publication number Publication date
CN103605485A (zh) 2014-02-26

Similar Documents

Publication Publication Date Title
CN103605485B (zh) 一种变长数据的存储方法与装置
CN104133780B (zh) 一种跨页预取方法、装置及系统
KR101121592B1 (ko) 버스트 판독기록 동작을 구비한 처리 장치
CN109085997A (zh) 用于非易失性存储器的存储器高效持续键值储存
CN101478472B (zh) 一种Socket数据传输处理方法及装置
CN109412914A (zh) 流数据与axi接口通信装置
EP2337305A3 (en) Header processing engine
US10318165B2 (en) Data operating method, device, and system
JPWO2020243098A5 (zh)
US20150143045A1 (en) Cache control apparatus and method
CN107527317A (zh) 基于图像处理的数据传输系统
CN108874688B (zh) 一种报文数据缓存方法及装置
US7117306B2 (en) Mitigating access penalty of a semiconductor nonvolatile memory
CN102325010A (zh) 一种避免数据粘包的处理装置及方法
CN108536623A (zh) 多通道NAND Flash控制器及移动存储设备
CN101826031A (zh) 基于Linux系统的PCM流捕获的实现方法
JP2008512942A5 (zh)
TW201039138A (en) Method for enhancing data transmission efficiency
CN103838694B (zh) 一种fpga高速读取usb接口数据的方法
CN104461967B (zh) 一种支持同步和异步传输模式的并行数据接口
WO2006131899A2 (en) Memory controller and method for coupling a network and a memory
CN105591979A (zh) 报文的处理系统和方法
CN115495406A (zh) 一种基于PCIe的报文传输方法、装置、设备及存储介质
US20150062637A1 (en) Image Forming Apparatus Having Function of Avoiding Overflow of Buffer and Image Forming Method
CN110580227B (zh) 自适应nvm命令生成方法与装置

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
C53 Correction of patent for invention or patent application
CB02 Change of applicant information

Address after: 518000 Guangdong city of Shenzhen province Nanshan District Xili Street Xueyuan Road No. 1001 Chi Park B1 building 7 layer, 8 layer, 10 layer

Applicant after: SHENZHEN AUTEL TECHNOLOGY CO., LTD.

Address before: 518000 Guangdong city of Shenzhen province Nanshan District Xili town tea light road on the south side of Shenzhen integrated circuit design and application of Industrial Park 106, 107, 109, 114

Applicant before: Shenzhen Autel Technology Co., Ltd.

C14 Grant of patent or utility model
GR01 Patent grant
TR01 Transfer of patent right
TR01 Transfer of patent right

Effective date of registration: 20171227

Address after: 410000 Hunan province Changsha City Lugu high tech Development Zone, Road No. 662 Building No. 558 Software Center

Patentee after: Hunan Provincial Highway Technology Co., Ltd.

Address before: 518000 Guangdong city of Shenzhen province Nanshan District Xili Street Xueyuan Road No. 1001 Chi Park B1 building 7 layer, 8 layer, 10 layer

Patentee before: SHENZHEN AUTEL TECHNOLOGY CO., LTD.