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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM