一种mcu固件完整性识别方法与流程

文档序号:37343285发布日期:2024-03-18 18:15阅读:21来源:国知局
一种mcu固件完整性识别方法与流程

本发明涉及嵌入式系统,具体为一种mcu固件完整性识别方法。


背景技术:

1、嵌入式系统是一种特殊类型的计算机系统,通常用于嵌入到设备中,如家电、汽车、医疗设备等。这些系统通常包括mcu或mpu,其功能在设备内部运行。嵌入式系统需要可靠性高、安全性强的固件管理方法,以确保设备的稳定性和性能。在嵌入式系统中,随着时间的推移,需要对固件进行更新,以添加新功能、改进性能或修复漏洞。因此,开发者需要一种可靠的方法来安全地进行固件更新。引导加载程序固件是用于引导和管理固件更新的特殊程序,它通常位于mcu内部,负责在启动时检查和升级应用程序固件。

2、在传统方法中,标识数据通常存储在特定的flash地址,这会导致引导加载程序固件和应用程序固件之间强耦合。如果应用程序固件的大小或存储位置发生变化,需要更新引导加载程序固件,这会增加维护和开发的难度。传统方法中,专门的存储地址用于存储标识数据,这不仅会浪费flash存储资源,还可能限制了固件的灵活性和可扩展性,尤其是在flash资源有限的嵌入式系统中。将标识数据存储在特定地址可能会使其容易受到恶意攻击,攻击者可以尝试篡改标识数据,绕过固件验证,从而引发潜在的安全问题。


技术实现思路

1、本发明的目的在于提供一种mcu固件完整性识别方法,以解决上述背景技术中提出的问题。

2、为了解决上述技术问题,本发明提供如下技术方案:

3、在应用编程iap中,用户自己的程序在运行过程中对user flash的部分区域进行烧写,在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。

4、iap方法一般是:用户编写引导加载程序固件,使用专用的烧写器,如jlink,通过mcu的swd或者jtag接口烧写到单片机。在产品的维护升级中,就可以通过预先确定的产品接口,比如rs232、can等,依赖mcu中已经存在的引导加载程序固件,将应用程序固件存储到单片机flash中,进行应用程序固件的升级。单片机运行时也是先运行引导加载程序固件,然后再跳转到应用程序固件。这种iap方式,可以方便的更新产品应用程序固件相关的功能。

5、一种mcu在引导加载程序固件下载应用程序固件完成时,或者引导加载程序固件在跳转到应用程序固件时,需要根据约定的标识数据,长度一般占用几个字节,确认应用程序固件是否已经存在,或者是否完整无误,然后确定是否要跳转到应用程序固件。

6、目前,现有的大多数方式是:在判断应用程序固件完整或者不完整之后,会将标识数据存放在指定的flash地址中,所述标识数据一般是应用程序固件所在sector的最后几个字节;或者将标识数据存放在flash其他的sector中,所述flash其他的sector是引导加载程序固件和应用程序固件之外的sector中。

7、这种通常使用专门的标识数据来确认应用程序固件是否完整,标识数据专门存储在一个地址的处理方法,是存在缺陷的,也不太不合理的。

8、以下对现有技术方案进行阐述,并说明其缺点:

9、a.将该标识数据存储在应用程序固件所在sector的最后几个字节,例如,应用程序固件占用sector_b到sector_c这几个flash的sector,sector_c是应用程序固件占用的最后一个sector,标识数据可以存放在sector_c的最后一个或者几个字节中。随着应用程序固件功能扩展,固件变大,占用sector会增加,那么该标识数据地址会变化,该地址的更改会造成引导加载程序固件也要升级,这种方式使得引导加载程序固件和应用程序固件较强耦合。

10、b.将该标识数据存储在flash其他的sector中,例如,sector_0到sector_a是引导加载程序固件空间,sector_b到sector_c是应用程序固件空间,需要将标识数据存储在这两个空间以外的flash地址中,该标识数据会独占一个flash的sector。这种方法,可以避免a方法中所述的不合理情况,但是单片机本身flash资源较少,专门使用sector存放数据,会增加flash资源开销,也不太合理。

