CN110262817B - 一种基于以太网的单片机程序批量升级方法及系统 - Google Patents
一种基于以太网的单片机程序批量升级方法及系统 Download PDFInfo
- Publication number
- CN110262817B CN110262817B CN201910412278.2A CN201910412278A CN110262817B CN 110262817 B CN110262817 B CN 110262817B CN 201910412278 A CN201910412278 A CN 201910412278A CN 110262817 B CN110262817 B CN 110262817B
- Authority
- CN
- China
- Prior art keywords
- subprogram
- code
- upgrading
- iap
- mcu
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/61—Installation
- G06F8/63—Image based installation; Cloning; Build to order
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/65—Updates
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Stored Programmes (AREA)
- Information Transfer Between Computers (AREA)
Abstract
本发明提供一种基于以太网的单片机程序批量升级方法,包括将IAP子程序的可执行代码复制到应用子程序源代码的全局常量数组中,对包含IAP子程序可执行代码的应用子程序源代码进行编译和链接生成下位机程序的烧录文件;将应用子程序的可执行代码放置到FLASH的程序代码区,将IAP子程序的可执行代码放置到常量数据区;上位机程序通过IAP方式向MCU发送升级命令;MCU接收上位机程序发送的升级命令后,将存放在全局常量数组中的IAP子程序的可执行代码复制到全局变量数组中,且令MCU跳转至运行IAP子程序,以对应用子程序进行覆盖升级。本发明还提供一种方法所对应的系统。本发明优点:可大大提升生产效率,并降低出错率。
Description
技术领域
本发明涉及计算机通信领域,特别涉及一种基于以太网的单片机程序批量升级方法及系统。
背景技术
目前,对已焊接到PCB(Printed CircuitBoard,印制电路板)上的单片机,或称MCU(Microcontroller Unit,微控制单元)进行后续的用户程序升级主要有两种方式,分别是ISP和IAP。
ISP(In System Programming,在系统编程)方式通常由厂家提供。以STM32系列的MCU为例,MCU内部存储器的系统存储区固化了用于ISP升级的Bootloader(启动装载)程序,将芯片硬件的BOOT0管脚拉高(置“1”),BOOT1管脚拉低(置“0”),MCU上电复位后便进入Bootloader模式,能够通过指定的串行接口与上位机软件进行通信,接收上位机传来的用户程序代码,然后将其写入用户存储区覆盖原来的程序代码,实现对用户程序的更新,完成写入操作后需将BOOT0管脚重新拉低,再上电复位方可运行升级后的用户程序。但是,该ISP方式有以下不足之处:一、需要搭建外围电路用以将芯片BOOT0管脚和BOOT1管脚引出到产品外部,还需将电平控制便捷化,如设置拨码开关;二、需要搭建外围电路将指定的串行接口开放出来;三、升级速度过慢,其受限于串行通信的波特率(通常是115200bps);四、操作过程需要人工多次介入,包括设置管脚电平、插拔串口线、上电复位等,无法做到自动化。
IAP(InApplication Programming,在应用编程)方式需要用户开发者自己实现,主要思路是:编写两份独立的项目代码,将二者编译后下载到MCU内部存储器用户存储区的不同位置(即FLASH的不同地址),第一部分作为IAP程序,它开启某个通信接口(可由用户指定),以此接收上位机发送来的升级代码,并写入到第二份代码所在位置,执行对第二部分程序的升级任务;第二部分是应用程序,它执行的是用户真正需要的具体控制功能,未来需要借助IAP程序进行升级。更具体地:将IAP程序下载到用户存储区的起始位置,这样MCU上电后运行的便是IAP程序,然后在一定的时限内检查是否需要执行升级操作(判断依据可以是某个硬件开关的按下或是接收到上位机的升级指令等),若需要升级,则等待接收升级代码,当完成所有代码的接收和写入操作后再跳转到应用程序所在位置,运行升级后的应用代码;若不需要,则立即跳转位置运行应用代码。IAP方式有效的解决了ISP方式的各种缺点,包括:它不需要搭建额外的外围电路,只需借助一个由用户指定的通讯接口,如果和应用程序共用该接口,那么在硬件上完全不存在额外花销;它的升级速度可以更快,例如使用以太网作为接收代码的通讯接口,速度可达100Mbps;它可以实现过程全自动,采用上位机发送升级命令和升级代码,升级完成后自动跳转运行新代码,一切都由软件控制,无需人工干涉。
以上便是传统IAP方式的实现过程,相较于ISP方式有了诸多便利,但IAP方式还是存在以下几点不足:一、MCU首次下载程序时需要分别下载IAP程序和应用程序(它们是各自独立的项目代码),这增加了生产工人的工作量和出错率;二、由于MCU上电后运行的是IAP程序,若应用程序部分出现问题需要调试时,想对应用程序代码设置运行断点进行调试将变得十分不便或者难以实现;三、由于MCU上电后运行的是IAP程序,且需要一定的时限判断是否需要执行升级,在绝大多数不需要升级的场合,等于平白增加了应用程序的启动时间,无法实现立即运行期望的功能;四、IAP方式还未被推广到批量化升级,其优点还未被彻底挖掘。
发明内容
本发明要解决的技术问题之一,在于提供一种基于以太网的单片机程序批量升级方法,通过该升级方法来对单片机的应用程序进行批量升级,可大大提升生产效率,且无需区分单独的应用子程序烧录文件和IAP子程序烧录文件,可降低出错率。
本发明是这样实现技术问题之一的:一种基于以太网的单片机程序批量升级方法,所述方法包括如下步骤:
步骤S1、在下位机程序的开发阶段,将IAP子程序的可执行代码以文本的形式复制到应用子程序源代码的一个全局常量数组中,并对包含了IAP子程序可执行代码的应用子程序源代码进行编译和链接生成一个下位机程序的烧录文件;
步骤S2、MCU在下载烧录文件时,将应用子程序的可执行代码作为程序代码放置到MCU内部FLASH的程序代码区中;同时,将IAP子程序的可执行代码作为只读数据放置到与程序代码区相邻的常量数据区中;
步骤S3、上位机程序通过IAP方式向MCU发送升级命令;
步骤S4、在MCU接收到上位机程序发送的升级命令后,应用子程序将存放在全局常量数组中的IAP子程序的可执行代码复制到一个全局变量数组中,且令MCU跳转至运行IAP子程序,以接收升级代码并实现对应用子程序进行覆盖升级。
进一步地,所述步骤S3具体包括:
步骤S31、上位机程序通过以太网向广播地址发送一条广播命令,局域网内所有连接正常且正在运行应用子程序的MCU均接收该广播命令,并对该广播命令进行回复;
步骤S32、上位机程序从MCU的回复中获取IP地址和端口号,并创建与回复的MCU同等数量的套接字以管理上位机与各MCU之间的网络通信,且让每个套接字均位于独立的子线程中;
步骤S33、上位机程序选择并打开待升级的下位机程序文件,并将下位机程序文件中的升级代码全部读取到内存中;
步骤S34、在上位机程序的界面上选择需要升级的MCU;
步骤S35、上位机程序向选择的所有需要升级的MCU发送升级命令,以使MCU运行的代码从FLASH上的应用子程序切换为SRAM中的IAP子程序;
步骤S36、上位机程序使用多线程开始向选择的所有需要升级的MCU分包发送已读入内存的升级代码。
进一步地,在所述步骤S36中,对于每一个需要升级的MCU,上位机程序均控制该MCU的子线程在每发送一包升级代码时,均接收一次IAP子程序的回复,且如果升级代码写入成功,则控制该MCU的子线程继续发送下一包升级代码,直到所有升级代码均被IAP子程序写入成功后才停止发送;如果升级代码写入失败,则控制该MCU的子线程重新发送写入失败的升级代码。
进一步地,所述步骤S4具体包括:
步骤S41、在MCU上电后,MCU运行位于FLASH中的应用子程序;同时,应用子程序使用以太网与上位机程序进行通信,以准备接收上位机程序发送的升级命令;
步骤S42、在应用子程序接收到上位机程序下发的升级命令后,将位于FLASH的全局常量数组中的IAP子程序的可执行代码全部复制到位于SRAM的一个全局变量数组中;
步骤S43、在应用子程序中预先定义一种函数指针类型,并声明一个该函数指针类型的函数指针变量;
然后将IAP子程序在SRAM中的复位地址强制转换为定义的函数指针类型,并赋值给函数指针变量;最后使用函数指针变量发起函数调用,使MCU执行函数指针所指地址处的函数代码;
步骤S44、IAP子程序使用以太网与上位机程序进行通信,以等待接收新版本的应用子程序的升级代码;
步骤S45、IAP子程序在接收到第一段应用子程序的升级代码后,将第一段应用子程序的升级代码写入原应用子程序的起始地址,并通过以太网发送回复告知上位机程序发送下一段应用子程序的升级代码,IAP子程序在接收到下一段应用子程序的升级代码后,将下一段应用子程序的升级代码写入到上一段应用子程序的升级代码的末尾,以此类推,直到接收完所有应用子程序的升级代码并写入到FLASH中才停止;
步骤S46、IAP子程序执行复位操作,MCU运行位于FLASH中的升级后的应用子程序。
本发明要解决的技术问题之二,在于提供一种基于以太网的单片机程序批量升级系统,通过该升级系统来对单片机的应用程序进行批量升级,可大大提升生产效率,且无需区分单独的应用子程序烧录文件和IAP子程序烧录文件,可降低出错率。
本发明是这样实现技术问题之二的:一种基于以太网的单片机程序批量升级系统,所述升级系统包括烧录文件生成模块、代码存储模块、升级命令发送模块以及升级执行模块;
所述烧录文件生成模块,用于在下位机程序的开发阶段,将IAP子程序的可执行代码以文本的形式复制到应用子程序源代码的一个全局常量数组中,并对包含了IAP子程序可执行代码的应用子程序源代码进行编译和链接生成一个下位机程序的烧录文件;
所述代码存储模块,用于MCU在下载烧录文件时,将应用子程序的可执行代码作为程序代码放置到MCU内部FLASH的程序代码区中;同时,将IAP子程序的可执行代码作为只读数据放置到与程序代码区相邻的常量数据区中;
所述升级命令发送模块,用于上位机程序通过IAP方式向MCU发送升级命令;
所述升级执行模块,用于在MCU接收到上位机程序发送的升级命令后,应用子程序将存放在全局常量数组中的IAP子程序的可执行代码复制到一个全局变量数组中,且令MCU跳转至运行IAP子程序,以接收升级代码并实现对应用子程序进行覆盖升级。
进一步地,所述升级命令发送模块包括广播单元、通信创建单元、升级文件读取单元、升级选择单元、升级命令发送单元以及升级代码发送单元;
所述广播单元,用于上位机程序通过以太网向广播地址发送一条广播命令,局域网内所有连接正常且正在运行应用子程序的MCU均接收该广播命令,并对该广播命令进行回复;
所述通信创建单元,用于上位机程序从MCU的回复中获取IP地址和端口号,并创建与回复的MCU同等数量的套接字以管理上位机与各MCU之间的网络通信,且让每个套接字均位于独立的子线程中;
所述升级文件读取单元,用于上位机程序选择并打开待升级的下位机程序文件,并将下位机程序文件中的升级代码全部读取到内存中;
所述升级选择单元,用于在上位机程序的界面上选择需要升级的MCU;
所述升级命令发送单元,用于上位机程序向选择的所有需要升级的MCU发送升级命令,以使MCU运行的代码从FLASH上的应用子程序切换为SRAM中的IAP子程序;
所述升级代码发送单元,用于上位机程序使用多线程开始向选择的所有需要升级的MCU分包发送已读入内存的升级代码。
进一步地,在所述升级代码发送单元中,对于每一个需要升级的MCU,上位机程序均控制该MCU的子线程在每发送一包升级代码时,均接收一次IAP子程序的回复,且如果升级代码写入成功,则控制该MCU的子线程继续发送下一包升级代码,直到所有升级代码均被IAP子程序写入成功后才停止发送;如果升级代码写入失败,则控制该MCU的子线程重新发送写入失败的升级代码。
进一步地,所述升级执行模块包括第一通信单元、代码复制单元、函数调用单元、第二通信单元、代码接收及写入单元以及升级执行单元;
所述第一通信单元,用于在MCU上电后,MCU运行位于FLASH中的应用子程序;同时,应用子程序使用以太网与上位机程序进行通信,以准备接收上位机程序发送的升级命令;
所述代码复制单元,用于在应用子程序接收到上位机程序下发的升级命令后,将位于FLASH的全局常量数组中的IAP子程序的可执行代码全部复制到位于SRAM的一个全局变量数组中;
所述函数调用单元,用于在应用子程序中预先定义一种函数指针类型,并声明一个该函数指针类型的函数指针变量;
然后将IAP子程序在SRAM中的复位地址强制转换为定义的函数指针类型,并赋值给函数指针变量;最后使用函数指针变量发起函数调用,使MCU执行函数指针所指地址处的函数代码;
所述第二通信单元,用于IAP子程序使用以太网与上位机程序进行通信,以等待接收新版本的应用子程序的升级代码;
所述代码接收及写入单元,用于IAP子程序在接收到第一段应用子程序的升级代码后,将第一段应用子程序的升级代码写入原应用子程序的起始地址,并通过以太网发送回复告知上位机程序发送下一段应用子程序的升级代码,IAP子程序在接收到下一段应用子程序的升级代码后,将下一段应用子程序的升级代码写入到上一段应用子程序的升级代码的末尾,以此类推,直到接收完所有应用子程序的升级代码并写入到FLASH中才停止;
所述升级执行单元,用于IAP子程序执行复位操作,MCU运行位于FLASH中的升级后的应用子程序。
本发明具有如下优点:
1、应用子程序的源代码携带了IAP子程序的可执行代码,对其编译、链接后只生成一个烧录文件,MCU只需下载一个结合后的下位机程序烧录文件即可,提升了大规模工业生产中的生产效率,而无需区分单独的应用子程序烧录文件和IAP子程序烧录文件,降低了操作工人的出错率;
2、应用子程序照常运行在FLASH的地址头部,调试功能代码时一如既往地便利;
3、MCU上电后默认运行应用子程序,不像传统的IAP升级方式那样上电运行的是IAP子程序且需要一定时间检测是否需要进行升级,因此,不会增加应用功能的启动时间;
4、上位机程序使用多线程技术,结合以太网通信,实现了局域网内一台电脑对多个设备的MCU的并发升级,非常适合大批量设备需要集中升级程序的场合,解决了产品售后程序维护的后顾之忧。
附图说明
下面参照附图结合实施例对本发明作进一步的说明。
图1为本发明涉及的系统框架图。
图2为本发明一种基于以太网的单片机程序批量升级方法的执行流程图。
图3为本发明中上位机程序通过IAP方式对MCU进行批量升级的流程图。
图4为本发明中下位机程序接受IAP方式升级的流程图。
具体实施方式
请参阅图1至图4所示,本发明一种基于以太网的单片机程序批量升级方法的较佳实施例,在本发明的系统框架中,上位机程序运行在电脑上,且电脑使用网线与交换机进行连接;下位机程序(包含IAP子程序和应用子程序)运行在设备的MCU上,将任意数量需要升级程序的设备也使用网线连接到交换机上;通过配置电脑与设备的IP地址、子网掩码、默认网关等网络参数,使它们处于同一局域网内,电脑与设备之间建立双向的以太网通信。
所述方法包括如下步骤:
步骤S1、在下位机程序的开发阶段,将IAP子程序的可执行代码以文本的形式复制到应用子程序源代码的一个全局常量数组中,以使IAP子程序的可执行代码成为应用子程序源代码的一部分,并对包含了IAP子程序可执行代码的应用子程序源代码进行编译和链接生成一个下位机程序的烧录文件;其中,IAP子程序的可执行代码是将IAP子程序源代码进行编译和链接生成的“*.bin”文件里的内容,即二进制的可执行代码;
步骤S2、MCU在下载烧录文件时,将应用子程序的可执行代码作为程序代码(Code)放置到MCU内部FLASH的程序代码区中,以供MCU上电后自动运行FLASH中的应用子程序;同时,将IAP子程序的可执行代码作为只读数据(RO Data)放置到与程序代码区相邻的常量数据区中,即使IAP子程序的可执行代码处于非运行状态;
步骤S3、上位机程序通过IAP方式向MCU发送升级命令;
步骤S4、在MCU接收到上位机程序发送的升级命令后,应用子程序将存放在全局常量数组中的IAP子程序的可执行代码复制到一个全局变量数组中,且令MCU跳转至运行IAP子程序,以接收升级代码并实现对应用子程序进行覆盖升级。
在本发明中,所述步骤S3具体包括:
步骤S31、上位机程序通过以太网向广播地址发送一条广播命令,局域网内所有连接正常且正在运行应用子程序的MCU均接收该广播命令,并对该广播命令进行回复;
步骤S32、上位机程序从MCU的回复中获取IP地址和端口号,并创建与回复的MCU同等数量的套接字(Socket)以管理上位机与各MCU之间的网络通信,且让每个套接字均位于独立的子线程中,这也意味着对多个设备的MCU的数据收/发控制是并发的;
步骤S33、上位机程序选择并打开待升级的下位机程序文件(“*.bin”,二进制文件),并将下位机程序文件中的升级代码(即二进制可执行代码)全部读取到内存中;
步骤S34、在上位机程序的界面上选择需要升级的MCU,在具体实施时,可以支持单选、多选和全选功能;
步骤S35、上位机程序向选择的所有需要升级的MCU发送升级命令,以使MCU运行的代码从FLASH上的应用子程序切换为SRAM(Static Random-Access Memory,静态随机存储器,即通常所指的内存)中的IAP子程序,准备接收升级代码;
步骤S36、上位机程序使用多线程开始向选择的所有需要升级的MCU分包发送已读入内存的升级代码。
在所述步骤S36中,对于每一个需要升级的MCU,上位机程序均控制该MCU的子线程在每发送一包升级代码时,均接收一次IAP子程序的回复,且如果升级代码写入成功(即成功写入到FLASH中),则控制该MCU的子线程继续发送下一包升级代码,直到所有升级代码均被IAP子程序写入成功后才停止发送;如果升级代码写入失败,则控制该MCU的子线程重新发送写入失败的升级代码(即重发上一包升级代码),当然,在具体实施时,还可以设置重新发送的次数,例如,可以设置最多重新发送3次,且在重新发送3次后,如果还是失败,那么就提示升级失败。
在本发明中,所述步骤S4具体包括:
步骤S41、在MCU上电后,MCU运行位于FLASH中的应用子程序,以实现各种各样的用户功能;同时,应用子程序使用以太网与上位机程序进行通信,以准备接收上位机程序发送的升级命令;
步骤S42、在应用子程序接收到上位机程序下发的升级命令后,将位于FLASH的全局常量数组中的IAP子程序的可执行代码全部复制到位于SRAM的一个全局变量数组中,后者的起始地址为SRAM的起始地址;
步骤S43、在应用子程序中预先定义一种函数指针类型(例如:“typedef void(*pFunction)(void);”,该语句定义了一种无返回值、无参数的函数指针类型),并声明一个该函数指针类型的函数指针变量(例如:“pFunction JumpToIAP;”,该语句声明“JumpToIAP”为上述类型的函数指针);
然后将IAP子程序在SRAM中的复位地址强制转换为定义的函数指针类型,并赋值给函数指针变量(例如:“JumpToIAP=(pFunction)*(vu32*)IAP_RESET_ADDRESS;”,该语句使“JumpToIAP”指向“IAP_RESET_ADDRESS”);最后使用函数指针变量发起函数调用(例如:“JumpToIAP();”),使MCU执行函数指针所指地址处的函数代码,即IAP子程序的复位函数,于是IAP子程序便可在SRAM中运行起来了;
步骤S44、IAP子程序使用以太网与上位机程序进行通信,以等待接收新版本的应用子程序的升级代码;
步骤S45、IAP子程序在接收到第一段应用子程序的升级代码后,将第一段应用子程序的升级代码写入原应用子程序的起始地址(即FLASH的起始地址),并通过以太网发送回复告知上位机程序发送下一段应用子程序的升级代码,IAP子程序在接收到下一段应用子程序的升级代码后,将下一段应用子程序的升级代码写入到上一段应用子程序的升级代码的末尾,以此类推,直到接收完所有应用子程序的升级代码并写入到FLASH中才停止;
步骤S46、IAP子程序执行复位操作,MCU运行位于FLASH中的升级后的应用子程序。
由上述可知,在本发明中,下位机程序是IAP子程序和应用子程序的结合体,与传统IAP升级方式一样,开发阶段需要编写两份独立的项目源代码。不同的是,本发明并非将IAP程序源代码和应用子程序源代码独立编译、链接生成两个不同的烧录文件,再分别下载到MCU,而是以应用子程序源代码携带IAP子程序的可执行代码的形式进行编译、链接,最终只生成一个烧录文件,只需下载一次即可。上位机程序包含了烧录文件的选择、文件内部可执行代码的读取、升级命令的下达及可执行代码的分包传输等功能。本发明的上位机程序使用多线程技术,结合以太网通信,在局域网内实现了一台电脑对多个具有不同IP地址的设备的并发升级,即实现了统一的、集中式的单片机程序的批量升级工作。
请参阅图1至图4所示,本发明一种基于以太网的单片机程序批量升级系统的较佳实施例,在本发明的系统框架中,上位机程序运行在电脑上,且电脑使用网线与交换机进行连接;下位机程序(包含IAP子程序和应用子程序)运行在设备的MCU上,将任意数量需要升级程序的设备也使用网线连接到交换机上;通过配置电脑与设备的IP地址、子网掩码、默认网关等网络参数,使它们处于同一局域网内,电脑与设备之间建立双向的以太网通信。
所述升级系统包括烧录文件生成模块、代码存储模块、升级命令发送模块以及升级执行模块;
所述烧录文件生成模块,用于在下位机程序的开发阶段,将IAP子程序的可执行代码以文本的形式复制到应用子程序源代码的一个全局常量数组中,以使IAP子程序的可执行代码成为应用子程序源代码的一部分,并对包含了IAP子程序可执行代码的应用子程序源代码进行编译和链接生成一个下位机程序的烧录文件;其中,IAP子程序的可执行代码是将IAP子程序源代码进行编译和链接生成的“*.bin”文件里的内容,即二进制的可执行代码;
所述代码存储模块,用于MCU在下载烧录文件时,将应用子程序的可执行代码作为程序代码(Code)放置到MCU内部FLASH的程序代码区中,以供MCU上电后自动运行FLASH中的应用子程序;同时,将IAP子程序的可执行代码作为只读数据(RO Data)放置到与程序代码区相邻的常量数据区中,即使IAP子程序的可执行代码处于非运行状态;
所述升级命令发送模块,用于上位机程序通过IAP方式向MCU发送升级命令;
所述升级执行模块,用于在MCU接收到上位机程序发送的升级命令后,应用子程序将存放在全局常量数组中的IAP子程序的可执行代码复制到一个全局变量数组中,且令MCU跳转至运行IAP子程序,以接收升级代码并实现对应用子程序进行覆盖升级。
在本发明中,所述升级命令发送模块包括广播单元、通信创建单元、升级文件读取单元、升级选择单元、升级命令发送单元以及升级代码发送单元;
所述广播单元,用于上位机程序通过以太网向广播地址发送一条广播命令,局域网内所有连接正常且正在运行应用子程序的MCU均接收该广播命令,并对该广播命令进行回复;
所述通信创建单元,用于上位机程序从MCU的回复中获取IP地址和端口号,并创建与回复的MCU同等数量的套接字(Socket)以管理上位机与各MCU之间的网络通信,且让每个套接字均位于独立的子线程中,这也意味着对多个设备的MCU的数据收/发控制是并发的;
所述升级文件读取单元,用于上位机程序选择并打开待升级的下位机程序文件(“*.bin”,二进制文件),并将下位机程序文件中的升级代码(即二进制可执行代码)全部读取到内存中;
所述升级选择单元,用于在上位机程序的界面上选择需要升级的MCU,在具体实施时,可以支持单选、多选和全选功能;
所述升级命令发送单元,用于上位机程序向选择的所有需要升级的MCU发送升级命令,以使MCU运行的代码从FLASH上的应用子程序切换为SRAM(Static Random-AccessMemory,静态随机存储器,即通常所指的内存)中的IAP子程序,准备接收升级代码;
所述升级代码发送单元,用于上位机程序使用多线程开始向选择的所有需要升级的MCU分包发送已读入内存的升级代码。
在所述升级代码发送单元中,对于每一个需要升级的MCU,上位机程序均控制该MCU的子线程在每发送一包升级代码时,均接收一次IAP子程序的回复,且如果升级代码写入成功(即成功写入到FLASH中),则控制该MCU的子线程继续发送下一包升级代码,直到所有升级代码均被IAP子程序写入成功后才停止发送;如果升级代码写入失败,则控制该MCU的子线程重新发送写入失败的升级代码(即重发上一包升级代码),当然,在具体实施时,还可以设置重新发送的次数,例如,可以设置最多重新发送3次,且在重新发送3次后,如果还是失败,那么就提示升级失败。
在本发明中,所述升级执行模块包括第一通信单元、代码复制单元、函数调用单元、第二通信单元、代码接收及写入单元以及升级执行单元;
所述第一通信单元,用于在MCU上电后,MCU运行位于FLASH中的应用子程序,以实现各种各样的用户功能;同时,应用子程序使用以太网与上位机程序进行通信,以准备接收上位机程序发送的升级命令;
所述代码复制单元,用于在应用子程序接收到上位机程序下发的升级命令后,将位于FLASH的全局常量数组中的IAP子程序的可执行代码全部复制到位于SRAM的一个全局变量数组中,后者的起始地址为SRAM的起始地址;
所述函数调用单元,用于在应用子程序中预先定义一种函数指针类型(例如:“typedefvoid(*pFunction)(void);”,该语句定义了一种无返回值、无参数的函数指针类型),并声明一个该函数指针类型的函数指针变量(例如:“pFunction JumpToIAP;”,该语句声明“JumpToIAP”为上述类型的函数指针);
然后将IAP子程序在SRAM中的复位地址强制转换为定义的函数指针类型,并赋值给函数指针变量(例如:“JumpToIAP=(pFunction)*(vu32*)IAP_RESET_ADDRESS;”,该语句使“JumpToIAP”指向“IAP_RESET_ADDRESS”);最后使用函数指针变量发起函数调用(例如:“JumpToIAP();”),使MCU执行函数指针所指地址处的函数代码,即IAP子程序的复位函数,于是IAP子程序便可在SRAM中运行起来了;
所述第二通信单元,用于IAP子程序使用以太网与上位机程序进行通信,以等待接收新版本的应用子程序的升级代码;
所述代码接收及写入单元,用于IAP子程序在接收到第一段应用子程序的升级代码后,将第一段应用子程序的升级代码写入原应用子程序的起始地址(即FLASH的起始地址),并通过以太网发送回复告知上位机程序发送下一段应用子程序的升级代码,IAP子程序在接收到下一段应用子程序的升级代码后,将下一段应用子程序的升级代码写入到上一段应用子程序的升级代码的末尾,以此类推,直到接收完所有应用子程序的升级代码并写入到FLASH中才停止;
所述升级执行单元,用于IAP子程序执行复位操作,MCU运行位于FLASH中的升级后的应用子程序。
由上述可知,在本发明中,下位机程序是IAP子程序和应用子程序的结合体,与传统IAP升级方式一样,开发阶段需要编写两份独立的项目源代码。不同的是,本发明并非将IAP程序源代码和应用子程序源代码独立编译、链接生成两个不同的烧录文件,再分别下载到MCU,而是以应用子程序源代码携带IAP子程序的可执行代码的形式进行编译、链接,最终只生成一个烧录文件,只需下载一次即可。上位机程序包含了烧录文件的选择、文件内部可执行代码的读取、升级命令的下达及可执行代码的分包传输等功能。本发明的上位机程序使用多线程技术,结合以太网通信,在局域网内实现了一台电脑对多个具有不同IP地址的设备的并发升级,即实现了统一的、集中式的单片机程序的批量升级工作。
综上所述,本发明具有如下优点:
1、应用子程序的源代码携带了IAP子程序的可执行代码,对其编译、链接后只生成一个烧录文件,MCU只需下载一个结合后的下位机程序烧录文件即可,提升了大规模工业生产中的生产效率,而无需区分单独的应用子程序烧录文件和IAP子程序烧录文件,降低了操作工人的出错率;
2、应用子程序照常运行在FLASH的地址头部,调试功能代码时一如既往地便利;
3、MCU上电后默认运行应用子程序,不像传统的IAP升级方式那样上电运行的是IAP子程序且需要一定时间检测是否需要进行升级,因此,不会增加应用功能的启动时间;
4、上位机程序使用多线程技术,结合以太网通信,实现了局域网内一台电脑对多个设备的MCU的并发升级,非常适合大批量设备需要集中升级程序的场合,解决了产品售后程序维护的后顾之忧。
虽然以上描述了本发明的具体实施方式,但是熟悉本技术领域的技术人员应当理解,我们所描述的具体的实施例只是说明性的,而不是用于对本发明的范围的限定,熟悉本领域的技术人员在依照本发明的精神所作的等效的修饰以及变化,都应当涵盖在本发明的权利要求所保护的范围内。
Claims (2)
1.一种基于以太网的单片机程序批量升级方法,其特征在于:所述方法包括如下步骤:
步骤S1、在下位机程序的开发阶段,将IAP子程序的可执行代码以文本的形式复制到应用子程序源代码的一个全局常量数组中,以使IAP子程序的可执行代码成为应用子程序源代码的一部分,并对包含了IAP子程序可执行代码的应用子程序源代码进行编译和链接生成一个下位机程序的烧录文件;
步骤S2、MCU在下载烧录文件时,将应用子程序的可执行代码作为程序代码放置到MCU内部FLASH的程序代码区中;同时,将IAP子程序的可执行代码作为只读数据放置到与程序代码区相邻的常量数据区中;
步骤S3、上位机程序通过IAP方式向MCU发送升级命令;
步骤S4、在MCU接收到上位机程序发送的升级命令后,应用子程序将存放在全局常量数组中的IAP子程序的可执行代码复制到一个全局变量数组中,且令MCU跳转至运行IAP子程序,以接收升级代码并实现对应用子程序进行覆盖升级;
所述步骤S3具体包括:
步骤S31、上位机程序通过以太网向广播地址发送一条广播命令,局域网内所有连接正常且正在运行应用子程序的MCU均接收该广播命令,并对该广播命令进行回复;
步骤S32、上位机程序从MCU的回复中获取IP地址和端口号,并创建与回复的MCU同等数量的套接字以管理上位机与各MCU之间的网络通信,且让每个套接字均位于独立的子线程中;
步骤S33、上位机程序选择并打开待升级的下位机程序文件,并将下位机程序文件中的升级代码全部读取到内存中;
步骤S34、在上位机程序的界面上选择需要升级的MCU;
步骤S35、上位机程序向选择的所有需要升级的MCU发送升级命令,以使MCU运行的代码从FLASH上的应用子程序切换为SRAM中的IAP子程序;
步骤S36、上位机程序使用多线程开始向选择的所有需要升级的MCU分包发送已读入内存的升级代码;
对于每一个需要升级的MCU,上位机程序均控制该MCU的子线程在每发送一包升级代码时,均接收一次IAP子程序的回复,且如果升级代码写入成功,则控制该MCU的子线程继续发送下一包升级代码,直到所有升级代码均被IAP子程序写入成功后才停止发送;如果升级代码写入失败,则控制该MCU的子线程重新发送写入失败的升级代码;
所述步骤S4具体包括:
步骤S41、在MCU上电后,MCU运行位于FLASH中的应用子程序;同时,应用子程序使用以太网与上位机程序进行通信,以准备接收上位机程序发送的升级命令;
步骤S42、在应用子程序接收到上位机程序下发的升级命令后,将位于FLASH的全局常量数组中的IAP子程序的可执行代码全部复制到位于SRAM的一个全局变量数组中;
步骤S43、在应用子程序中预先定义一种函数指针类型,并声明一个该函数指针类型的函数指针变量;
然后将IAP子程序在SRAM中的复位地址强制转换为定义的函数指针类型,并赋值给函数指针变量;最后使用函数指针变量发起函数调用,使MCU执行函数指针所指地址处的函数代码;
步骤S44、IAP子程序使用以太网与上位机程序进行通信,以等待接收新版本的应用子程序的升级代码;
步骤S45、IAP子程序在接收到第一段应用子程序的升级代码后,将第一段应用子程序的升级代码写入原应用子程序的起始地址,并通过以太网发送回复告知上位机程序发送下一段应用子程序的升级代码,IAP子程序在接收到下一段应用子程序的升级代码后,将下一段应用子程序的升级代码写入到上一段应用子程序的升级代码的末尾,以此类推,直到接收完所有应用子程序的升级代码并写入到FLASH中才停止;
步骤S46、IAP子程序执行复位操作,MCU运行位于FLASH中的升级后的应用子程序。
2.一种基于以太网的单片机程序批量升级系统,其特征在于:所述升级系统包括烧录文件生成模块、代码存储模块、升级命令发送模块以及升级执行模块;
所述烧录文件生成模块,用于在下位机程序的开发阶段,将IAP子程序的可执行代码以文本的形式复制到应用子程序源代码的一个全局常量数组中,以使IAP子程序的可执行代码成为应用子程序源代码的一部分,并对包含了IAP子程序可执行代码的应用子程序源代码进行编译和链接生成一个下位机程序的烧录文件;
所述代码存储模块,用于MCU在下载烧录文件时,将应用子程序的可执行代码作为程序代码放置到MCU内部FLASH的程序代码区中;同时,将IAP子程序的可执行代码作为只读数据放置到与程序代码区相邻的常量数据区中;
所述升级命令发送模块,用于上位机程序通过IAP方式向MCU发送升级命令;
所述升级执行模块,用于在MCU接收到上位机程序发送的升级命令后,应用子程序将存放在全局常量数组中的IAP子程序的可执行代码复制到一个全局变量数组中,且令MCU跳转至运行IAP子程序,以接收升级代码并实现对应用子程序进行覆盖升级;
所述升级命令发送模块包括广播单元、通信创建单元、升级文件读取单元、升级选择单元、升级命令发送单元以及升级代码发送单元;
所述广播单元,用于上位机程序通过以太网向广播地址发送一条广播命令,局域网内所有连接正常且正在运行应用子程序的MCU均接收该广播命令,并对该广播命令进行回复;
所述通信创建单元,用于上位机程序从MCU的回复中获取IP地址和端口号,并创建与回复的MCU同等数量的套接字以管理上位机与各MCU之间的网络通信,且让每个套接字均位于独立的子线程中;
所述升级文件读取单元,用于上位机程序选择并打开待升级的下位机程序文件,并将下位机程序文件中的升级代码全部读取到内存中;
所述升级选择单元,用于在上位机程序的界面上选择需要升级的MCU;
所述升级命令发送单元,用于上位机程序向选择的所有需要升级的MCU发送升级命令,以使MCU运行的代码从FLASH上的应用子程序切换为SRAM中的IAP子程序;
所述升级代码发送单元,用于上位机程序使用多线程开始向选择的所有需要升级的MCU分包发送已读入内存的升级代码;
对于每一个需要升级的MCU,上位机程序均控制该MCU的子线程在每发送一包升级代码时,均接收一次IAP子程序的回复,且如果升级代码写入成功,则控制该MCU的子线程继续发送下一包升级代码,直到所有升级代码均被IAP子程序写入成功后才停止发送;如果升级代码写入失败,则控制该MCU的子线程重新发送写入失败的升级代码;
所述升级执行模块包括第一通信单元、代码复制单元、函数调用单元、第二通信单元、代码接收及写入单元以及升级执行单元;
所述第一通信单元,用于在MCU上电后,MCU运行位于FLASH中的应用子程序;同时,应用子程序使用以太网与上位机程序进行通信,以准备接收上位机程序发送的升级命令;
所述代码复制单元,用于在应用子程序接收到上位机程序下发的升级命令后,将位于FLASH的全局常量数组中的IAP子程序的可执行代码全部复制到位于SRAM的一个全局变量数组中;
所述函数调用单元,用于在应用子程序中预先定义一种函数指针类型,并声明一个该函数指针类型的函数指针变量;
然后将IAP子程序在SRAM中的复位地址强制转换为定义的函数指针类型,并赋值给函数指针变量;最后使用函数指针变量发起函数调用,使MCU执行函数指针所指地址处的函数代码;
所述第二通信单元,用于IAP子程序使用以太网与上位机程序进行通信,以等待接收新版本的应用子程序的升级代码;
所述代码接收及写入单元,用于IAP子程序在接收到第一段应用子程序的升级代码后,将第一段应用子程序的升级代码写入原应用子程序的起始地址,并通过以太网发送回复告知上位机程序发送下一段应用子程序的升级代码,IAP子程序在接收到下一段应用子程序的升级代码后,将下一段应用子程序的升级代码写入到上一段应用子程序的升级代码的末尾,以此类推,直到接收完所有应用子程序的升级代码并写入到FLASH中才停止;
所述升级执行单元,用于IAP子程序执行复位操作,MCU运行位于FLASH中的升级后的应用子程序。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910412278.2A CN110262817B (zh) | 2019-05-17 | 2019-05-17 | 一种基于以太网的单片机程序批量升级方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910412278.2A CN110262817B (zh) | 2019-05-17 | 2019-05-17 | 一种基于以太网的单片机程序批量升级方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110262817A CN110262817A (zh) | 2019-09-20 |
CN110262817B true CN110262817B (zh) | 2023-02-28 |
Family
ID=67913258
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910412278.2A Active CN110262817B (zh) | 2019-05-17 | 2019-05-17 | 一种基于以太网的单片机程序批量升级方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110262817B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111782246A (zh) * | 2020-07-03 | 2020-10-16 | 常州东晟合众节能科技有限公司 | 基于总线的多节点设备嵌入式程序升级方法 |
CN114205189B (zh) * | 2021-08-25 | 2023-03-24 | 四川长虹电器股份有限公司 | 一种基于二级网关批量烧录设备信息的方法 |
CN114281392A (zh) * | 2022-03-04 | 2022-04-05 | 季华实验室 | 一种多mcu从站的串口升级方法及系统 |
CN114816460A (zh) * | 2022-06-29 | 2022-07-29 | 上海捷勃特机器人有限公司 | 一种机器人系统远程升级微控制器的装置及其方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN201146523Y (zh) * | 2007-12-30 | 2008-11-05 | 福建师范大学 | 一种基于gprs网络的arm嵌入式终端远程升级装置 |
CN105204899A (zh) * | 2015-09-17 | 2015-12-30 | 浪潮软件集团有限公司 | 一种基于网络的单片机固件升级方法的实现 |
CN108334373A (zh) * | 2017-10-16 | 2018-07-27 | 深圳市路畅科技股份有限公司 | 一种多mcu升级的方法及系统 |
CN109445823A (zh) * | 2018-11-02 | 2019-03-08 | 长虹美菱股份有限公司 | 一种mcu固件快速升级方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20020138819A1 (en) * | 2000-12-19 | 2002-09-26 | Hills Theodore S. | Computer programming language to describe and encapsulate a computer as a set of classes and objects |
-
2019
- 2019-05-17 CN CN201910412278.2A patent/CN110262817B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN201146523Y (zh) * | 2007-12-30 | 2008-11-05 | 福建师范大学 | 一种基于gprs网络的arm嵌入式终端远程升级装置 |
CN105204899A (zh) * | 2015-09-17 | 2015-12-30 | 浪潮软件集团有限公司 | 一种基于网络的单片机固件升级方法的实现 |
CN108334373A (zh) * | 2017-10-16 | 2018-07-27 | 深圳市路畅科技股份有限公司 | 一种多mcu升级的方法及系统 |
CN109445823A (zh) * | 2018-11-02 | 2019-03-08 | 长虹美菱股份有限公司 | 一种mcu固件快速升级方法 |
Non-Patent Citations (2)
Title |
---|
stm32 IAP + APP合成一个烧写文件;xinghuah;《CSDN》;20180828;第1-4页 * |
把别人的Tcl/Tk代码加入到Go语言里9 游戏2 可旋转的3D多面体;weixin_34269583;《CSDN》;20150513;第1页 * |
Also Published As
Publication number | Publication date |
---|---|
CN110262817A (zh) | 2019-09-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110262817B (zh) | 一种基于以太网的单片机程序批量升级方法及系统 | |
RU2549126C2 (ru) | Способ и система установки и обновления программного обеспечения прикладного терминала в домашней сети | |
US20100249951A1 (en) | Method and Apparatus for Synchronizing Configuration Changes Across Multiple Components of an Industrial Control System | |
CN110024362A (zh) | 蓝牙测试系统及方法 | |
CN112947977B (zh) | 一种软件在线升级方法及系统 | |
CN106909362B (zh) | Bmc固件生成的方法和装置、bmc系统启动的方法和装置 | |
CN111258561A (zh) | 一种软件自动化编译部署启动监控的方法 | |
CN107577609B (zh) | 一种基于主机端动态链接的嵌入式系统动态模块调试系统 | |
CN112506477B (zh) | 一种在Kubernetes集群中使用RESTful API添加计算节点的方法 | |
JPH10177495A (ja) | 分散形制御ネットワークシステム | |
CN112910714A (zh) | 具有主从机结构的物联网终端设备的远程固件升级方法 | |
CN113050508A (zh) | 控制板的调试方法、装置、存储介质及调试设备 | |
Ramon | Intel Galileo and Intel Galileo Gen 2: API Features and Arduino Projects for Linux Programmers | |
JP2009157533A (ja) | プログラマブルコントローラシステム | |
CN115454749A (zh) | 一种通用型烧录机的烧录、测试系统 | |
CN115408013A (zh) | Zynq UltraScale+MPSoC平台的固件和文件自动烧写方法 | |
CN115378761B (zh) | 一种基于PLC的EtherCAT主站系统快速实现方法 | |
CN116756067A (zh) | 基于鸿蒙分布式SoftBus的AI-EC嵌入式系统及其构建、部署方法 | |
CN115878144A (zh) | 一种终端设备程序升级系统及方法 | |
CN111090447A (zh) | 一种io模块的固件更新方法及相关装置 | |
CN112882748A (zh) | 一种嵌入式系统的映像文件管理和批量部署工具 | |
CN118012759A (zh) | 一种可视化远程调试方法、环境搭建方法、装置及设备 | |
CN115543348A (zh) | 一种应用程序的部署方法 | |
CN114756432B (zh) | 一种实现bmc监控功能的方法、系统及服务器 | |
CN214311710U (zh) | 一种集成开发系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |