遠程升級程序過程


前言:

在很多消費電子設備中,都有遠程升級的功能,它的優點能給設備增加新功能,以及以新增新功能為理由的修復bug。

 

框架:

一個有遠程升級的設備有兩個程序,一個是bootloader,另一個是設備程序。bootloader自然是引導程序,它的作用是啟動哪一個程序。

bootloader一般是處於內存的開始的地址,即設備啟動就會去運行它。

 

升級包:

用keil把程序編譯為一個bin文件,然后上位機將bin文件處理成多幀(具體看實際傳輸設備),向設備發送。

 

bootloader:

bootloader一啟動,首先檢查一個標志位,這個標志位我管它叫app_flag,如果它為1時則將pc指針跳轉至App1的地址,為2時則跳轉到2。

    if(user_app_flag_addr==APP2_FLAG) //運行第二個應用程序
        {
            if(((*(vu32*)(APP2_FLASH_ADDR+4))&0xFF000000)==0x08000000)//判斷是否為0X08XXXXXX.
            {
                iap_load_app(APP2_FLASH_ADDR);//執行FLASH APP代碼
            }
        }
     else    //運行第一個應用程序
     {
             if(((*(vu32*)(APP1_FLASH_ADDR+4))&0xFF000000)==0x08000000)//判斷是否為0X08XXXXXX.
            {
                iap_load_app(APP1_FLASH_ADDR);//執行FLASH APP代碼
            }
     }

 

遠程升級框架:

首先涉及兩個點:

 

1.協議制訂

比如協議里面規定控制碼為0x10為遠程升級,數據長度為兩個字節,並且最高位如果置為1則為發送結束。

  1.1 當主站發送第一幀數據時,要准備一塊區域(EEPROM)保存升級程序,保存之前先進行清空,每收到一幀,就把數據保存在該區域。

  1.2 協議里應該有校驗位,確保每一幀發來的數據是正確的。

  1.3 設備接收到每一幀數據都要向主站發送回應,如果網絡問題,導致主站沒有收到回應數據,那么主站應該要向設備再次發送這一幀數據,雖然設備已經有了這一幀數據,但可以把這一幀視為重復幀,重復幀不做任何處理。因此,在程序中還要有一個記錄當前為第幾幀。

  1.4 當數據到達最后一幀時,數據長度的最高位置1,程序判斷為結束。

 

2.接受完數據的處理

  2.1 程序接收到最后一幀數據時,應該提前回復主站,再做處理。

  2.2 程序根據自身處理APP1或APP2,把程序放在APP1或APP2。比如當前程序為APP1,接收到的升級包就應該放在APP2地址幀,如果放在APP1地址中,程序一定會奔潰的。

       2.3 程序復制好地方后,進行一波軟復位,首先就會執行bootloader,引導程序就會判斷app_flag,在復制的時候已經把標志位置為新的APP地址處,那么設備就會運行新程序。


免責聲明!

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



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