11、c.单片机中或许会有flash的sector,用来专门存放用户的数据,如果将标识数据也放在flash的这个sector中,再需要变更用户数据的时候,这个标识数据会被一起擦除然后重写,导致这种情况的原因是flash要先擦除然后才能写。这种处理方法是多种数据之间因为共用同一个flash的sector,关联和耦合较强,也不太合理。

12、之所以会产生以上3种不合理性,是因为应用程序固件完整性识别数据占用了固定且专门的flash地址来存储。本发明提供了一种新的方法,应用程序固件完整性的标识数据,不占用专门的存储空间,可以解决上述的几种不合理情况。

13、因为本方法中,应用程序固件完整性的标识数据不占用专门的flash存储地址,所以应用程序固件变大占用更多sector时,不会产生a方法中所述的引导加载程序固件和应用程序固件之间强耦合,不会产生b方法中所述的占用更多资源,不会产生c方法中所述的和用户存储数据强耦合的问题。

14、优选的,一种mcu固件完整性识别方法,步骤如下:

15、s100、产品上电;

16、s200、引导加载程序固件运行;

17、s300、判断是否需要升级应用程序固件,若需要则执行步骤s301-s306,若不需要则执行s400;

18、s301、flash中擦除应用程序固件要用到的sector;

19、s302、引导加载程序固件从上位机,接收应用程序固件数据第1包,并校验;

20、s303、引导加载程序固件将应用程序固件数据中的栈顶地址改为0xffff ffff;

21、s304、逐包接收余下的应用程序固件,并逐包保存到应用程序固件的flash地址,并校验;

22、s305、将修改后的第一包数据写入应用程序固件的flash地址;

23、s306、应用程序固件全部保存完成,将栈顶地址从0xffff ffff改为正确的栈顶地址;执行步骤s400;

24、s400、栈顶地址范围是否为0x2000 0000-0x3fff ffff;若不是则执行步骤s401,若是则执行步骤s500;

25、s401、重新升级应用程序固件,执行步骤s301-s306;

26、s500、运行应用程序固件。

27、优选的,根据步骤s100,产品上电的第一步是将电源与嵌入式系统或mcu连接。这通过插入电池、连接外部电源适配器,或使用其他电源供应方式,具体取决于产品的设计和应用场景。当电源连接完成后,用户或系统需要打开电源开关或触发电源上电操作。这通过手动操作开关、按下按钮、或通过远程信号触发,具体取决于产品的设计。当电源供应开始供电后,mcu或嵌入式系统中的电源管理电路会检测到上电事件。一旦检测到上电事件,mcu或嵌入式系统开始执行初始化和复位程序。这包括将内部寄存器状态清零,初始化各种外设和接口,以确保系统进入可控状态。

28、优选的,根据步骤s200,引导加载程序固件通常是嵌入式系统的一部分,位于mcu的固件中。当嵌入式设备上电或复位时,mcu会按照特定的启动顺序来决定首先运行引导加载程序固件还是应用程序固件。这个启动顺序可以在mcu的引导引脚、引导寄存器或启动选项中配置。引导加载程序固件在启动时首先执行初始化操作。这包括设置寄存器、初始化外设、准备ram或其他内存用于存储数据,以及初始化其他必要的硬件资源。

29、引导加载程序固件通常依赖于一种通信接口来与外部通信,以接收应用程序固件的更新请求和数据。这可以是串口、can总线、以太网,或其他适合设备的通信方式。

30、优选的,根据步骤s300,引导加载程序固件会检查通信接口或其他方式,以确定是否有新的应用程序固件需要升级。这可以包括检查外部信号、接收命令,或者根据预定条件来决定是否需要进行固件更新。

31、优选的,根据步骤s301,flash中擦除应用程序固件要用到的sector的方法如下:

32、调用单片机的库函数进行擦除;当单片机没有擦除sector的库函数时,根据单片机的说明手册编写函数,将应用程序固件要写入的flash的secotor全部擦除,擦除后,相应sector的数据都是0xff;

