基于模块的单片机程序升级方法技术

技术编号:37634148 阅读:10 留言:0更新日期:2023-05-20 08:54
本发明专利技术公开了一种基于模块的单片机程序升级方法,涉及单片机软件开发领域。步骤为:步骤1、将程序按功能划分成多个模块;步骤2、各模块的构成均包括模块内部代码和模块外部代码;模块内部代码包括功能函数和查找函数;模块外部代码用于通过调用查找函数的方式来调用功能函数;步骤3、为模块划分内存;步骤4、编译各模块:对于各个模块,分别将模块的内部代码和该模块需要调用的其它模块的模块外部代码编译在一起成为模块程序;步骤5、将编译后的模块程序写入该模块对应的内存空间;步骤6、升级时,只重新编译需要升级的模块。本发明专利技术可以在不影响代码的可执行性、可读性和可编译性的情况下,减小程序升级的数据量,缩短升级需要的时间。时间。

【技术实现步骤摘要】
基于模块的单片机程序升级方法


[0001]本专利技术涉及单片机软件开发领域,具体涉及一种单片机程序升级方法。

技术介绍

[0002]单片机裸机程序开发简单,不含有操作系统。开发完成后,由编译器生成bin文件或者hex文件,通过下载器将其下载到指定地址,MCU即可顺利执行程序。
[0003]由于升级需要,现有技术引入了裸机BOOT程序。因此常见的裸机程序是由一个BOOT程序和一个可升级的APP程序组成。但该升级策略仅适用于全量升级,即APP程序整体升级,或者是新的APP程序的bin文件相较老程序bin文件变化很小的增量升级,即bin文件的哪一部分存在编号,则只升级哪一部分代码。
[0004]APP程序整体升级,数据传输量相对较大,速度慢。假设有512K的代码,采用9600bps的速度下发数据,传输时间在8分钟左右。即使下发数据为115200bps,传输时间也需要50秒左右。
[0005]增量升级尽管可以实现小数据量传输,但是限制了程序的正常编写逻辑。为了尽可能减少新旧代码的差异,需要借助编译器去指定代码位置。比如:原fun()函数存在0x01地址,由于新增或者删减代码,导致fun()函数变到0x02地址,所有调用fun()函数的函数肯定发生了改变,只能通过强制指定地址的方式,将fun()代码指定到0x01地址。如果采用这种逻辑不断的去打补丁,代码的可执行性、可读性、可编译性都受到限制。

技术实现思路

