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