背景技术
存储器(Memory)是一种记忆设备,用来存放程序和数据。使用存储器的设备中的全部信息,包括输入的原始数据、程序、中间运行结果和最终运行结果等都保存在存储器中。它根据控制器指定的位置存入和取出信息。
有了存储器设备才有记忆功能,才能保证正常工作。按用途存储器可分为主存储器(内存)和辅助存储器(外存)。外存通常是磁性介质或光盘等,能长期保存信息。内存指主板上的存储部件,用来存放当前正在执行的数据和程序,但仅用于暂时存放程序和数据,关闭电源或断电,数据就会丢失。
存储器一般由若干个存储单元组成,每个存储单元有一个地址,通过该地址可寻址到对应的存储单元。
现有的mp3解码滤波技术中,对所产生的中间过程数据常常是进行批量移动和刷新,图1示出其具体过程,其中以数据块包含64个数据为例,其中的数据块0、数据块1......分别表示每次存入存储器的数据块:
起始地址 |
地址 0-63 |
地址 64-127 |
地址 128-191 |
地址 192-255 |
地址 256-319 |
地址 320-383 |
初始数据 |
|
|
|
|
|
|
|
数据块0 |
|
|
|
|
|
第1次数据移位 |
数据块1 |
数据块0 |
|
|
|
|
第2次数据移位 |
数据块2 |
数据块1 |
数据块0 |
|
|
|
第3次数据移位 |
数据块3 |
数据块2 |
数据块1 |
数据块0 |
|
|
第4次数据移位 |
数据块4 |
数据块3 |
数据块2 |
数据块1 |
数据块0 |
|
第5次数据移位 |
数据块5 |
数据块4 |
数据块3 |
数据块2 |
数据块1 |
数据块0 |
第6次数据移位 |
数据块6 |
数据块5 |
数据块4 |
数据块3 |
数据块2 |
数据块1 |
第7次数据移位 |
数据块7 |
数据块6 |
数据块5 |
数据块4 |
数据块3 |
数据块2 |
表1
图1示出上述过程的具体步骤:
步骤101、最初写入数据时,将数据块写入地址为0-63的存储单元中,所述数据块编号为0(即数据块0)。
步骤102、第1次数据循环,即:把存储器中原有的数据块往右移64个存储单元,然后将下一个数据块写入地址为0-63的存储单元中。
在本次数据循环中:原先存放的数据块为数据块0;下一个数据块为数据块1;原先存放数据块的存储地址为0-63;右移64个存储单元后64~127。
步骤103、以后每次数据循环都必须把原先存放的数据块往右移64个存储单元,然后将下一个数据块写入存储单元编号为0-63的存储单元中。
综上所述,现有技术在往存储器中写入数据时,都必须先将存储器中原有的数据进行转移之后,再写入新数据,因此会导致向存储器中写数据的功耗较大。
发明内容
本发明实施例提供一种数据存储方法及装置,以降低向存储器中写数据时的功耗。
本发明实施例提供一种数据存储方法,包括:
获得当前待写入数据块的前一数据块的起始存储地址,其中,当第一次向存储器中写入数据块时,从预设的数据块起始存储地址写入所述数据块,并记录该数据块的起始存储地址;
将所述前一数据块的起始存储地址减去所述当前待写入数据块的大小,得到计算结果;
若所述计算结果小于0,则将所述计算结果与所述存储器的存储单元总数之和作为当前待写入数据块的起始存储地址;若所述计算结果大于或等于0,则直接以该计算结果作为所述当前待写入数据块的起始存储地址;
从所述当前待写入数据块的起始存储地址对应的存储单元开始写入所述当前待写入数据块。
其中,从所述当前待写入数据块的起始存储地址对应的存储单元开始写入所述当前待写入数据块后还包括:
获得所述当前待写入数据块的起始存储地址;
将所述起始存储地址加上当前待读取数据相对于当前待写入数据块的首数据的偏移量,得到中间读取结果;
若所述中间读取结果大于存储器的存储单元总数,则将所述中间读取结果与存储器的存储单元总数求差得到待读取数据的实际读取地址;若所述中间读取结果小于或等于存储器的存储单元总数,则直接以该中间读取结果作为当前待读取数据的实际读取地址;
从所述实际读取地址中读取所述待读取数据。
本发明实施例还提供一种数据存储装置,包括:
地址确定单元,用于获得当前待写入数据块的前一数据块的起始存储地址,其中,当第一次向存储器中写入数据块时,从预设的数据块起始存储地址写入所述数据块,并记录该数据块的起始存储地址;将所述前一数据块的起始存储地址减去所述当前待写入数据块的大小,得到计算结果,若所述计算结果小于0,则将所述计算结果与所述存储器的存储单元总数之和作为当前待写入数据块的起始存储地址;若所述计算结果大于或等于0,则直接以该计算结果作为所述当前待写入数据块的起始存储地址;
写入单元,用于从所述当前待写入数据块的起始存储地址对应的存储单元开始写入所述当前待写入数据。
本发明实施例采用移地址的方法实现数据块的存储,与现有技术中需先批量移动数据再写入新数据的方法相比,可以减少对存储器的读写,进而减少运算时间、降低向存储器中写数据时的功耗。
具体实施方式
本发明实施例一种数据存储方法,该方法包括:获得当前待写入数据块的前一数据块的起始存储地址;将所述起始存储地址减去所述当前待写入数据块的大小,得到计算结果;若所述计算结果小于0,则将所述计算结果映射到所述存储器的有效地址内,以该映射的结果作为所述当前待写入数据块的起始存储地址;若所述计算结果大于或等于0,则直接以该计算结果作为所述当前待写入数据块的起始存储地址;从所述当前待写入数据块的起始存储地址对应的存储单元开始写入所述当前待写入数据块。本发明方法可用于mp3解码滤波等应用中。
如图2所示,本发明一实施例的一种数据存储方法,具体包括步骤:
步骤201、当第一次向存储器中写入数据块时,从预设的数据块起始存储地址开始写入所述数据块(本实施例中预设的数据块的起始存储地址为0,但可以理解的,本发明并不限于此),并记录该数据块的起始存储地址。
其中,记录该数据块的起始存储地址可以是将起始存储地址存储在预先定义的起始地址寄存器中。
步骤202、当写入新数据块时,获取上一次写入数据块的起始存储地址。
步骤203、将获取到的起始地址减去所述新数据块所包含的数据个数得到计算结果。
步骤204、若所述计算结果小于0,则将所述计算结果与所述存储器的存储单元总数之和作为本次写数据块的起始地址;若所述计算结果大于或等于0且小于存储器的存储单元总数,则直接将所述计算结果作为本次写数据块的起始地址。
步骤205、从所述本次写数据块的起始地址所对应的存储单元开始写入所述新数据块。
结合表2,以存储单元总数为1024的存储器,每个数据块(在表2中数据块由S代替,其中第一列表示第几次进行数据存储)中包含64个数据,为例对本发明实施例做进一步的说明,可以理解,本发明方案并不仅限于存储器的存储单元总数为1024和每个数据块包含64个数据的情形。具体步骤如图3所示:
实际地 址 |
0 -63 |
64 -127
|
128 -191
|
192 -255
|
256 -319
|
320 -383
|
384 -447
|
448 -511
|
512 -575
|
576 -639
|
640 703 |
704 -767
|
768 -831
|
832 -895
|
896 -959
|
960 -1023
|
第1次 |
S0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
第2次 |
S0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
S1 |
第3次 |
S0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
S2 |
S1 |
第4次 |
S0 |
|
|
|
|
|
|
|
|
|
|
|
|
S3 |
S2 |
S1 |
第5次 |
S0 |
|
|
|
|
|
|
|
|
|
|
|
S4 |
S3 |
S2 |
S1 |
第6次 |
S0 |
|
|
|
|
|
|
|
|
|
|
S5 |
S4 |
S3 |
S2 |
S1 |
第7次 |
S0 |
|
|
|
|
|
|
|
|
|
S6 |
S5 |
S4 |
S3 |
S2 |
S1 |
第8次 |
S0 |
|
|
|
|
|
|
|
|
S7 |
S6 |
S5 |
S4 |
S3 |
S2 |
S1 |
第9次 |
S0 |
|
|
|
|
|
|
|
S8 |
S7 |
S6 |
S5 |
S4 |
S3 |
S2 |
S1 |
第10 次 |
S0 |
|
|
|
|
|
|
S9 |
S8 |
S7 |
S6 |
S5 |
S4 |
S3 |
S2 |
S1 |
第11 次 |
S0 |
|
|
|
|
|
S10 |
S9 |
S8 |
S7 |
S6 |
S5 |
S4 |
S3 |
S2 |
S1 |
第12 次 |
S0 |
|
|
|
|
S11 |
S10 |
S9 |
S8 |
S7 |
S6 |
S5 |
S4 |
S3 |
S2 |
S1 |
第13 次 |
S0 |
|
|
|
S12 |
S11 |
S10 |
S9 |
S8 |
S7 |
S6 |
S5 |
S4 |
S3 |
S2 |
S1 |
第14 次 |
S0 |
|
|
S13 |
S12 |
S11 |
S10 |
S9 |
S8 |
S7 |
S6 |
S5 |
S4 |
S3 |
S2 |
S1 |
第15 次 |
S0 |
|
S14 |
S13 |
S12 |
S11 |
S10 |
S9 |
S8 |
S7 |
S6 |
S5 |
S4 |
S3 |
S2 |
S1 |
第16 次 |
S0 |
S15 |
S14 |
S13 |
S12 |
S11 |
S10 |
S9 |
S8 |
S7 |
S6 |
S5 |
S4 |
S3 |
S2 |
S1 |
第17 次 |
S16 |
S15 |
S14 |
S13 |
S12 |
S11 |
S10 |
S9 |
S8 |
S7 |
S6 |
S5 |
S4 |
S3 |
S2 |
S1 |
第18 次 |
S16 |
S15 |
S14 |
S13 |
S12 |
S11 |
S10 |
S9 |
S8 |
S7 |
S6 |
S5 |
S4 |
S3 |
S2 |
S17 |
第19 次 |
S16 |
S15 |
S14 |
S13 |
S12 |
S11 |
S10 |
S9 |
S8 |
S7 |
S6 |
S5 |
S4 |
S3 |
S18 |
S17 |
第20 次 |
S16 |
S15 |
S14 |
S13 |
S12 |
S11 |
S10 |
S9 |
S8 |
S7 |
S6 |
S5 |
S4 |
S19 |
S18 |
S17 |
|
S16 |
S15 |
S14 |
S13 |
S12 |
S11 |
S10 |
S9 |
S8 |
S7 |
S6 |
S5 |
S20 |
S19 |
S18 |
S17 |
表2
步骤301、从存储器的起始地址0开始向存储器中写入数据块S0,并记录该数据块的起始存储地址。
步骤302、需写入新数据块S1时,获取前一次写入数据块的起始存储地址, 其中所述起始地址为0,所述新数据块为数据块1。
步骤303、将所述起始地址减去所述新数据块所包含的数据个数得到计算结果,即0-64=-64(计算结果)。
步骤304、本实施例中计算结果小于0,则将所述计算结果加上所述存储器的存储单元总数作为第二次写入数据的起始地址,即-64+1024=960(数据块S1的起始存储地址)。
步骤305、从计算得到的起始存储地址对应的存储单元开始将所述新数据块写入所述存储器,即从存储单元960开始,写入数据块S1。
步骤306、写入新数据块S2时,获取前一次写入的数据块S1的起始存储地址为960。
步骤307、将所述存储器起始地址960减去所述新数据块的数据个数64得到计算结果896。
步骤308、所述计算结果(896)大于0且小于存储器的存储单元总数1024,则896就是本次写入数据的起始地址,进而从存储单元896开始,写入数据块S2。
在本实施例中,当需要从存储器中读取相对于当前写入数据块的首数据的偏移量为K的地址单元中的数据时,可以采用以下方法:
获取当前写入数据块的起始存储地址,将获取到的起始存储地址加上偏移量K得到中间读取结果;
若所述中间读取结果大于存储器的存储单元总数,则将中间读取结果减去存储器的存储单元总数得到该数据的实际读取地址,当所述中间读取结果小于或等于存储器的存储单元总数,则直接将该中间读取结果作为该数据的实际读取地址;
从所述实际读取地址中读取数据。
接下来参照表2,以在第三次写入数据后,需要读取偏移量为K的数据为例对上述过程进行说明,其中,第三次写入数据块时的起始存储地址为832;
例如当K=128时,将起始存储地址832加上偏移量128得到中间读取结果960,由于该中间读取结果小于存储器的存储单元总数1024,则直接以该结果作为待读取数据的实际访问地址960;
例如当K=192时,将起始存储地址832加上偏移量192得到中间读取结果1024,由于该中间读取结果等于存储器的存储单元总数1024,则将该中间读取结果1024减去存储器的存储单元总数1024得到待读取数据的实际访问地址0。
本发明另一实施例的数据存储方法,包括:
步骤401、当第一次向存储器中写入数据块时,从预设的数据块起始存储地址开始写入所述数据块(本实施例中预设的数据块的起始存储地址0),并记录该数据块的起始存储地址。
步骤402、当写入新数据块时,获取上一次写入数据块的起始存储地址。
步骤403、将获取到的起始地址减去所述新数据块所包含的数据个数得到计算结果。
上一次数据写入数据块的起始存储地址存储在寄存器reg_ptr,则,计算结果reg_ptr=reg_ptr-64;
步骤404、将所述计算结果的二进制数与存储器的最大存储地址的二进制数进行逻辑与运算得到本次写数据块的起始地址。
本实施例中以存储器包括1024个存储单元,其最大存储地址为1023为例,则该地址的二进制数为0x3FF,则起始地址reg_ptr=reg_ptr & 0x3ff;
步骤405、从所述本次写数据块的起始地址所对应的存储单元开始写入所述新数据块。
在本实施例中,当需要从存储器中读取相对于当前写入数据块的首数据的偏移量为K的地址单元的数据时,可以采用以下方法:
获取当前写入数据块时的起始地址,并将获取到的起始地址加上偏移量K得到中间读取结果;
将所述中间读取结果的二进制数与存储器的最大存储地址的二进制数 (本例中为0x3FF)进行逻辑与运算得到读数据的实际地址;
从所述实际地址中读取数据。
本发明实施例可用于mp3解码滤波过程中对中间过程数据的存储,达到减少对存储器的读写,进而减少运算时间、降低读写存储器的功耗的效果。
如图4所示,本发明实施例还提供一种数据存储装置,包括地址确定单元501、写入单元502:
地址确定单元501,用于获得当前待写入数据块的前一数据块的起始存储地址,并将所述起始存储地址减去所述当前待写入数据块的大小,得到计算结果,若所述计算结果小于0,则按照预定的策略将所述计算结果映射到所述存储器的有效地址内,以该映射的结果作为所述当前待写入数据块的起始存储地址;若所述计算结果大于或等于0,则直接以该计算结果作为所述当前待写入数据块的起始存储地址。
其中将所述计算结果映射到所述存储器的有效地址内可以是将所述计算结果与所述存储器的存储单元总数相加;也可以是将所述计算结果的二进制数与所述存储器的最大存储地址的二进制数进行逻辑与运算。
写入单元502,用于从所述当前待写入数据块的起始存储地址对应的存储单元开始写入所述当前待写入数据块。
本发明实施例的数据存储装置进一步还包括:
读取单元503,用于获得所述当前待写入数据块的起始存储地址,并将所述起始存储地址加上当前待读取数据相对于该数据块的首数据的偏移量得到中间读取结果,若所述中间读取结果大于存储器的存储单元总数,则将所述中间读取结果映射到所述存储器的有效地址内,以该映射的结果作为所述当前待读取数据的实际读取地址;若所述中间读取结果小于或等于存储器的存储单元总数,则直接以该中间读取结果作为当前待读取数据的实际读取地址,并从所述实际读取地址中读取所述待读取数据。
其中将所述中间读取结果映射到所述存储器的有效地址内可以是将所述中间读取结果减去所述存储器的存储单元总数;也可以是将所述中间读取结果的二进制数与所述存储器的最大存储地址的二进制数进行逻辑与运算。
在包含1024个存储单元的存储器中,利用现有技术的方法每进行一次批量移动数据并刷新数据块,共需要960次读数据和1024次写数据,而利用本方案,只需要64次写数据即可完成。可以看出,本发明实施例采用移地址的方法进行数据块的存储,与现有技术中需先批量移动数据再写入数据的方法相比,可以减少对存储器的读写,进而减少运算时间、降低读写存储器的功耗。
本发明所述的方法并不限于具体实施方式中所述的实施例,本领域技术人员根据本发明的技术方案得出其它的实施方式,同样属于本发明的技术创新范围。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。