一种编译阶段确保固件与工程匹配的单片机升级方法与流程

未命名 08-17 阅读:109 评论:0


1.本发明涉及单片机固件升级技术领域,尤其涉及一种编译阶段确保固件与工程匹配的单片机升级方法。


背景技术:

2.在许多单片机产品设计中,考虑到产品软件更新的便捷性,均需要设计在线升级功能。通用做法为uboot + app的方式,uboot为上电执行第一个程序,用于拷贝升级程序到运行地址,app为产品应用程序。传统的升级流程设计基本上把uboot和app完全作为两个程序设计,二者之间的交互甚少,只是一些标志类信息,且一般通过片上flash读写。由于片上flash是分页的,数据写入都必须整页擦除后再将数据写入,因此常常一个标志类数据的几个字节的更新都必须整页擦除再写入,效率低下。且一般设计都是app的更新地址提前固定,灵活性较差。一个最致命的问题为,许多产品的升级功能都进行较简单的设计。通常都只是在app中接收升级固件,然后将其写入flash的更新地址,随后复位单片机,在uboot中,将更新地址的固件拷贝到执行地址,再复位执行。整个过程简单粗暴,没有产品信息的校验功能,一旦升级固件选择出错,轻则造成功能异常,重则造成产品死机无法使用。而有些设计在编译程序后借助其他工具添加一些其他信息到固件中来解决这个问题,但这样破坏了原生工程编译后得到的文件,且管理不方便,没有做到生成的固件和原生工程匹配。另外,许多单片机软件设计中,依赖一些集成开发环境,如keil等,使用开发工具默认的工程配置,使得栈空间大小由单片机启动文件固定,且紧邻全局数据区,一旦栈空间大小设计不足且代码函数调用层次太多或局部变量太大,则会造成栈指针穿透越界到全局数据区,从而造成内存覆盖的严重问题,且此类问题排查较困难,很难发现问题所在。
3.需要说明的是,在上述背景技术部分公开的信息只用于加强对本公开的背景的理解,因此可以包括不构成对本领域普通技术人员已知的现有技术的信息。


技术实现要素:

