物聯(lián)網(wǎng)中常用的ota升級方案
掃描二維碼
隨時隨地手機看文章
物聯(lián)網(wǎng)中常用的ota升級方案
說明
在進行物聯(lián)網(wǎng)開發(fā)的過程中,免不了進行ota升級,那么如何做好ota升級又是非常值得思考的問題。
下面從實際應(yīng)用案例中,剖析一下ota升級的方案。
方案1
最簡單的OTA升級,flash布局如下:
其升級的方案是,每個APP的尾部都會記錄如下的相關(guān)信息,可以作為跳轉(zhuǎn)的標志。
所以可以這樣理解,APP0作為運行分區(qū),APP1作為升級分區(qū),當(dāng)升級分區(qū)的標志置位時,將升級分區(qū)的代碼放到運行分區(qū)中執(zhí)行。
每次都只會跳轉(zhuǎn)到APP0去執(zhí)行代碼。
優(yōu)點:
該方案設(shè)計比較簡單,資源占用小。
缺點:
如果升級的過程中出現(xiàn)錯誤,而校驗又沒有檢測到,則會導(dǎo)致程序起不來。需要加強校驗機制,也需要確保下載代碼完全的準確性。
也可能在升級之后,出現(xiàn)聯(lián)網(wǎng)模塊不能使用,導(dǎo)致需要去現(xiàn)場解決,這種問題發(fā)生后非常嚴重。
方案2
方案1會存在可能起不來的風(fēng)險,這時需要去現(xiàn)場進行程序燒錄,成本很大。所以第二種是差分升級。
當(dāng)APP0運行時,將升級的程序放到APP1中,下次BOOT跳轉(zhuǎn)從APP1地址去運行程序。
當(dāng)APP1運行時,將升級的程序放到APP0中,下次BOOT跳轉(zhuǎn)從APP0地址去運行程序。
這樣可以解決一個問題,當(dāng)模塊升級后連接不了網(wǎng)絡(luò)的問題。如果連接網(wǎng)絡(luò)失敗,可以將失敗的原因放到備份SRAM中,多次連接不上,BOOT檢測到這個現(xiàn)象,可以跳轉(zhuǎn)到另外一個可以運行的程序進行降級運行。因為兩個可以運行的程序沒有被破壞。
但是這個問題解決不了由于程序傳輸錯誤導(dǎo)致的程序啟動不了的問題。
方案3
我曾經(jīng)也在實際項目中用到過另外OTA方案,如下設(shè)計:
該設(shè)計的核心在于BOOT中集成聯(lián)網(wǎng)模塊功能,當(dāng)BOOT下載時,首先會置位相關(guān)的標志位。
其設(shè)計上采用BOOT主要用于下載功能,當(dāng)程序運行APP時,需要升級時,會首先將config的標志位置位,然后跳轉(zhuǎn)到BOOT中進行升級,將代碼永遠放到APP_BAK中,升級完成后,可以校驗通過后,將APP_BAK的代碼拷貝到APP中,然后再運行APP區(qū)代碼。
最后一切功能沒問題后,再將config設(shè)置成正常狀態(tài),否則每次boot啟動后都會進行OTA請求。
優(yōu)點:
程序功能可靠有保障,減少可能起不來的風(fēng)險
缺點:
由于BOOT中集成了比較多的功能,比較復(fù)雜,當(dāng)替換聯(lián)網(wǎng)模塊時,BOOT和APP的代碼需要同步修改。
方案4
rt-thread官網(wǎng)上有一種OTA的方案,具體實現(xiàn)如下:
分區(qū)名 | 起始地址 | 分區(qū)大小 | 分區(qū)位置 | 介紹 |
---|---|---|---|---|
app | 自定義 | 自定義 | 片內(nèi) Flash | 存儲 app 固件 |
download | 自定義 | 自定義 | 片內(nèi) Flash 或者片外 SPI Flash | 存儲待升級固件 |
factory | 自定義 | 自定義 | 片內(nèi) Flash 或者片外 SPI Flash | 存儲出廠固件 |
boot | -- | -- | -- | boot固件 |
流程圖如下:
解釋一下factory分區(qū)的實際應(yīng)用場景。
由于差分升級或者普通的BOOT升級方案都會存在系統(tǒng)啟動不了的可能性,所以增加了一個一定可以啟動的固件。具體的使用是需要boot中檢測一個硬件IO,當(dāng)該IO被長時間按下后,會進入出廠程序設(shè)置。這樣減少了設(shè)備出問題后,技術(shù)人員需要現(xiàn)場升級的煩惱,即使不懂技術(shù)的人也能夠按下按鍵進行復(fù)位。
優(yōu)點:
消除設(shè)備啟動不了的問題,減少程序下載失敗的風(fēng)險
缺點:
資源消耗太大,三個固件起碼需要外掛SPI flash才能設(shè)計的比較好,完全利用內(nèi)部flash,資源有點緊張。