发明内容
本发明主要解决的技术问题是提供一种单片机片内置Flash数据快速检索方法,该快速检索方法可以避免单片机增加外置存储器时增加嵌入式产品单板的面积,降低控制电路的设计难度和成本;同时也可以避免用单片机内置FLASH程序存贮器模拟EEPROM的数据存储时,检索配置参数和运行数据时间长,提高系统实时性。
为了解决上述问题,本发明提供一种单片机片内置Flash数据快速检索方法,该单片机片内置Flash数据快速检索方法包括:
建立数据信息编号对应的索引值与存储地址的映射表,将数据信息按索引值的大小依次存储;
检索存储的数据信息时,先根据该数据信息编号对应的索引值,在映射表中找到与该索引值对应的存储地址,再从该存储地址起向后查询与该编号相同的数据信息。
进一步地说,赋予每个数据信息唯一的编号,建立数据信息编号对应的索引值与存储地址的映射表,将数据信息按索引值的大小依次存储的步骤包括:
定义2字节的变量作为起始存储地址;
通过哈希算法获得每个待存储的数据信息编号的1字节的哈希值,并将该哈希值作为索引值,确定该索引值在映射表中对应的存储地址是否为0XFFFF;当存储地址为0XFFFF时,检索与该索引值对应的存储地址并赋值给起始存储地址;
从数据信息编号的索引值开始向后遍历,确定是否存在有效的存储地址,当存在有效存储地址时查找最近的具有有效存储地址的数据信息编号的索引值,并将最后存储地址后一位赋值给起始存储地址,并将最后存储地址长度增加为数据信息的长度;
计算本次请求存储的数据存储的起始存储地址所在页的序号;
从数据信息存储的起始存储地址所在页序号开始增加存储数据信息,将请求插入存储的数据信息编号的索引值对应的存储地址设置为起始存储地址,该起始存储地址之后的数据信息依次向后偏移插入存储的数据信息的长度;
更新映射表。
进一步地说,所述哈希算法包括MD2、MD4、MD5和SHA-1。
进一步地说,计算本次请求数据信息存储的起始存储地址所在页序号的步骤包括:所述页序号为起始存储地址/每页大小,其中每页大小表示单片机片内Flash每页的大小。
进一步地说,从数据信息存储的起始存储地址所在页序号开始增加存储数据信息,将请求存储的数据信息插入到起始存储地址,该起始存储地址之后的数据依次向后偏移插入存储的数据信息的长度的步骤包括:
先将起始存储地址之前的数据拷贝到缓存页,将本次请求存储的数据信息写入缓存页,然后从页序号将起始存储地址后的数据信息依次拷贝到缓存页,直到缓存页写满;再将剩余的页序号中数据信息长度先拷贝到RAM中;然后将页序号后一页擦除,最后将缓存页中的数据信息拷回到页序号后一页,从而实现请求存储数据的插入存储,请求存储的数据信息插入存储到起始存储地址时,该起始存储地址之后的数据依次向后偏移请求存储的数据信息的长度。
进一步地说,更新映射表的步骤包括:将插入存储的数据信息编号的索引值之前的映射表保持不变,将插入存储的数据信息编号的索引值对应的存储地址设置为起始存储地址,将插入存储的数据信息编号的索引值之后存在有效的存储地址长度增加插入存储的数据信息的长度。
进一步地说,检索存储的数据信息时,先根据该数据信息编号对应的索引值,在映射表中找到与该索引值对应的存储地址,再从该存储地址起向后查询与该编号相同的数据信息的步骤包括:
计算待检索的数据信息编号的索引值;
在索引值与存储地址对应关系的映射表中,查找待检索的数据信息编号索引值对应的路由信息的存储地址;
确定待检索的数据信息编号索引值对应的存储地址是否为无效地址,当待检索的数据信息编号索引值对应的存储地址为有效地址时,检索该索引值对应的存储地址,并从该存储地址开始向后遍历,查找与待检索的数据信息编号一致的数据信息,存在与待检索的数据信息编号一致的数据信息时,则检索并返回该数据信息编号对应的数据信息,完成检索。
进一步地说,请求检索的数据信息时,先根据请求存储数据信息编号,计算出1字节的哈希值,并将该哈希值为索引值。
本发明单片机片内置Flash数据快速检索方法,建立数据信息编号对应的索引值与存储地址的映射表,将数据信息按索引值的大小依次存储;在读取存储的数据信息时,根据需检索数据信息编号对应的索引值,在映射表中找到相应的存储地址,从该地址起查询与该编号一致的信息。由于该检索方法是以每个数据信息编号的索引值大小依次存储。由于在存储数据信息时建立了每个数据信息编号对应的索引值与存储地址的映射表。在检索数据信息时,先通过检索该数据信息编号对应的索引值,再根据该索引值与映射表中的存储地址对应关系找到该索引值相应的存储地址,从该存储地址起查询与该编号一致的数据信息,而不必全面在存储器全面的扫描检索,提高检索效率。可以避免单片机增加外置存储器时,增加嵌入式产品单板的面积,降低控制电路的设计难度和成本;同时也可以避免采用单片机内置FLASH程序存贮器模拟EEPROM的数据存储时,读取配置参数和运行数据时间长,提高系统的实时性。
具体实施方式
为了使要发明的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图1所示,本发明一种单片机片内置Flash数据快速检索方法,其包括以下步骤:
S10步骤,建立数据信息编号对应的索引值与存储地址的映射表,将数据信息按索引值的大小依次存储。
具体地说,首先赋予每一个存储的数据信息唯一的编号,通过哈希算法,如采用MD2、MD4、MD5和SHA-1等算法计算每个数据信息编号的1字节的哈希值,并将该哈希值作为索引值。
如表1所示,存储的信息包括索引值、编号、数据信息长度和数据信息。
表1
建立和保存数据信息编号对的索引值和存储地址的映射表,即不同数据信总编号对应的索引值与该索引值对应的数据信息存储的存储地址映射关系。
当多个数据信息编号对应同一个索引值时,该索引值对应为最后请求存储的数据信息的存储地址,该索引值对应的其他数据信息编号的数据信息依次向后偏移存储。当该映射表在有新的数据请求存储时按数据信息编号对应的索引值大小顺序自动更新。所述映射表格式如表2所示。
表2
将数据信息按其编号的索引值的大小依次存储。先定义两个字节的变量作为起始存储地址;通过哈希算法获得每个待存储的数据信息编号的1字节的哈希值,并将该哈希值作为索引值,确定该索引值在映射表中对应的存储地址是否为0XFFFF;当存储地址为0XFFFF时,将该索引值对应的存储地址赋值给待存储数据信息的起始存储地址;当存储地址是0XFFFF时,从数据信息编号的索引值开始向后遍历,确定是否存在有效的存储地址,当存在有效存储地址时查找最近的具有有效存储地址的数据信息编号的索引值,并将最后存储地址后一位赋值给起始存储地址,并将最后存储地址长度增加为数据信息的长度;计算本次请求存储的数据存储的起始存储地址所在页的序号;
从数据信息存储的起始存储地址所在页序号开始增加存储数据信息,将请求插入存储的数据信息编号的索引值对应的存储地址设置为起始存储地址,该起始存储地址之后的数据信息依次向后偏移插入存储的数据信息的长度;即先将起始存储地址之前的数据拷贝到缓存页,将本次请求存储的数据信息写入缓存页,然后从页序号将起始存储地址后的数据信息依次拷贝到缓存页,直到缓存页写满;再将剩余的页序号中数据信息长度先拷贝到RAM中;然后将页序号后一页擦除,最后将缓存页中的数据信息拷回到页序号后一页,从而实现请求存储数据的插入存储,请求存储的数据信息插入存储到起始存储地址时,该起始存储地址之后的数据依次向后偏移。
最后更新映射表完成数据信息存储,即当待插入的存储数据信息对应的索引值在映射表中是0FFFF时,将本次存储的起始存储地址设置为该索引对应的存储地址,将插入存储的数据信息编号的索引值之前的映射表保持不变,将插入存储的数据信息编号的索引值对应的存储地址设置为起始存储地址,将插入存储的数据信息编号的索引值之后存在有效的存储地址长度增加插入存储的数据信息的长度。
S11步骤,检索存储的数据信息时,先根据该数据信息编号对应的索引值,在映射表中找到与该索引值对应的存储地址,再从该存储地址起向后查询与该编号相同的数据信息。
具体地说,检索存储的数据信息时,先根据待检索数据信息的编号通过哈希算法获得对应的索引值,在索引值与存储地址对应关系的映射表中,查找待检索的数据信息编号索引值对应的路由信息的存储地址;再确定待检索的数据信息编号索引值对应的存储地址是否为无效地址,当待检索的数据信息编号索引值对应的存储地址为有效地址时,检索该索引值对应的存储地址,并从该存储地址开始向后遍历,查找与待检索的数据信息编号一致的数据信息,存在与待检索的数据信息编号一致的数据信息时,则检索并返回该数据信息编号对应的数据信息,完成检索。
由于该检索方法先采用哈希算法获得每个数据信息编号的索引值,并以该索引值的大小依次存储,并建立索引值与存储的数据信息映射关系,在对数据信息进行检索时,只需要检索数据信息编号对应的索引值;当检索到需要的数据信息对应的索引值时,再通过该索引值与数据信息存储地址映射关系,在映射表中找到相应的数据信息存储地址,并从该存储地址起向后查询与该编号相同的数据信息信息,而不必全面在存储器全面的扫描检索,提高检索效率。可以避免单片机增加外置存储器时增加嵌入式产品单板的面积,降低控制电路的设计难度和成本;同时也可以避免采用单片机内置FLASH程序存贮器模拟EEPROM的数据存储时,读取配置参数和运行数据时间长,提高系统实时性。
为了更好说明本发明单片机片内置Flash数据快速检索方法,现以管理100只电表的集中器为例说明,其中电表的电表编号为6个字节。(使用本方法检索到指定电表的信息的时间将比传统的方法节省90%以上,管理的数据越多,提高的效率越明显。)
在存储数据信息时保证单片机片内Flash除了程序区域外有足够的区域作为存储区域。
单片机片内Flash是以页来划分,Flash的擦除需要以页为单位,Flash的写入需要写入位置为0XFFFF。根据片内Flash的特性,将机片内Flash划分为如图2所示结构。该Flash包括程序区和非程序区,其中非程序区由缓存页、映射表和数据信息构成的数据存储区以及用于扩展的空白区。
所述非代码区域需要能存储所有电表的信息,需要一页来存储映射表,需要一页作为数据的缓存页,需要存储2字节的当前存储数据信息的最后地址。
映射表中的哈希值0~255对应的存储地址初始化为0XFFFF,当对应电表编号的哈希值有存储请求时,执行完存储操作后,该映射表中相应的哈希值对应的存储地址将更新。
如图3所示,所述单片机片内Flash存储器数据存储流程。
当前存储数据信息的最后地址u16LastAddr在有新数据存储时更新,该值初始化为存储区域的起始位置。
步骤S101,定义两个字节的变量作为待存储数据的起始存储地址,即定义两他字节的长度;具体地说,定义两个字节变量u16InsertAddr为待插入数据信息的起始存储地址,该变量u16InsertAddr作为待插入电表数据信息的起始存储地址,定义要存储的数据信息长度为u8Len;在有数据信息请求存储时,单片机根据请求存储的数据信息长度,按表1的格式打包,计算其存储数据信息的长度为u8Len,单片机定义2字节的变量u16InsertAddr作为存储数据的起始存储地址。
步骤S102,计算待存储的电表编号的索引值;具体地说,通过哈希算法,如采用MD2、MD4、MD5和SHA-1等算法计算电表编号的哈希值u8HashValue;单片机将6字节电表编号通过哈希算法得到1字节的电表编号的哈希值u8HashValue,并将该哈希值作为其存储位置的判断依据,即并将该哈希值作为索引值。
步骤S103,判断步骤S102中获得的索引值在映射表中的对应的存储地址是否为0XFFFF;具体地说,判断电表编号的哈希值u8HashValue在映射表中的对应的存储地址是否为0XFFFF。
步骤S104,检索步骤S103中与该哈希值对应的存储地址赋值给起始存储地址;具体地说,当电表编号的哈希值u8HashValue在映射表中的对应的存储地址不是0XFFFF时,说明已经有该索引值对应的电表编号进行数据存储,将检索的存储地址赋值给起始存储地址u16InsertAddr,将本次请求存储的数据信息保存在该存储地址,并将该数据信息对应的存储地址以后的数据信息依次向后偏移;同时把映射表中从电表编号的哈希值u8HashValue以后的具有有效存储地址的电表编号的哈希值对应的存储地址的长度增加数据信息长度u8Len。
步骤S105,在映射表中从电表编号的哈希值开始向后遍历,判断是否存在有效的存储地址;具体地说,在映射表中从电表编号的哈希值u8HashValue开始向后检查,判断是否存在有效的存储地址,当存储地址为0XFFFF时,说明还没有该电表编号的哈希值对应的电表编号请求过存储,并将与该电表编号对应的数据信息存储在该地址,同时将修改映射表中该哈希值对应的存储地址为本次请求的存储地址;再从映射表中从该电表编号的哈希值u8HashValue往后查找具有有效存储地址的电表编号的哈希值。
步骤S106,在映射表中从电表编号的哈希值向后,查找最近的具有有效行储地址的哈希值;具体地说,在映射表中从哈希值u8HashValue向后,查找最近的具有有效的存储地址的哈希值u8TmpHash,取得有效存储地址的哈希值u8TmpHash对应的存储地址赋值起始存储地址u16InsertAddr;当存在有效的存储地址的哈希值u8TmpHash,将该哈希值对应的存储地址赋值给起始存储地址u16InserAddr。
步骤S107,将最后存储地址后一位赋值给起始存储地址,并将最后存储地址长度增加;具体地说,当不存在有效的存储地址时,即当电表编号的哈希值u8HashValue以后不存在有效的存储地址的哈希值时,将本次请求存储的数据信息保存在当前存储数据信息的最后地址后面;也就是说,将本次请求存储的数据信息保存在最后存储地址u16LastAdd的后一位,同时将最后存储地址u16LastAdd的后一位存储地址长度增加为数据信息的长度u8Len。
步骤S108,计算本次请求存储的数据存储的地址起始存储地址所在的页的序号;具体地说,计算本次请求存储的数据信息存储的起始存储地址u16InsertAdd所在页序号,该页序号PageNum为起始存储地址u16InsertAddr/每页大小Pagesize,其中该PageSize表示单片机片内Flash每页的大小。
步骤S109,从数据信息存储的起始存储地址所在页序号开始增加存储数据信息;具体地说,在页序号PageNum,先将起始存储地址u16InsertAddr之前的数据拷贝到缓存页,将本次请求存储的数据信息写入缓存页,然后从页序号PageNum将起始存储地址u16InserAddr后的数据信息依次拷贝到缓存页,直到缓存页写满。再将剩余的页序号PageNum中存储数据信息的长度u8Len的数据信息先拷贝到RAM中;然后将页序号PageNum后一页擦除,再将缓存页中的数据信息拷回到页序号PageNum后一页,从而实现请求存储数据的插入存储;依次类推,请求存储的数据信息插入存储到起始存储地址u16InsertAddr,该起始存储地址之后的数据依次向后偏移数据信息的长度u8Len的位置。所述数据信息长度与存储地址长度相对应。
步骤S110,更新映射表;具体地说,当待插入的存储数据信息对应的索引值在映射表中是0FFFF时,将本次存储的起始存储地址设置为该索引对应的存储地址,利用缓存页作为数据信息的暂存区,将电表编号的哈希值u8HashValue之前的映射表保持不变,将电表编号的哈希值u8HashValue对应的存储地址设置为起始存储地址u16InsertAddr,将电表编号的哈希值u8HashValue之后存在有效的存储地址长度增加u8Len;即将电表编号的哈希值u8HashValue(包括电表编号的哈希值u8HashValue)之前的数据拷贝到缓存页;再将电表编号的哈希值u8HashValue之后的具有有效地址的哈希值对应的有效地址长度增加为数据信息长度u8Len,并写入到缓存页,擦除原映射表,然后将更新过保存在缓存页的映射表拷贝回映射表所在页。
如图4所示,管理多只电表的集中器检索数据流程。
步骤S201,计算待检索的电表编号的索引值;具体地说,当集中器请求检索指定电表编号的电表信息时,先根据请求的电表的6字节电表编号,计算出1字节的哈希值,并以该哈希值为索引值。
步骤S202,查找索引值对应的路由信息的存储地址;具体地说,在索引值与存储地址对应关系的映射表中,根据步骤S201中的索引值查找对应的存储地址。
步骤S203,确定索引值对应的存储地址为无效地址;具体地说,当步骤S203中的索引值对应的存储地址为无效地址(0XFFFF),表示没有该电表编号对应的数据信息,返回错误信息。
步骤S204,从索引值对应的存储地址开始遍历查找和该表号一致的信息;具体地说,当步骤S203中的索引值对应的存储地址为有效地址(不是0XFFFF),检索该索引值对应的存储地址,并从该存储地址开始向后遍历,查找请求检索的电表编号一致的数据信息。
步骤S205,判断是否找到与检索的电表编号一致的数据信息,若未查找到与检索的电表编号一致的数据信息时,说明数据信息区域还没有存储与当前电表编号一致的数据信息,返回错误信息。
步骤S206,读取相庆的电表信息;具体地说,当有找到与当前电表编号一致的数据信息时,则读取并返回该电表编号对应的数据信息,完成检索。
由于在检索时,先找到检索电表信息对应的哈希值,再从该电表信息对应的哈希值之后的数据信息中查找到所需的电表信息,而不必全面在存储器全面的扫描检索,提高检索效率。可以避免单片机增加外置存储器时增加嵌入式产品单板的面积;同时也可以避免采用单片机内置FLASH程序存贮器模拟EEPROM的数据存储时,读取配置参数和运行数据时间长,数据丢失,降低控制电路的设计难度和成本。
以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换,而这些修改或替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。