1. 程式人生 > 實用技巧 >遠端升級程式過程

遠端升級程式過程

前言:

在很多消費電子裝置中,都有遠端升級的功能,它的優點能給裝置增加新功能,以及以新增新功能為理由的修復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地址處,那麼裝置就會執行新程式。