STM32+ESP8266+AIR202/302远程升级方案-程序优化1-bin文件识别,bin文件有效性检测

<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESA2GJK1DH1K_B/" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

 

前言

远程升级方案已经有好多家公司和开发者在使用,使用过程中反馈了一些问题.

这一节解决一个关于bin文件识别的问题.

问题由来

1.假设一家公司正在做两个项目(A项目和B项目),都是使用的同一款单片机,而且内部中断偏移设置的也一样.

然后工程师们为了赶项目,天天熬夜加班,然后A项目更新了一版程序,准备上传到服务器.

结果工程师不小心把B项目的文件替换了原先A项目的云端的程序文件!

就是说,上传错了!!!!

因为都是使用的同一款单片机,而且内部中断偏移设置的也一样,

所以A项目的单片机下载了程序文件以后也是可以运行的!!!

这不是坏了,原先A项目的单片机运行了B项目的程序!!!!

 

2.又或者本身A项目的bin文件下载地址是 XXXXX/aaaa/a.bin

结果有个工程师把下载地址改为了 XXXXX/bbbb/b.bin

这不是又坏了,原先A项目的单片机运行了B项目的程序!!!!

 

问题的根本

单片机怎么判断,自己下载的bin文件就是自己的文件???

 

解决思路方案

每个项目/产品都会在程序里面设置一个型号.

BootLoader程序和用户程序里面的型号保持一致.

每次编译用户程序的时候把型号编译到bin文件里面.

BootLoader里面执行升级的时候去查看bin文件里面有没有和自己一样的型号(字符串).

 

开始优化(用户程序)

1.注意

请用户参考此文章自行对代码进行修改!原先的教程源码不再一一更改.

 

 

2.打开用户程序的IAP.c文件,把原先的记录型号的数组做如下更改

char DeviceModel[50] __attribute__((at(FLASH_BASE | 0x4800+1024*1))) = "STM32ESP8266BK";

 

 

 

 

注意FLASH_BASE | 0x4800 这个是中断偏移,要和主函数保持一致

 

 

 

3.为什么是 +1024*1

把型号存储在偏移1024字节flash的位置
第一是留出前面的单片机自己需要用的空间
第二是数据校验间隔为128/256/512/1024,需要避免生成校验数据的时候把型号给截断.
而且我希望型号存储的开始位置是校验数据的开始位置,方便我提取判断,所以取1024的倍数.

用户程序只做这一个修改就可以了.

 

 

开始优化(BootLoader程序)

 

1.在BootLoader程序中的IAP.h的宏定义状态里面增加一个程序无效的标志

#define UpdateStatus_ProgramInvalid    0xE8  

 

 

 

 

2.在BootLoader程序中的IAPStruct结构体里面增加一个变量

char ProgramEfficient;

 

 

 

 

 

3.在BootLoader的IAP.c文件里面的获取程序文件函数里面清零这个变量

IAPStructValue.ProgramEfficient = 0;

 

 

 

 

 

 

4.在BootLoader的IAP.c文件增加记录型号的数组(型号和用户程序里面的保持一致)

char DeviceModel[50] = "STM32ESP8266BK";

 

 

 

 

5.在IAPWriteData函数里面的提取数据以后增加判断型号的程序

注意:注意:注意:

如果自己程序的printf是阻塞式打印,请屏蔽掉printf !!!!!!!

 

if(IAPStructValue.ProgramEfficient == 0)
            {
                if(memcmp(IAPStructValue.CheckDataBuff,DeviceModel,sizeof(DeviceModel)) == 0)//ÅжÏÐͺÅ
                {
                    IAPStructValue.ProgramEfficient = 1;//Ò»ÖÂ
                    printf("\r\nÐͺÅÒ»ÖÂ:%s\r\n",DeviceModel);
                }
            }

 

 

 

 

 

 

 

 

 

6.在接收数据完成里面,判断如果程序无效,则重启执行回滚程序

 

if(IAPStructValue.ProgramEfficient == 0)//ÎļþÎÞЧ
            {
                IAPSetUpdateStatus(UpdateStatus_ProgramInvalid);//дÈëÎļþÎÞЧ±ê¼Ç
                /*Èç¹û²»Ð´ÏÂÃæµÄÖØÆô,Ôò³ÌÐò»á³¢ÊÔÏÂÔØ,ĬÈÏ3´Î*/
                printf("\r\n³ÌÐòÎÞЧ,ÕýÔÚÖØÆôÖ´Ðлعö!\r\n");
                delay_ms(500);
                IAPResetMCU();//ÖØÆô
            }

 

 

 

 

 

 

 

 

测试

1.分别编译下载现在的BootLoader程序 和 用户程序  到单片机

 

2.把用户程序生成的bin文件用OTA Tools软件生成带有校验数据的文件

 

 

 

 

 

3.把文件放到服务器

 

 

 

 

 

4.观察日志

 

 

 

 

 

5.把用户程序里面的型号改一下(测试是否可以做到有效性检测)

 

 

 

 

 

6.编译,用OTA Tools软件生成bin文件,上传到服务器

 

 

 

 

 

7.查看日志

 

 

结语

为便于后期移植使用,BootLoader 里面的IAP文件

和用户程序里面的IAP文件最好保持一致!

 

 

 

posted on 2020-11-15 03:51  广源时代  阅读(951)  评论(0编辑  收藏  举报

导航

支付宝 QQ群