本申请涉及一种采用嵌入式系统(embeddedsystem)的电子设备的固件存储及读取方法。
背景技术:
lvgl(lightandversatilegraphicslibrary,轻量通用图形库)是一种新的gui(graphicaluserinterface,图形用户界面)系统框架,具有代码量小、易于开发ui(userinterface,用户界面)的优点。采用嵌入式系统的电子设备可采用lvgl作为gui系统框架。
lvgl系统框架在用户界面上会使用一些资源文件,例如图像文件、音频文件、动画文件、字体文件等。现有的lvgl系统框架对资源文件的保存方式,都是以源文件方式编译到固件代码中。电子设备只有升级整个固件,才能升级其中的资源文件,不支持单独升级资源文件。因此更换开关机的动画、更换铃声、更换背景图片等需求都需要升级整个固件。
技术实现要素:
本申请所要解决的技术问题是提供一种基于lvgl系统框架的固件存储及读取方法,可以方便地升级其中的资源文件,而不需要升级整个固件。
为解决上述技术问题,本申请提出了一种基于lvgl的固件存储读取方法,包括如下步骤。步骤s1:在采用lvgl作为gui系统框架的电子设备的固件中,将代码的镜像文件保存在第一分区中,将资源文件保存在第二分区中,第二分区采用只读的文件系统;所述只读的文件系统中,每个目录或者资源文件都具有文件头。第一分区和第二分区在同一个qspi接口的或非门闪存上;或者第一分区在qspi接口的或非门闪存上,第二分区在spi接口的或非门闪存上。为所述只读的文件系统设置第一缓存区和第二缓存区;第一缓存区用来保存最近读取的目录或者资源文件的文件头、以及最近读取的目录或者资源文件的名称;第二缓存区用来保存第一缓存区中保存的文件头在所述只读的文件系统里的绝对逻辑地址,以及第一缓存区的内存地址和长度。步骤s2:当所述电子设备的固件想要读取某个资源文件时,发出目标文件的字符串形式的路径以及文件名称,所述只读的文件系统在第二分区中遍历文件头以匹配到目标文件的路径中的各级目录以及目标文件的文件名称,获取目标文件的文件头的绝对逻辑地址。步骤s3:根据目标文件的文件头的绝对逻辑地址,找到目标文件的文件内容的绝对逻辑地址的起始地址。步骤s4:所述只读的文件系统根据目标文件的文件内容的绝对逻辑地址的起始地址,读出目标文件的二进制数据。
进一步地,所述资源文件包括图像文件、音频文件、动画文件、字体文件中的一种或多种。
进一步地,所述步骤s1中,为每个物理硬件分配互不重合的地址段,为每个分区分配互不重合的地址段,每个物理硬件的地址段信息、每个分区的地址段信息和大小均记录在分区表中;所述只读的文件系统在初始化时,通过查询分区表了解第二分区在哪一个物理硬件上,并且获取第二分区的起始地址。
进一步地,所述只读的文件系统中,每个目录都是以文件头、字符串形式的目录名称的顺序依次存放;每个资源文件都是以文件头、字符串形式的文件名称、二进制数据形式的文件内容的顺序依次存放;所有文件头的长度固定,存放每个目录或者文件的名称的存储空间的长度固定。
进一步地,所述只读的文件系统仅用来保存所述电子设备的固件中的资源文件;所述只读的文件系统中,目录或资源文件均为顺序存放;文件头也是顺序存放,并且文件头的顺序与对应的目录或资源文件的顺序保持一致。
进一步地,所述只读的文件系统中,每个目录或者资源文件的文件头的格式一致,其中记录着下一个(根据顺序)目录或者文件的文件头在所述只读的文件系统中的偏移地址;文件头的类型和是否可执行的属性;如果是目录类型,记录该目录的子目录或子文件的逻辑地址;如果是文件类型,记录文件的大小;文件头和文件名称的校验和;字符串形式的目录或者文件的名称的第一个字节。
进一步地,所述步骤s2中,遍历文件头具体包括如下过程;从第二分区中的第一个目录或者文件的文件头开始遍历,寻找与目标文件的路径中的每一级目录匹配的目录类型的文件头;当找到匹配的目录类型的文件头之后,再通过该目录类型的文件头中记录的第一个子目录或者第一个文件的逻辑地址,去查找与目标文件的路径中的下一级目录匹配的目录类型的文件头,直至找到与目标文件的名称匹配的文件类型的文件头;返回这个文件类型的文件头的绝对逻辑地址;匹配目标文件的路径中的每一级目录以及文件名称时,都采用下面的处理方式。(1)根据目标文件的路径中的每一级目录或者文件名称的文件头的绝对逻辑地址判断其位于哪一个物理硬件中。(2)如果目标文件的路径中的某一级目录或者文件名称的文件头位于qspi接口的或非门闪存中,则直接将文件头的绝对逻辑地址返还上层接口。(3)如果目标文件的路径中的某一级目录或者文件名称的文件头位于spi接口的或非门闪存中,则首先访问第二缓存区,判断第二缓存区中保存的绝对逻辑地址与目标文件的路径中的该级目录或者文件名称的文件头的绝对逻辑地址是否相同。(3-1)如果相同,从第二缓存区找到第一缓存区的内存地址和长度,将第一缓存区的内存地址返回给上层接口。(3-2)如果不相同,将目标文件的路径中的该级目录或者文件名称的文件头的绝对逻辑地址减去第二分区的起始地址,得到目标文件的路径中的该级目录或者文件名称的文件头的相对逻辑地址;然后根据该相对逻辑地址在第二分区中读出目标文件的路径中的该级目录或者文件名称的文件头,将此文件头和文件名称保存在第一缓存区中,并更新第二缓存区中记录的绝对逻辑地址,随后把第一缓存区的内存地址返回给上层接口。
进一步地,所述步骤s2中,在更新第二缓存区中记录的绝对逻辑地址时,如果第一缓存区采用动态内存分配方式,则更新第二缓存区中记录的第一缓存区的内存地址;如果第一缓存区采用静态内存分配方式,不用更新第二缓存区中记录的第一缓存区的内存地址。
进一步地,所述步骤s3中,将目标文件的文件头的绝对逻辑地址加上文件头的固定长度,再加上目标文件的文件名称的长度,在文件名称的结束字符后的按16字节对齐的第一个字节开始的地址作为目标文件的文件内容的绝对逻辑地址的起始地址。
进一步地,所述步骤s4中,如果目标文件位于qspi接口的或非门闪存中,直接用目标文件的文件内容的绝对逻辑地址的起始地址读出目标文件的二进制数据;如果目标文件位于spi接口的或非门闪存中,通过spi接口读出目标文件的二进制数据。
本申请还提出了一种基于lvgl的固件存储读取装置,包括固件存储单元、文件头寻址单元、文件寻址单元、固件读取单元。所述固件存储单元用来在采用lvgl作为gui系统框架的电子设备的固件中,将代码的镜像文件保存在第一分区中,将资源文件保存在第二分区中,第二分区采用只读的文件系统;所述只读的文件系统中,每个目录或者资源文件都具有文件头;第一分区和第二分区在同一个qspi接口的或非门闪存上;或者第一分区在qspi接口的或非门闪存上,第二分区在spi接口的或非门闪存上;还为所述只读的文件系统设置第一缓存区和第二缓存区;第一缓存区用来保存最近读取的目录或者资源文件的文件头、以及最近读取的目录或者资源文件的名称;第二缓存区用来保存第一缓存区中保存的文件头在所述只读的文件系统里的绝对逻辑地址,以及第一缓存区的内存地址和长度。所述文件头寻址单元用来当所述电子设备的固件想要读取某个资源文件时,发出目标文件的字符串形式的路径以及文件名称,在第二分区中遍历文件头以匹配到目标文件的路径中的各级目录以及目标文件的文件名称,获取目标文件的文件头的绝对逻辑地址。所述文件寻址单元用来根据目标文件的文件头的绝对逻辑地址,找到目标文件的文件内容的绝对逻辑地址的起始地址。所述固件读取单元用来根据目标文件的文件内容的绝对逻辑地址的起始地址,读出目标文件的二进制数据。
本申请取得的技术效果是支持电子设备的固件中的资源文件单独升级,特别适用于采用lvgl系统框架的电子设备。
附图说明
图1是本申请提出的基于lvgl系统框架的固件存储及读取方法的流程示意图。
图2是第一分区和第二分区在同一个物理硬件上的示意图。
图3是第一分区和第二分区在不同的物理硬件上的示意图。
图4是本申请提出的基于lvgl系统框架的固件存储及读取装置的结构示意图。
图中附图标记说明:固件存储单元1、文件头寻址单元2、文件寻址单元3、固件读取单元4。
具体实施方式
请参阅图1,本申请提出的基于lvgl系统框架的固件存储及读取方法包括如下步骤。
步骤s1:在采用lvgl作为gui系统框架的电子设备的固件中,将用来执行的代码的镜像文件保存在可读写的第一分区中,将资源文件保存在第二分区中,第二分区采用只读的文件系统。所述资源文件包括图像文件、音频文件、动画文件、字体文件等,主要用于电子设备的用户界面。
这一步中,将代码的镜像文件和资源文件保存在不同的分区中,并且资源文件所在的第二分区采用了只读的文件系统。所述只读的文件系统中的内容可以被整体替换,从而实现电子设备的资源文件可以单独升级。
第一分区和第二分区或者在同一个物理硬件上,或者在不同的物理硬件上。为每个物理硬件分配互不重合的地址段,为每个分区也分配互不重合的地址段,每个物理硬件的地址段信息、每个分区的地址段信息和大小都记录在分区表中。所述只读的文件系统在初始化时,通过查询分区表了解第二分区在哪一个物理硬件上,并且获取第二分区的起始地址。
请参阅图2,第二分区与第一分区是同一个物理硬件,例如是qspi(quadserialperipheralinterface,4线串行外设接口)接口的或非门闪存(norflash)。电子设备的处理器(例如arm芯片;其中arm表示advancedriscmachine,高级精简指令集机器)通过qspi接口访问第一分区和第二分区。为qspi接口的或非门闪存分配一个地址段,例如是0x80000000开头,其中0x表示十六进制数。此时,第一分区的地址段例如是0x80000000至0x88ffffff,第二分区的地址段例如是0x89000000至0x8fffffff,两者没有任何重合。每个地址段既是物理地址,也是逻辑地址。
请参阅图3,第二分区与第一分区是不同的物理硬件。第一分区例如在qspi接口的或非门闪存上,第二分区例如在spi(serialperipheralinterface,串行外设接口)接口的或非门闪存上。电子设备的处理器(例如arm芯片)通过qspi接口访问第一分区,通过spi接口访问第二分区。为qspi接口的或非门闪存分配第一地址段,例如是0x80000000开头。为spi接口的或非门闪存分配第二地址段,例如是0x90000000开头。显然,第一地址段和第二地址段没有任何重合。此时,第一分区的地址段例如是0x80000000至0x8fffffff,第二分区的地址段例如是0x90000000至0x9fffffff,两者没有任何重合。每个地址段既是物理地址,也是逻辑地址。
qspi接口的或非门闪存具有片上执行(executeinplace,xip)的特性,这是指处理器直接从qspi接口的或非门闪存中读取程序代码执行,而不用再读到内存中。其好处即是程序代码无需占用内存,减少内存的要求。
所述只读的文件系统仅用来保存所述电子设备的固件中的资源文件。所述只读的文件系统中,目录或资源文件均为顺序存放。每个目录或者资源文件都具有文件头。每个目录都是以文件头、目录名称(字符串形式)的顺序依次存放。每个资源文件都是以文件头、文件名称(字符串形式)、文件内容(二进制数据)的顺序依次存放。每个目录或者资源文件的文件头的格式一致,其中记录着下一个目录或者文件的文件头在所述只读的文件系统中的偏移地址;文件头的类型(目录或文件)和是否可执行的属性;如果是目录类型,记录该目录的子目录或子文件的逻辑地址;如果是文件类型,记录文件的大小;文件头和文件名称的校验和;字符串形式的目录或者文件的名称的第一个字节。每个文件头的长度固定,随后是字符串形式的目录或者文件的名称。每个目录或者文件的名称都有特殊字符作为结束字符,该结束字符用来计算目录或者文件名称的长度。如果是文件类型的文件头,在文件名称的结束字符后的按16字节对齐的第一个字节开始是文件内容(二进制数据)。文件内容的绝对逻辑地址的起始地址就是文件头的绝对逻辑地址加上文件头的固定长度,再加上文件名称的长度,在文件名称的结束字符之后按16个字节对齐后的第一个字节的起始地址。所述只读的文件系统中,文件头也是顺序存放,并且文件头的顺序与对应的目录或资源文件的顺序保持一致。
为所述只读的文件系统设置第一缓存区和第二缓存区。第一缓存区用来保存最近读取的目录或者资源文件的文件头、以及最近读取的目录或者资源文件的名称。第二缓存区用来保存第一缓存区中保存的文件头在所述只读的文件系统里的绝对逻辑地址,以及第一缓存区的内存地址和长度。
步骤s2:当所述电子设备的固件想要读取某个资源文件时,将想要读取的资源文件称为目标文件,所述电子设备的固件向所述只读的文件系统发出目标文件的字符串形式的路径以及文件名称。所述只读文件系统从第二分区中的第一个文件头开始遍历,通过遍历文件头以匹配到目标文件的路径中的各级目录以及目标文件的文件名称,直至找到目标文件的文件头,获取目标文件的文件头的绝对逻辑地址。
所述遍历文件头具体包括如下过程。查找目标文件是从第一个目录或者文件的文件头开始遍历。如果目标文件的路径加文件名称是多级的,比如1级目录加1级文件名,例如“r:/png/background.png”,其中r表示第二分区。则需要从父级目录(目录名png)开始找匹配的目录类型的文件头。当找到匹配这个父级目录的文件头之后,也就是目录类型的文件头中记录的目录名称与此父级目录名一致,再通过该父级目录的文件头中记录的第一个子目录或者第一个文件的逻辑地址,去查找下一个文件头。判断下一个文件头是否是文件类型的、是否与目标文件的文件名匹配。如果不匹配,就通过当前文件头中记录的同级相邻的目录或者相邻的文件的文件头的逻辑地址,继续往后查找下一个文件头。直到访问的文件头的类型是文件类型,且文件名称与目标文件的文件名称匹配才结束查找。随后返回这个文件类型的文件头的绝对逻辑地址。匹配目标文件的路径中的每一级目录以及文件名称时,都采用下面的处理方式。
(1)根据目标文件的路径中的每一级目录或者文件名称的文件头的绝对逻辑地址(不是相对逻辑地址)判断其位于哪一个物理硬件中。
(2)如果目标文件的路径中的某一级目录或文件名称的文件头位于qspi接口的或非门闪存中,则直接将该文件头的绝对逻辑地址返还上层接口。此时绝对逻辑地址就是物理地址。
(3)如果目标文件的路径中的某一级目录或文件名称的文件头位于spi接口的或非门闪存中,则首先访问第二缓存区,判断第二缓存区中保存的“第一缓存区中保存的文件头的绝对逻辑地址”与目标文件的路径中的该级目录或文件名称的文件头的绝对逻辑地址是否相同。(3-1)如果相同,说明目标文件的路径中的该级目录或文件名称的文件头就是第一缓存区中保存的文件头,就从第二缓存区找到第一缓存区的内存地址和长度,将第一缓存区的内存地址返回给上层接口。(3-2)如果不相同,说明目标文件的路径中的该级目录或文件名称的文件头不是第一缓存区中保存的文件头,则将目标文件的路径中的该级目录或文件名称的文件头的绝对逻辑地址减去第二分区的起始地址,得到目标文件的路径中的该级目录或文件名称的文件头的相对逻辑地址。然后根据目标文件的路径中的该级目录或文件名称的文件头的相对逻辑地址在第二分区中通过spi接口的读写逻辑时序,从第二分区中读出目标文件的路径中的该级目录或文件名称的文件头,将此文件头和文件名称保存在第一缓存区中,并更新第二缓存区中记录的“第一缓存区中保存的文件头的绝对逻辑地址”。如果第一缓存区采用动态内存分配方式,则更新第二缓存区中记录的第一缓存区的内存地址。如果第一缓存区采用静态内存分配方式,不用更新第二缓存区中记录的第一缓存区的内存地址。随后把第一缓存区的内存地址返回给上层接口。
步骤s3:将目标文件的文件头的绝对逻辑地址加上文件头的固定长度,再加上目标文件的文件名称的长度,在文件名称的结束字符后的按16字节对齐的第一个字节开始的地址作为目标文件的文件内容的绝对逻辑地址的起始地址。
步骤s4:所述只读的文件系统根据目标文件的文件内容的绝对逻辑地址的起始地址,读出目标文件的二进制数据。此时如果目标文件位于qspi接口的或非门闪存中,直接用目标文件的文件内容的绝对逻辑地址的起始地址读出目标文件的二进制数据。此时如果目标文件位于spi接口的或非门闪存中,通过spi接口读出目标文件的二进制数据。
请参阅图4,本申请提出的基于lvgl系统框架的固件存储及读取装置包括固件存储单元1、文件头寻址单元2、文件寻址单元3、固件读取单元4。图4所示装置与图1所示方法相对应。
所述固件存储单元1用来在采用lvgl作为gui系统框架的电子设备的固件中,将代码的镜像文件保存在第一分区中,将资源文件保存在第二分区中,第二分区采用只读的文件系统;所述只读的文件系统中,每个目录或者资源文件都具有文件头;第一分区和第二分区在同一个qspi接口的或非门闪存上;或者第一分区在qspi接口的或非门闪存上,第二分区在spi接口的或非门闪存上;还为所述只读的文件系统设置第一缓存区和第二缓存区;第一缓存区用来保存最近读取的目录或者资源文件的文件头、以及最近读取的目录或者资源文件的名称;第二缓存区用来保存第一缓存区中保存的文件头在所述只读的文件系统里的绝对逻辑地址,以及第一缓存区的内存地址和长度。
所述文件头寻址单元2用来当所述电子设备的固件想要读取某个资源文件时,发出目标文件的字符串形式的路径以及文件名称,在第二分区中遍历文件头以匹配到目标文件的路径中的各级目录以及目标文件的文件名称,获取目标文件的文件头的绝对逻辑地址。
所述文件寻址单元3用来根据目标文件的文件头的绝对逻辑地址,找到目标文件的文件内容的绝对逻辑地址的起始地址。
所述固件读取单元4用来根据目标文件的文件内容的绝对逻辑地址的起始地址,读出目标文件的二进制数据。
本申请让电子设备的固件中的资源文件单独存放在第二分区中,并采用只读的文件系统,既能被上层代码访问,还支持资源文件分区的单独升级。采用的第一缓存区、第二缓存区的设计,还可以减少对物理存储器的读操作。
以上仅为本申请的优选实施例,并不用于限定本申请。对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。