前言:
在很多消費電子設備中,都有遠程升級的功能,它的優點能給設備增加新功能,以及以新增新功能為理由的修復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地址處,那么設備就會運行新程序。