[0006]本专利技术提出了一种基于模块的单片机程序升级方法,其目的是:在不影响代码的可执行性、可读性和可编译性的情况下,减小程序升级的数据量,缩短升级需要的时间。
[0007]本专利技术技术方案如下:一种基于模块的单片机程序升级方法,步骤为:步骤1、将程序按功能划分成多个模块;模块之间存在调用关系,即:至少存在第一模块和第二模块,第二模块运行时将调用第一模块中的功能函数;步骤2、各模块的构成均包括模块内部代码和模块外部代码;所述模块内部代码包括所述功能函数,还包括用于查找功能函数的查找函数;所述模块外部代码用于通过调用所述查找函数的方式来调用功能函数;步骤3、划分内存,每个模块对应一块固定的内存空间;步骤4、编译各模块:对于各个模块,分别将模块的内部代码和该模块需要调用的其它模块的模块外部代码编译在一起成为模块程序;当某模块需要调用另一模块时,在该模块内通过另一模块的模块外部代码来实现对另一模块的函数调用;步骤5、将编译后的模块程序写入该模块对应的内存空间中;步骤6、升级时,只重新编译需要升级的模块,然后将编译后的模块程序写入对应
的内存空间中。
[0008]作为所述基于模块的单片机程序升级方法的进一步改进:各模块的构成还包括查找入口,用于指向模块的查找函数。
[0009]作为所述基于模块的单片机程序升级方法的进一步改进:所述查找入口存放在模块对应的内存空间的第一位置,编译后的模块程序存放在模块对应的内存空间的第二位置;所述第一位置和第二位置在内存空间中的位置是固定的。
[0010]作为所述基于模块的单片机程序升级方法的进一步改进:步骤4中,对模块进行编译时,获取模块内部代码中查询函数在编译后的模块程序中的位置,再根据该模块对应的第二位置,得到模块更新后查询函数在内存中的地址,将该地址作为查找入口,并在编译后将查找入口写到内存空间中的第一位置中。
[0011]作为所述基于模块的单片机程序升级方法的进一步改进:步骤4中,编译时,获取内部代码中各个功能函数在编译后的模块程序中的位置,再根据该模块对应的第二位置,得到模块更新后各功能函数在内存中的地址,从而得到功能函数的名称与地址之间的对应关系;所述查找函数中根据需要调用的功能函数的名称,通过上述对应关系得到功能函数的实际地址,从而实现对功能函数的调用。
[0012]作为所述基于模块的单片机程序升级方法的进一步改进:单片机程序还包括BOOT程序,在单片机程序启动时,BOOT程序从各模块对应的第一位置中获取到各查找入口,从而得到所有模块的查找入口。
[0013]作为所述基于模块的单片机程序升级方法的进一步改进:各模块的模块内部代码中还包括加载函数;单片机程序启动时,BOOT程序将调用所有模块的加载函数,并将所有模块的查找入口传递给各加载函数;各模块的加载函数分别获取本模块需要调用的其它模块的查找入口,并将查找入口发送给对应的、已与本模块共同编译的模块外部代码,以使模块外部代码通过查找入口来调用对应的查找函数,继而完成对功能函数的调用。
[0014]作为所述基于模块的单片机程序升级方法的进一步改进:模块内部代码还包括本模块的初始化函数和事件循环函数;初始化函数的地址、加载函数的地址以及事件循环函数的地址,分别存放在模块对应的内存空间的第三位置、第四位置和第五位置;单片机程序启动时,BOOT程序先通过各模块的第三位置调用各模块的初始化函数,然后通过各模块的第四位置调用各模块的加载函数,再通过各模块的第五位置调用各模块的事件循环函数。
[0015]相对于现有技术,本专利技术具有以下有益效果:一、本专利技术将程序划分成多个模块,每个模块分别存放在预先规划好的内存空间内,并且将涉及外部调用的代码按是否与编译相关分成了两部分:模块内部代码中的查找函数和模块外部代码,前者与本模块一同编译,后者则与其它模块编译,从而实现了模块之间的解耦,升级时可以只针对某一模块单独升级,大大减小了数据传输量,缩短了升级时间。
[0016]二、模块间的函数调用更加灵活,方便编程,也无需过多的干预编译过程。
[0017](1)当需要删除或替换某模块已暴露的功能函数,可以查找函数,而无需对其它模块进行修改和升级。
[0018](2)传统的模块间函数调用是将某模块的功能函数列表的入口地址提供给其它模块,调用时,需要基于该入口地址进行地址运算,得到函数的地址。而当本模块删除某个函数时,为避免其它函数的地址发生变化,必须在原函数位置放置一个空函数,确保其它函数仍然可以被正常查找。该过程工作量过大,难以接受。
[0019]三、本专利技术通过向其它模块提供查找策略(模块外部代码)来实现其它模块对自己的调用,同时通过维护查找函数来确保内部函数的可调用,提高了程序运行的稳定性。
[0020](1)传统的模块间函数调用是将函数列表放到RAM中,裸机程序由于没有PMU保护,有内存溢出的风险,导致函数列表数据被意外冲掉,程序运行出错。如果对整个RAM做校验,则会影响调用效率。本专利技术是基于地址(函数指针)进行调用,一方面可以避免函数被意外冲掉,另一方面也方便增加验证机制来保证调用的正确性和安全性。
[0021](2)如前所述,使用传统的模块间函数调用方式,当模块函数发生变化,将导致函数列表发生不确定的变化。而本专利技术则是在编译时维护查找函数所使用的“函数名称——地址”对应关系,消除这种不确定性和未知的隐患,同时该维护过程与其它模块无直接关联,不需要对代码进行大量的修改与编译。
[0022]四、本专利技术可以提供更好的扩展性,方本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于模块的单片机程序升级方法,其特征在于步骤为:步骤1、将程序按功能划分成多个模块;模块之间存在调用关系,即:至少存在第一模块和第二模块,第二模块运行时将调用第一模块中的功能函数;步骤2、各模块的构成均包括模块内部代码和模块外部代码;所述模块内部代码包括所述功能函数,还包括用于查找功能函数的查找函数;所述模块外部代码用于通过调用所述查找函数的方式来调用功能函数;步骤3、划分内存,每个模块对应一块固定的内存空间;步骤4、编译各模块:对于各个模块,分别将模块的内部代码和该模块需要调用的其它模块的模块外部代码编译在一起成为模块程序;当某模块需要调用另一模块时,在该模块内通过另一模块的模块外部代码来实现对另一模块的函数调用;步骤5、将编译后的模块程序写入该模块对应的内存空间中;步骤6、升级时,只重新编译需要升级的模块,然后将编译后的模块程序写入对应的内存空间中。2.如权利要求1所述的基于模块的单片机程序升级方法,其特征在于:各模块的构成还包括查找入口,用于指向模块的查找函数。3.如权利要求2所述的基于模块的单片机程序升级方法,其特征在于:所述查找入口存放在模块对应的内存空间的第一位置,编译后的模块程序存放在模块对应的内存空间的第二位置;所述第一位置和第二位置在内存空间中的位置是固定的。4.如权利要求3所述的基于模块的单片机程序升级方法,其特征在于:步骤4中,对模块进行编译时,获取模块内部代码中查询函数在编译后的模块程序中的位置,再根据该模块对应的第二位置,得到模块更新后查询函数在内存中的地址,将该地址作为查找入口,并在编译后将查找入口写到内存空间中的第一位置...

【专利技术属性】
技术研发人员:刘占峰胡春华伍韬尹西科姜文浩寇晓晖马金臣
申请(专利权)人:烟台东方威思顿电气有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1