33、在stm32f7系类单片机中,使用的库函数根据应用程序固件占用的空间擦除指定sector数量flash的sector;在库函数中,通过设置变量sector_num的值,用于指定擦除的sector数量。

34、优选的,根据步骤s302,当接收应用程序固件数据的第1包时,包中的最先4个字节是栈顶地址,引导加载程序固件需要把栈顶地址先进行记录,方法如下:

35、在升级应用程序固件时,应用程序固件由上位机一包一包下发给mcu,其中一包128字节,引导加载程序固件把上位机下发的应用程序固件按包存入ramsource指针,所述ramsource指针指向的一块ram空间,每存够1024字节,就会写入flash中;第一包数据的前四个字节为栈顶地址,收到后将存入全局变量user_stack_addr_rec中。

36、优选的,根据步骤s303,将应用程序固件数据中的栈顶地址改为0xffff ffff的方法为:

37、ramsource指针指向的一块ram,当收到第一包数据时存放到该ram空间,所述第一包数据的首地址前四个字节是栈顶地址,直接替换为0xffff ffff,然后写入flash;将ramsource指向的一块ram空间,每接收1024字节,便会写入flash中,直到应用程序固件全部写入flash为止。

38、优选的,根据步骤s305,将数据写入应用程序固件的flash地址的方法如下:

39、除了每接收1024个字节或者一定字节数进行crc校验之外,还需要传完足够的字节数,当应用程序固件是w个字节,那么也需要存入flash中w个字节才算完全接收,其中w是正整数;

40、在升级应用程序固件时,上位机将应用程序固件的信息下发给mcu,下发时需要在头包中发送;应用程序固件的信息中包含应用程序固件字节数量的信息,mcu只有接收相应的字节数,并且也存入flash中相应的字节数,crc校验也完整,满足后判断应用程序固件是完整的。

41、存在应用程序固件没有完全被写入flash的可能性极低,因为每一包数据写入flash之后还需要再读取出来进行校验,以防未写入或者写错;

42、如果出现未被写入的情况需要重新进行写入操作,所述未被写入的情况指数据写成了全为1;如果写入错误数据,需要重新升级应用程序固件。

43、优选的,根据步骤s306,将栈顶地址从0xffff ffff改为正确的栈顶地址的方法如下:

44、判断接收了应用程序固件的所有字节已经全部写入了flash,若全部写入,则调用库函数,将记录栈顶地址的数据user_stack_addr_re,写入flash中,写入的地址是应用程序固件的首地址app_flash_addr。

45、优选的,根据步骤s400,引导加载程序固件首先会读取当前的栈顶地址,该地址存储在指定的寄存器或内存位置中;栈顶地址指示了堆栈的顶部,所述堆栈的顶部是ram中用于存储函数调用和本地变量的内存区域;

46、接着,引导加载程序固件将读取的栈顶地址与特定的地址范围进行比较,地址范围是0x2000 0000到0x3fff ffff,引导加载程序固件会判断读取的栈顶地址是否在指定的地址范围内;如果栈顶地址在这个范围内,说明栈顶地址处于flash存储器的地址范围内,表示应用程序固件已经正确加载到flash中,且栈顶地址被设置为正确的值;如果栈顶地址不在指定的范围内,引导加载程序固件将执行s401,表明栈顶地址未正确设置,或者应用程序固件加载到了不正确的位置。

47、与现有技术相比,本发明所达到的有益效果是:

48、本发明的方法不需要专门的flash存储空间来存储应用程序固件完整性标识数据。这减少了flash资源的开销,使更多的存储空间可供应用程序固件使用,特别是对于资源受限的单片机而言,这是一项显著的节省。

49、本发明消除了引导加载程序固件与应用程序固件之间的强耦合。现有技术中,存储标识数据的地址的变更可能需要同时升级引导加载程序固件,而本发明避免了这种需求,提高了系统的模块化程度。

50、本发明的方法不受应用程序固件大小的影响,无需不断更改存储标识数据的地址。这提供了更大的灵活性,简化了固件的维护和升级流程。

51、通过减少flash存储的擦除和重写,本发明降低了数据之间的关联和风险,提高了数据的稳定性和可靠性。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1