隨著設備的功能越來越強大,系統也越來越復雜,產品升級也成為了開發過程不可或缺的一道程序。在工程應用中,如何在不更改硬件的前提下通過軟件的方式實現產品升級。通過Bootloader來實現固件的升級是一種極好的方式,Bootloader是單片機上電后運行的第一段程序,該程序主要負責固件的更新。
圖1?固件升級
對于產品固件的升級,用戶可采用AMetal提供的Bootloader單區、雙區、差分升級算法及升級示例來進行產品開發。關于Bootloader升級算法的介紹如下:
Bootloader單區升級
單區bootloader通常是將芯片內部的Flash主要劃分為bootloader區、APP區和參數區。bootloader用于引導程序,APP扇區是為了存放升級后的應用程序,參數區是用于存儲特殊的參數,具體的扇區大小可以根據實際使用情況,進行合理劃分。單區升級的典型模型如下:
圖2?單區升級模型
【原理說明】
芯片上電后首先從首地址即bootloader開始執行,參數校驗無誤,跳轉到APP扇區。若有升級的請求,程序跳轉到首地址,在bootloader中接收新的固件,然后將APP區擦除。在新固件參數校驗成功后,程序將從bootloader跳轉到APP區執行應用程序,進而完成固件的升級。
【應用場景】
在擦除APP區的過程中,若設備突然斷電,會造成APP區的應用程序無法啟動。在這種情況下,雖然會重新跳轉到bootloader接收新的固件,進而完成固件的升級;但也存在一些不必要的麻煩,即設備需要多次寫入固件。因此該種升級算法只適用于本地升級,不能在程序正常運行的過程中升級,常適用于Flash容量較小的場景下。
Bootloader雙區升級
【雙區升級模型】
以ZLG116芯片為例,該芯片內部主Flash大小為64K(0x0800_0000 - 0x0800_FFFF),主要將Flash劃分了四個部分:bootloader段扇區,應用段扇區,升級扇區(備份區),升級標志扇區。其中bootloader用于引導程序;應用扇區是為了存放升級后的應用程序;升級扇區是為了存儲新的固件,用于備份固件;升級標志扇區是用于存儲特定的標志等。用戶可以根據自身的實際應用情況合理劃分各區的大小,雙區升級的典型模型如下所示:
圖3?雙區升級模型
【原理說明】
按照上述的ZLG116 Flash劃分,程序首先從地址為0x08000000,即bootloader開始執行,參數校驗通過后,跳轉到應用區。在接收到升級需求后,先將新的固件寫入起始地址為0x0800FC00的備份區,并擦除APP扇區。接著將update(備份區)存儲的新固件寫入到bootloader中,從而完成新固件的寫入。若在擦除APP區的過程中受到其他因素的干擾,用戶可以再次將備份區的固件寫入bootloader。新固件的參數校驗通過后,程序從bootloader跳轉到起始地址為0x08003C00的APP區執行應用代碼。
【應用場景】
相比于單區升級,雙區升級的模型增加了一塊備份扇區,用于存放新的固件。因此即使在擦除APP的時候,設備發生斷電,雙區升級也無需再次在bootloader中接收新固件,只需將備份區存儲的固件傳入到bootloader即可。該升級方式雖然可以避免單區升級只能在本地升級的苦惱,但無法降低傳輸固件的流量,不適用于開發板內存空間較小的場景下。并且雙區升級不得不需要整個APP進行升級,這給產品升級帶來了一些不便。
Bootloader差分升級
【差分包原理】
差分升級是將新老固件具有差異的部分剝離出來,例如固件從V1.1.0升級到V1.1.1,兩個固件相比只修改了1K的內容,如下圖紅色部分為不同部分,將該部分剝離出來生成差分包Diff_V1.1.0~V1.11,通過云端將差分包推送到設備端,設備端接收完成之后,先解壓差分包,再通過差分恢復算法,根據差分包中的數據標志,將新老固件進行融合,變成新的固件,從而完成升級。
圖4?差分包原理
【差分升級模型】
以基于華大HC32L196芯片設計差分升級為例,該芯片Flash為256K(0x000_0000~0x0003_FFFF),首先需要對Flash進行劃分,主要劃分為4個部分:BootLoader區、應用區、download區、參數區。BootLoader區用于引導升級,應用區為升級后的應用程序,download區為下載差分包存儲區間,參數區用于存儲特定參數。各區大小按照實際使用情況,進行合理劃分。差分升級的典型模型如下所示:
圖5?差分升級模型
【原理說明】
按照圖5所示的升級模型,設備上電后首先從bootloader開始執行,參數無誤后跳轉到應用區。當有升級的需求時,先擦除APP區,并將新老固件進行分包,然后按順序對分包后的新老固件對應的每個小塊進行差分壓縮,最后將所有的壓縮包合并成一個文件,形成了升級的固件。將新的升級固件存放在download扇區,然后將該固件寫入bootloader中,若固件參數校驗無誤,則跳到應用區執行后續的程序,進而完成產品的升級。
【應用場景】
差分升級的優點是升級固件更小、下載速度也更快,也更加節省內存空間。相對于整包升級方式(單區升級/雙區升級),其缺點是依賴特定固件。例如:某一差分包為V1.0固件升級到V1.1固件的差分包Diff_V1.0~V1.1,則該差分包只能用于升級版本號是V1.0固件的設備;對于其他版本號固件的設備不能用它升級。差分升級一般適用于希望降低傳輸固件的流量,或者開發板內存不足,不依靠特定升級固件的場景中。