本帖最后由 邪乎风云 于 2019-7-21 08:37 编辑
之前做过DFU在线升级,后来自己利用ESP8266和串口做了一个远程升级的工具,都需要建立两个工程,而且更新东西较多,需要擦除flash,然后一点一点的把数据传进去现在想到一种单纯的更新函数的方法(有点类似官方给的虚拟EEPROM的想法),不需要更新所有的代码,如果扇区的空间用完了可以进行擦除,否则不用擦除,目前实验测试OK(程序中只是闪灯和串口打印,代码比较小,所以没有做后续的flash空间不足的情况)缺点:如果当前工程中函数中只能调用之前现有的函数,否则需要整个工程的程序都得更新
具体思路如下:
首先建立一个工程,里面会用到EEPROM来记录程序中会用到的代码地址然后写一个调用函数的指针指向添加的函数地址,同时使用一个step_**作为标记位判断是否运行添加的函数工程里面后面可能需要变动的那个函数先不编译,生成的代码烧录进去
然后编译包含需要运行的函数的代码,需要将此函数的起始地址固定到某个位置,生成的hex方便上位机提取
然后烧录这个函数以及让函数运行就交给上位机了
上位机第一步从 MCU中读取当前将要保存程序的首地址
第二步 计算代码量,将下一次更新的代码首地址给MCU保存
第三步 通知MCU将当前首地址保存并且赋值给函数指针
第四步 更新所需要更新的函数代码
第五步 通知MCU修改函数指针运行的step_**,启动函数运行
如图首先将连个函数不编译,直接用烧录器烧录到MCU中
然后修改上图中的一个宏定义 ,编译生成hex,然后用上位机读取hex文件,并且提取需要更新的函数内容
然后点击烧录按钮,LED灯开始闪烁
继续修改代码里面的宏定义 ,编译生成hex,同样然后用上位机读取hex文件,并且提取需要更新的函数内容,并且修改上位机中的 程序ID,然后点击烧录(代码提取的地址相同,烧录到MCU中是变化的如图所示)
效果是灯闪烁同时串口也打印
|
上位机用VS写