<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文件最好保持一致!