4.本发明的目的在于克服现有技术的缺点,提供了一种编译阶段确保固件与工程匹配的单片机升级方法,解决了现有技术存在的问题。
5.本发明的目的通过以下技术方案来实现:一种编译阶段确保固件与工程匹配的单片机升级方法,所述升级方法包括:自定义片上资源划分步骤:将单片机上内存依次划分为系统参数区、通告参数区和共用区,将单片机上flash存储依次划分为uboot、执行文件头、执行区、更新文件头、更新区、备份文件头和备份区;uboot执行步骤:查询flash更新文件头处的更新标志值是否为更新标志,如果为更新标志,则擦除执行区数据后按照更新文件头中的文件长度拷贝更新区固件到执行区,计算执行区数据校验,并判断与更新文件头中的校验值是否匹配,根据判断结果进行相应操作;
app执行步骤:接收更新文件头,并将接收到的文件头中的设备信息与执行区文件头进行匹配,如果匹配成功,则接收升级固件剩余部分并写入更新区,检验更新区的数据与之前接收的更新文件头中的校验值是否匹配,并根据检验结果进行相应操作。
6.所述判断与更新文件头中的校验值是否匹配,根据判断结果进行相应操作具体包括以下内容:如果执行区数据校验与更新文件头中的校验值匹配,则将更新文件头中的更新标志更改为烧写标志,然后将更新文件头内容写入执行文件头,再擦除更新文件头,跳转到执行区开始执行更新后的app固件程序;如果执行区数据校验与更新文件头中的校验值不匹配,说明写入执行区的过程中出现错误,则擦除执行文件头内容后退出,等待下一次操作。
7.所述uboot执行步骤中,如果查询flash更新文件头的更新标志不是更新标志,说明app程序没有进行过固件升级操作,则判断通告参数区中的uboot执行标志是否设置,如果设置,则等待固件升级操作;如果通告参数区中的uboot执行升级标志没有设置,则判断执行文件头中的更新标志是否为烧写标志,如果是,则跳转到执行区执行app程序,否则,说明执行区数据内容错误或者没有烧写app程序,则等待固件升级操作。
8.所述app执行步骤中根据检验结果进行相应操作具体包括:如果更新区的数据与之前接收的更新文件头中的校验值匹配,说明写入更新区的操作没有错误,则将更新文件头中的更新标志设置为更新标志,并将更改后的文件头写入到flash更新文件头处,最后检验flash更新文件头的校验值是否与写入的文件头匹配,如果匹配,则说明写入没有错误,然后复位单片机进入uboot,完成更新操作;如果更新区的数据与之前接收的更新文件头中的校验值不匹配,则终止升级,返回错误。
9.所述自定义片上资源划分步骤中,系统参数区由uboot程序设置,用于记录flash存储空间的划分情况以供app程序使用;uboot程序运行于uboot,app程序运行于执行区;通告参数区用于app程序传递给uboot程序的参数存储,在app程序设置后复位进入uboot,uboot程序直接获取使用;公用区包括全局数据区和栈区,用于uboot程序和app程序各自独自运行的环境支持,并将程序运行的栈指针调整到单片机上内存的最大地址处。
10.所述app程序包括执行文件头地址、执行区地址、执行区大小、更新文件头地址、更新区地址、更新区大小、备份文件头地址、备份区地址和备份区大小。
11.所述app程序编译后烧写到产品时,运行固件分布于存储空间的执行文件头部分和执行区部分;执行文件头部分用于标识当前执行区内运行程序的属性以及对应产品硬件属性信息;执行区部分用于运行app程序;同时,编译程序后生成的更新固件文件同样分为执行文件头部分和执行区部分,其中执行文件头部分和当前产品此刻运行的程序的执行文件头完全一致。
12.本发明具有以下优点:1、完全自主控制单片机片上内存的使用,清晰明了的分区使用内存空间,uboot程序及产品app应用程序在编译链接及运行时完全受控,精确到每一个变量的存储地址都能
清晰的掌握。
13.2、调整优化栈空间的使用,将栈指针提升到片上内存最大地址处,最大限度利用内存空间,避免内存浪费。同时由于栈指针最大限度远离程序运行的全局数据区,因此最大限度避免了栈指针在程序运行过程中穿透到全局数据造成内存覆盖的问题,保证程序运行的安全性。
14.3、内存划分的系统参数及通告参数由uboot和app共享,避免了uboot和app程序通信的困难。同时,使用内存空间进行数据读写,速度快,效率高。避免了使用flash空间的擦除写入的笨拙操作,也减少了flash存储空间的浪费。
15.4、产品flash存储区的划分完全由uboot程序控制确定,使用系统参数告知app程序,app程序无需事先知晓更新区地址、备份区地址等固件升级备份的信息,完全可以统一设计,增加了设计的灵活性。不同类型的单片机基本只需修改uboot的存储区划分,app程序可以统一更新协议和方式,简洁方便。
16.5、app应用程序在编译链接过程中生成对应的文件匹配信息,用于统一原生工程代码、产品硬件、更新固件,保持三者一致性。从而达到当前运行的程序只能升级当前程序的原生工程代码编译得到的固件,增加产品软件的封闭性和安全性,避免了操作错误带来的影响。升级过程中,立刻识别固件一致性,无需等到将升级固件传输完成后,通过其他手段去识别。
附图说明
17.图1为本发明的结构示意图;图2为uboot程序执行的流程示意图;图3为app程序执行的流程示意图;图4为示例中单片机的内存分布及flash存储空间分布图。
具体实施方式
18.为使本技术实施例的目的、技术方案和优点更加清楚,下面将结合本技术实施例中附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本技术一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本技术实施例的组件可以以各种不同的配置来布置和设计。因此,以下结合附图中提供的本技术的实施例的详细描述并非旨在限制要求保护的本技术的保护范围,而是仅仅表示本技术的选定实施例。基于本技术的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本技术保护的范围。下面结合附图对本发明做进一步的描述。
19.本发明涉及一种编译阶段确保固件与工程匹配的单片机升级方法,目的在于解决现有单片机软件升级系统流程设计的不便性,不安全性。使得软件更新时uboot程序和app程序的数据交互更方便,避免一些标志类数据的flash读写操作,不再因为一些标志类数据的存储浪费整页flash资源。同时,解决升级固件和原生软件工程代码的匹配问题,做到当前软件工程编译的固件,只能升级到运行当前软件工程程序的产品中。升级过程中不小心固件选择错误,即使同型号的单片机,同类型不同版本的产品也能判别固件异常,拒绝升级。完全做到软件工程代码、产品、更新固件三者一致性。并且,优化软件运行栈空间的设
计,最大限度利用单片机的片上内存,从而最大限度避免栈指针穿透到全局数据区造成内存覆盖的问题。
20.如图1 所示,具体包括以下内容:单片机片上内存的使用完全自定义,将片上内存划分为系统参数区、通告参数区、公用区。系统参数区用于记录flash存储空间的划分情况,由uboot程序设置,供app程序使用。包含app程序的执行头文件地址、执行区地址、执行区大小、更新头文件地址、更新区地址等信息。通告参数区用于app程序传递给uboot程序的参数的存储,在app程序设置后复位进入uboot, uboot程序可直接获取使用。公用区用于uboot程序和app程序各自独立运行的环境支持,包含全局数据区,栈区等。同时将程序运行的栈指针调整到单片机片上内存的最大地址处,由于程序运行过程中,栈生长方式为向下递增的,因此最大限度利用片上内存空间,同时又远离程序运行的全局数据区,保证程序运行的安全。
21.如图2所示,uboot程序执行的流程如下所示:单片机上电,首先查询flash更新文件头处的更新标志值是否为更新标志。如果为更新标志,则首先擦除执行区数据,然后按照更新文件头中的文件长度拷贝更新区固件数据到执行区。拷贝完成后,计算执行区数据校验,并判断和更新文件头中的校验值是否匹配。如果匹配,则将更新文件头中的更新标志更改为烧写标志,然后将更新文件头内容写入执行文件头。再擦除更新文件头,最后跳转到执行区开始执行更新后的app固件程序。如果执行区数据校验和更新文件头校验值不匹配,则代表写入执行区的过程中出现错误,则擦除执行文件头内容,然后退出,待下次上电时,又会再次进行上述全部操作。
22.如果查询flash更新文件头的更新标志值不是更新标志,则代表app程序没有进行过固件升级操作。随后判断通告参数区中的uboot执行标志是否设置,如果设置,则等待固件升级操作。该标志主要告知uboot,需要在uboot中执行固件升级操作。此处设计主要用于flash存储资源有限,不能划分多个分区的单片机类型产品,使接收升级固件的动作在uboot中执行,直接写入到执行区中。
23.如果通告参数区中的uboot执行升级标志没有设置,则判断执行文件头中的更新标志是否为烧写标志,如果是,则跳转到执行区执行app程序。否则,代表执行区数据内容错误,或者当前产品没有烧写app程序,则等待固件升级操作。
24.如图3所示,app程序执行的流程如下所示:位于执行区的app程序运行后,等待升级指令。当升级时,首先接收更新文件头。随后,将接收到的文件头中的设备名称、型号代码、硬件版本号等数据和执行区文件头进行匹配。如果均匹配成功,则代表当前更新固件文件是由当前运行的程序的原生工程编译生成的固件,因此支持升级。否则,返回错误信息,终止升级操作。
25.如果文件头信息匹配,则继续接收升级固件的其他部分,并将其写入更新区。接收完成后,校验更新区的数据和之前接收的更新文件头中的校验值是否匹配。如果匹配,则说明写入更新区的操作没有错误,则将更新文件头中的更新标志值设置为更新标志,随后将更改后的文件头写入到flash更新文件头处。最后,校验flash更新文件头的校验值是否和写入的文件头匹配,如果匹配,则说明写入没有错误,然后复位单片机进入uboot,更新操作完成。
26.应用程序编译后烧写到产品时,运行固件分布于存储空间的两个部分。第一部分
为执行文件头部分,用于标识当前执行区内运行程序的属性以及对应产品硬件属性等信息。另一部分为执行区部分,是app程序最主要的部分。同时,编译程序后,生成的更新固件文件同样会分为这两部分,其中文件头部分和当前产品此刻运行的程序的执行文件头完全一致。
27.本发明的核心点主要在于,如何让程序代码中的变量定义及运行过程中的变量使用固定到具体的内存地址处,以及如何让程序代码中的一些特征信息固定反应到编译链接后生成的固件的指定位置处,使生成的固件文件和工程代码对应。要完成以上功能主要需要用到单片机对应编译工具链的内存重定向及固件分散加载运行的特性。下面以stm32的cortex m3、m4系列内核单片机展示,单片机使用stm32f103ve芯片,该芯片具有64kb片上内存空间,512kb片上flash存储空间。开发环境使用keil集成开发环境,对应的编译工具为armcc,链接工具为armlink。
28.首先,在uboot代码中,定义系统参数结构体变量,并按照图4中flash存储空间的划分初始化成员变量值,定义时使用__attribute()设置链接属性,使用“used”属性关键字,避免编译器优化删除该变量,且通过section(".sysparam")指定链接符号为“.sysparam”。
29.然后,创建uboot程序的分散加载脚本文件(.sct文件,供keil开发工具使用),指定编译链接后生成的固件的内存使用情况及flash存储空间使用情况。其中,将“.sysparam”符号部分定向到系统参数内存地址20000000h处,将“stack”符号部分定向到单片机最大内存地址20010000h处,将程序中的其他变量部分“.any (+rw +zi)”定向到内存地址20000100h处,将程序执行部分“.any(+ro)”定向到flash地址08000000h处。
30.然后,在app代码中,定义通告参数结构体变量及文件头结构体变量,同样使用“used”属性关键字,避免编译器优化删除。通告参数变量链接符号指定为“.notify”,文件头变量链接符号指定为“.file_head”,并且文件头变量定义时按照产品硬件信息初始化各成员变量值,包括设备名称、型号代码、硬件版本号等。
31.最后,创建app程序的分散加载脚本文件(.sct文件,供keil开发工具使用),指定编译链接后生成的固件的内存使用情况及flash存储空间使用情况。其中,将“.notify”符号部分定向到通告参数内存地址20000080h处,将“stack”符号部分定向到单片机最大内存地址20010000h处,将程序中的其他变量部分“.any (+rw +zi)”定向到内存地址20000100h处,将“.file_head”符号部分定向到flash执行文件头地址08004000h处,将程序其他运行部分“.any (+ro)”定向到flash执行区地址08004800h处。生成固件文件分为两个部分,一部分为文件头,对应文件名为file_head,数据内容为上面文件头结构体变量初始化的数据。另一部分为软件程序的其他部分,对应文件名为app_rom。
32.如图4所示,uboot程序编译烧写后,运行于flash存储空间的08000000h ~ 08004000h地址处,运行内存位于内存空间20000100h ~ 20010000h地址处,uboot设置20000000h内存地址处的系统参数供app程序使用,同时接收20000080h地址处的app程序设置的通告参数,执行相应功能的处理。
33.app程序烧写后,运行于flash存储空间的08004000h ~ 08004800h(执行文件头)和08004800h ~ 0802c800h(执行区)两个地址处,运行内存位于内存空间20000100h ~ 20010000h地址处,app通过设置内存20000080h地址处的通告参数,告知uboot应该执行哪
些操作。app程序编译生成的固件有两个文件,分别为file_head和app_rom,file_head文件则对应flash空间的“执行文件头”部分,app_rom文件则对应flash空间的“执行区”部分。单片机升级时,首先下发file_head文件,app程序判断接收的file_head文件是否和当前运行程序的执行文件头中的设备名称、型号代码、硬件版本号等信息是否匹配。如果匹配,则说明下发的file_head文件为当前运行程序的原生工程编译得到的,则支持升级。否则,拒绝并终止升级操作。实际操作时,为了文件管理的方便,可将file_head和app_rom合成为一个文件。也可利用更新文件头的内容去扩展和完善升级功能,例如可通过文件头中的文件类型参数来指定升级文件的种类,从而支持其他数据更新。也可通过对比app_rom文件,实现设计补丁升级的功能等等。
34.以上所述仅是本发明的优选实施方式,应当理解本发明并非局限于本文所披露的形式,不应看作是对其他实施例的排除,而可用于各种其他组合、修改和环境,并能够在本文所述构想范围内,通过上述教导或相关领域的技术或知识进行改动。而本领域人员所进行的改动和变化不脱离本发明的精神和范围,则都应在本发明所附权利要求的保护范围内。

技术特征:
1.一种编译阶段确保固件与工程匹配的单片机升级方法,其特征在于:所述升级方法包括:自定义片上资源划分步骤:将单片机上内存依次划分为系统参数区、通告参数区和共用区,将单片机上flash存储依次划分为uboot、执行文件头、执行区、更新文件头、更新区、备份文件头和备份区;uboot执行步骤:查询flash更新文件头处的更新标志值是否为更新标志,如果为更新标志,则擦除执行区数据后按照更新文件头中的文件长度拷贝更新区固件到执行区,计算执行区数据校验,并判断与更新文件头中的校验值是否匹配,根据判断结果进行相应操作;app执行步骤:接收更新文件头,并将接收到的文件头中的设备信息与执行区文件头进行匹配,如果匹配成功,则接收升级固件剩余部分并写入更新区,检验更新区的数据与之前接收的更新文件头中的校验值是否匹配,并根据检验结果进行相应操作。2.根据权利要求1所述的一种编译阶段确保固件与工程匹配的单片机升级方法,其特征在于:所述判断与更新文件头中的校验值是否匹配,根据判断结果进行相应操作具体包括以下内容:如果执行区数据校验与更新文件头中的校验值匹配,则将更新文件头中的更新标志更改为烧写标志,然后将更新文件头内容写入执行文件头,再擦除更新文件头,跳转到执行区开始执行更新后的app固件程序;如果执行区数据校验与更新文件头中的校验值不匹配,说明写入执行区的过程中出现错误,则擦除执行文件头内容后退出,等待下一次操作。3.根据权利要求1所述的一种编译阶段确保固件与工程匹配的单片机升级方法,其特征在于:所述uboot执行步骤中,如果查询flash更新文件头的更新标志不是更新标志,说明app程序没有进行过固件升级操作,则判断通告参数区中的uboot执行标志是否设置,如果设置,则等待固件升级操作;如果通告参数区中的uboot执行升级标志没有设置,则判断执行文件头中的更新标志是否为烧写标志,如果是,则跳转到执行区执行app程序,否则,说明执行区数据内容错误或者没有烧写app程序,则等待固件升级操作。4.根据权利要求1所述的一种编译阶段确保固件与工程匹配的单片机升级方法,其特征在于:所述app执行步骤中根据检验结果进行相应操作具体包括:如果更新区的数据与之前接收的更新文件头中的校验值匹配,说明写入更新区的操作没有错误,则将更新文件头中的更新标志设置为更新标志,并将更改后的文件头写入到flash更新文件头处,最后检验flash更新文件头的校验值是否与写入的文件头匹配,如果匹配,则说明写入没有错误,然后复位单片机进入uboot,完成更新操作;如果更新区的数据与之前接收的更新文件头中的校验值不匹配,则终止升级,返回错误。5.根据权利要求1所述的一种编译阶段确保固件与工程匹配的单片机升级方法,其特征在于:所述自定义片上资源划分步骤中,系统参数区由uboot程序设置,用于记录flash存储空间的划分情况以供app程序使用;uboot程序运行于uboot,app程序运行于执行区;通告参数区用于app程序传递给uboot程序的参数存储,在app程序设置后复位进入uboot,uboot程序直接获取使用;
公用区包括全局数据区和栈区,用于uboot程序和app程序各自独自运行的环境支持,并将程序运行的栈指针调整到单片机上内存的最大地址处。6.根据权利要求5所述的一种编译阶段确保固件与工程匹配的单片机升级方法,其特征在于:所述app程序包括执行文件头地址、执行区地址、执行区大小、更新文件头地址、更新区地址、更新区大小、备份文件头地址、备份区地址和备份区大小。7.根据权利要求3所述的一种编译阶段确保固件与工程匹配的单片机升级方法,其特征在于:所述app程序编译后烧写到产品时,运行固件分布于存储空间的执行文件头部分和执行区部分;执行文件头部分用于标识当前执行区内运行程序的属性以及对应产品硬件属性信息;执行区部分用于运行app程序;同时,编译程序后生成的更新固件文件同样分为执行文件头部分和执行区部分,其中执行文件头部分和当前产品此刻运行的程序的执行文件头完全一致。

技术总结
本发明涉及一种编译阶段确保固件与工程匹配的单片机升级方法,包括:自定义片上资源划分步骤;查询Flash更新文件头处的更新标志值是否为更新标志,如果是,按照更新文件头中的文件长度拷贝更新区固件到执行区,计算执行区数据校验,并判断与更新文件头中的校验值是否匹配后进行相应操作;接收更新文件头,并将接收到的文件头中的设备信息与执行区文件头进行匹配,如果匹配成功,则接收升级固件剩余部分并写入更新区,检验更新区的数据与之前接收的更新文件头中的校验值是否匹配后进行相应操作。本发明完全自主控制单片机片上内存的使用,明确分区使用内存空间,程序在编译链接及运行时完全受控,且精确到每一个变量的存储地址的清晰掌握。地址的清晰掌握。地址的清晰掌握。


技术研发人员:张谦
受保护的技术使用者:成都泰格微电子研究所有限责任公司
技术研发日:2023.07.19
技术公布日:2023/8/16
版权声明

本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

飞行汽车 https://www.autovtol.com/

分享:

扫一扫在手机阅读、分享本文

相关推荐