劉孟臣,張珊珊,姬丹丹
(中電裝備山東電子有限公司,山東 濟(jì)南 250109)
隨著社會(huì)的發(fā)展,各行各業(yè)大量使用了嵌入式電子設(shè)備,如道路上的高清數(shù)字監(jiān)控?cái)z像頭、遠(yuǎn)程水文監(jiān)控設(shè)備、智能電能表、智能采集終端等。這些設(shè)備的軟件升級(jí)維護(hù)是常態(tài),設(shè)備一旦安裝,拆卸十分繁瑣,這就要求其必須能夠遠(yuǎn)程在線升級(jí)。嵌入式設(shè)備一般是基于單片機(jī)/DSP/ARM 開(kāi)發(fā)的,遠(yuǎn)程在線升級(jí)實(shí)際是對(duì)其程序進(jìn)行遠(yuǎn)程升級(jí)。
在實(shí)際使用中,出于種種設(shè)計(jì)考慮,會(huì)出現(xiàn)在同一個(gè)嵌入式設(shè)備上配置兩個(gè)單片機(jī)的場(chǎng)景,兩個(gè)單片機(jī)協(xié)同實(shí)現(xiàn)完整的設(shè)計(jì)功能。比如兩個(gè)單片機(jī),一個(gè)完成管理功能,另一個(gè)完成計(jì)量功能。這種使用雙單片機(jī)的嵌入式設(shè)備往往只有一個(gè)單片機(jī)能與外部主站通信,很多文章已經(jīng)對(duì)這類能直接與外部通信的單片機(jī)的遠(yuǎn)程升級(jí)方式進(jìn)行了詳細(xì)的介紹,而對(duì)于同時(shí)使用兩個(gè)單片機(jī)且只有一個(gè)單片機(jī)能與外部通信的場(chǎng)景介紹的較少。本文將主要講述這種場(chǎng)景下嵌入式設(shè)備的遠(yuǎn)程升級(jí)實(shí)現(xiàn)方案。
本文介紹的雙單片機(jī)嵌入式設(shè)備主要包括1 個(gè)主單片機(jī)、1 個(gè)從單片機(jī)、1 個(gè)遠(yuǎn)通信模組、1 個(gè)片外FLASH 存儲(chǔ)器以及相關(guān)外圍器件,見(jiàn)圖1。兩個(gè)單片機(jī)中主單片機(jī)可以與外部設(shè)備通信,從單片機(jī)只與主單片機(jī)通信。由于外圍設(shè)備不是本文研究重心,因此不做過(guò)多說(shuō)明。在該嵌入式設(shè)備中,主單片機(jī)與從單片機(jī)通過(guò)串口連接,主單片機(jī)通過(guò)SPI 總線與擴(kuò)展的片外FLASH 存儲(chǔ)器連接,主單片機(jī)還通過(guò)串口與遠(yuǎn)程通信模組(即4G 通信模塊)連接。主單片機(jī)通過(guò)遠(yuǎn)程通信模塊以TCP 連接的方式與遠(yuǎn)方主站保持永久連接。
圖1 雙單片機(jī)嵌入式設(shè)備系統(tǒng)框圖
不管是主單片機(jī)還是從單片機(jī),其程序都由啟動(dòng)程序(Bootloader)和用戶程序兩部分組成。Bootloader 具備數(shù)據(jù)傳輸、讀寫Flash、擦除、校驗(yàn)等功能。Bootloader 執(zhí)行完成后進(jìn)入用戶程序開(kāi)始運(yùn)行,用戶程序是實(shí)現(xiàn)用戶設(shè)計(jì)功能的部分。
由第95 頁(yè)圖2 可以看出,該嵌入式設(shè)備的Bootloader 和用戶程序均存儲(chǔ)在單片機(jī)的片上Flash內(nèi),同時(shí)在主單片機(jī)片上Flash 上留有存儲(chǔ)升級(jí)標(biāo)志的位置。升級(jí)標(biāo)志用于升級(jí)主單片機(jī)程序時(shí)Bootloader 判斷是否需要拷貝升級(jí)文件,Bootloader啟動(dòng)過(guò)程中會(huì)讀取升級(jí)標(biāo)志所在地址的數(shù)據(jù)值,如果升級(jí)標(biāo)志被置位,則Bootloader 會(huì)先把片外Flash上存儲(chǔ)的升級(jí)程序拷貝到用戶程序區(qū),從而完成程序更新。由于本文介紹的場(chǎng)景中從單片機(jī)無(wú)法直接與外部通信,所以兩個(gè)單片機(jī)的Bootloader 功能也做個(gè)差異化處理,以下進(jìn)行詳細(xì)介紹。
圖2 Flash 存儲(chǔ)空間劃分
設(shè)備通過(guò)遠(yuǎn)程通信模組以TCP 連接的方式與遠(yuǎn)方主站建立通信連接,遠(yuǎn)程升級(jí)功能由遠(yuǎn)方主站和嵌入式設(shè)備共同實(shí)現(xiàn)。在遠(yuǎn)方主站操作遠(yuǎn)程升級(jí)時(shí),需要選擇升級(jí)設(shè)備類型、升級(jí)文件以及填寫升級(jí)文件的版本信息。
升級(jí)設(shè)備類型分為主單片機(jī)和從單片機(jī)。主站需要將升級(jí)設(shè)備類型寫入升級(jí)啟動(dòng)報(bào)文下發(fā)給終端,并且主站要通過(guò)設(shè)備類型來(lái)判斷如何抄讀設(shè)備版本信息。如果設(shè)備類型為主單片機(jī),主站將在設(shè)備重新登錄時(shí)抄讀版本信息;如果設(shè)備類型為從單片機(jī),則主站在升級(jí)文件下發(fā)完成后,等待一個(gè)預(yù)先設(shè)定的延時(shí),再使用透抄的方式去抄讀從單片機(jī)版本信息。這個(gè)預(yù)先設(shè)定的延時(shí)大于主單片機(jī)給從單片機(jī)傳輸升級(jí)文件的時(shí)間,可根據(jù)實(shí)際情況設(shè)定。
升級(jí)文件就是所要升級(jí)的設(shè)備對(duì)應(yīng)的升級(jí)程序文件,一般使用的都是bin 格式的二進(jìn)制文件。
升級(jí)文件的版本信息是指升級(jí)包的軟件版本號(hào)、軟件版本日期等,用于同主站抄讀回的設(shè)備軟件版本信息進(jìn)行對(duì)比,以此判斷設(shè)備是否升級(jí)成功。
主單片機(jī)遠(yuǎn)程升級(jí)時(shí),通過(guò)用戶程序接收升級(jí)文件,接收完成后,重啟進(jìn)入Bootloader,由Bootloader 將升級(jí)文件搬運(yùn)到用戶程序區(qū),完成主單片機(jī)程序升級(jí)。主單片機(jī)升級(jí)流程見(jiàn)圖3。
圖3 主單片機(jī)升級(jí)流程
當(dāng)需要升級(jí)主單片機(jī)程序時(shí),遠(yuǎn)方主站通過(guò)無(wú)線網(wǎng)絡(luò)下發(fā)升級(jí)啟動(dòng)報(bào)文,主單片機(jī)通過(guò)升級(jí)啟動(dòng)報(bào)文中的信息判斷需要升級(jí)主單片機(jī)還是從單片機(jī)。確認(rèn)需要升級(jí)主單片機(jī)后,主單片機(jī)先擦除外部Flash 里劃分的主單片機(jī)升級(jí)程序緩存區(qū)數(shù)據(jù),然后將收到的升級(jí)文件數(shù)據(jù)存儲(chǔ)到主單片機(jī)升級(jí)程序緩存區(qū)中。
待升級(jí)文件傳輸完成后,主單片機(jī)寫升級(jí)標(biāo)志到升級(jí)標(biāo)志存儲(chǔ)區(qū),然后主單片機(jī)重啟進(jìn)入Bootloader。
Bootloader 啟動(dòng)時(shí)先讀取升級(jí)標(biāo)志存儲(chǔ)區(qū)的數(shù)據(jù),判斷是否需要升級(jí)用戶程序。當(dāng)Bootloader 讀取到升級(jí)標(biāo)志后,便會(huì)擦除用戶程序區(qū)舊的用戶程序,然后將外部Flash 上存儲(chǔ)的主單片機(jī)升級(jí)程序拷貝到片上Flash 的用戶程序區(qū)。升級(jí)程序拷貝完成后,Bootloader 再擦除升級(jí)標(biāo)志,然后啟動(dòng)到用戶程序。
用戶程序啟動(dòng)后,設(shè)備重新登錄到遠(yuǎn)方主站。當(dāng)遠(yuǎn)方主站接收到升級(jí)設(shè)備登錄后,主動(dòng)讀取設(shè)備軟件版本信息,與升級(jí)前填寫的文件版本信息進(jìn)行比對(duì),如果一致,則認(rèn)為升級(jí)成功,否則認(rèn)為升級(jí)失敗。升級(jí)失敗后主站從下發(fā)升級(jí)啟動(dòng)報(bào)文處嘗試重新升級(jí)。
從單片機(jī)遠(yuǎn)程升級(jí)時(shí),主單片機(jī)負(fù)責(zé)將接收到的升級(jí)文件發(fā)給從單片機(jī),從單片機(jī)的Bootloader負(fù)責(zé)接收升級(jí)文件,完成從單片機(jī)遠(yuǎn)程升級(jí)。
因?yàn)橹挥兄鲉纹瑱C(jī)和主站建立通信連接,所以主站需要采用透抄的方式才能獲取到從單片機(jī)軟件版本信息。此處所說(shuō)的透抄,是主站使用事先約定好的報(bào)文格式給主單片機(jī)發(fā)送透抄報(bào)文,主單片機(jī)收到透抄報(bào)文后,會(huì)將報(bào)文內(nèi)容轉(zhuǎn)發(fā)給從單片機(jī)。從單片機(jī)把要抄讀的數(shù)據(jù)回復(fù)給主單片機(jī),然后主單片機(jī)再把從單片機(jī)回復(fù)的數(shù)據(jù)組幀回復(fù)給主站,從而實(shí)現(xiàn)主站抄讀從單片機(jī)數(shù)據(jù)。從單片機(jī)升級(jí)流程見(jiàn)圖4。
圖4 從單片機(jī)升級(jí)流程
當(dāng)需要升級(jí)從單片機(jī)程序時(shí),遠(yuǎn)方主站通過(guò)無(wú)線網(wǎng)絡(luò)下發(fā)升級(jí)啟動(dòng)報(bào)文,主單片機(jī)通過(guò)升級(jí)啟動(dòng)報(bào)文中的信息判斷需要升級(jí)主單片機(jī)還是從單片機(jī)。確認(rèn)需要升級(jí)從單片機(jī)后,主單片機(jī)先擦除外部Flash 里劃分的從單片機(jī)升級(jí)程序緩存區(qū)數(shù)據(jù),然后將收到的升級(jí)文件數(shù)據(jù)存儲(chǔ)到從單片機(jī)升級(jí)程序緩存區(qū)中。
待升級(jí)文件傳輸完成后,主單片機(jī)給從單片機(jī)發(fā)送切換工作模式命令,讓從單片機(jī)切換到boot 模式,以開(kāi)始升級(jí)。
從單片機(jī)重啟進(jìn)入boot 模式,即進(jìn)入Bootloader 程序運(yùn)行。先擦除從單片機(jī)片上Flash 用戶程序區(qū)原程序數(shù)據(jù),然后響應(yīng)主單片機(jī)模式切換成功。模式切換成功后,主單片機(jī)從外部Flash 里的從單片機(jī)升級(jí)程序緩存區(qū)讀取升級(jí)文件,分多幀將升級(jí)文件發(fā)給從單片機(jī)。從單片機(jī)的Bootloader 負(fù)責(zé)接收主單片機(jī)發(fā)送的升級(jí)文件,并將升級(jí)文件直接寫入從單片機(jī)片上Flash 用戶程序區(qū)。
待升級(jí)文件發(fā)送完成后,主單片機(jī)給從單片機(jī)再次發(fā)送切換工作模式命令,讓從單片機(jī)切換到正常運(yùn)行模式。
由于遠(yuǎn)程升級(jí)從單片機(jī)不會(huì)導(dǎo)致設(shè)備重新登錄遠(yuǎn)方主站,所以升級(jí)從單片機(jī)時(shí)遠(yuǎn)方主站采用延時(shí)抄讀版本信息的方式來(lái)驗(yàn)證升級(jí)結(jié)果。遠(yuǎn)方主站在給設(shè)備下發(fā)完升級(jí)文件后,會(huì)進(jìn)入延時(shí)等待狀態(tài)。此處所設(shè)延時(shí)要大于主單片機(jī)給從單片機(jī)傳輸升級(jí)文件的時(shí)間。待延時(shí)結(jié)束后,遠(yuǎn)方主站透抄從單片機(jī)軟件版本信息,與升級(jí)前填寫的文件版本信息進(jìn)行比對(duì),如果一致,則認(rèn)為升級(jí)成功,否則認(rèn)為升級(jí)失敗。同樣的,升級(jí)失敗后主站從下發(fā)升級(jí)啟動(dòng)報(bào)文處嘗試重新升級(jí)。
上文介紹了整體的遠(yuǎn)程升級(jí)流程,下文將詳細(xì)介紹主站給設(shè)備傳輸文件的詳細(xì)過(guò)程。文件傳輸過(guò)程不可避免的會(huì)由于通信異常、數(shù)據(jù)錯(cuò)誤等原因出現(xiàn)數(shù)據(jù)接收不完整的情況,從而影響傳輸準(zhǔn)確性和傳輸效率。為了解決這一問(wèn)題,本文采用的文件傳輸方式支持?jǐn)帱c(diǎn)續(xù)傳,傳輸出錯(cuò)時(shí)將以最快的速度補(bǔ)全缺失的數(shù)據(jù)塊,保證升級(jí)成功率和升級(jí)效率。為方便描述,這里將遠(yuǎn)方主站稱為啟動(dòng)端,將與主站通信的主單片機(jī)稱為接收端。文件傳輸流程圖見(jiàn)第97 頁(yè)圖5。
圖5 中正常的文件傳輸過(guò)程共分為4 個(gè)步驟,分別是啟動(dòng)升級(jí)、文件傳輸、文件完整性校驗(yàn)以及程序版本校驗(yàn),除此之外還有各個(gè)步驟出現(xiàn)異常后的跳轉(zhuǎn)方式。
圖5 文件傳輸流程
步驟1:?jiǎn)?dòng)端根據(jù)設(shè)置的每幀報(bào)文長(zhǎng)度將升級(jí)文件劃分成多個(gè)數(shù)據(jù)塊,啟動(dòng)端開(kāi)始下發(fā)升級(jí)啟動(dòng)報(bào)文。啟動(dòng)報(bào)文除了通知接收端啟動(dòng)升級(jí)外,還包含升級(jí)文件的特征信息,其中包括文件名、文件大小、文件塊總數(shù)以及文件的校驗(yàn)和信息。接收端在收到升級(jí)啟動(dòng)報(bào)文后,判斷要升級(jí)的設(shè)備類型,是升級(jí)主單片機(jī)還是從單片機(jī),然后擦除Flash 里對(duì)應(yīng)地址范圍的數(shù)據(jù)。同時(shí)保存文件的特征信息,用于接收完成后檢驗(yàn)。
步驟2:?jiǎn)?dòng)端開(kāi)始按設(shè)定大小將文件塊依次發(fā)送給接收端,每幀傳輸報(bào)文中還包含當(dāng)前文件塊序號(hào)。接收端接收到文件塊后,除了存儲(chǔ)文件塊內(nèi)容,還會(huì)記錄接收到的文件塊序號(hào)。
步驟3:當(dāng)所有文件塊下發(fā)完成后,啟動(dòng)端請(qǐng)求接收端返回接收到的文件塊信息,核對(duì)接收端接收到的文件內(nèi)容是否完整。如果接收端接收到了所有文件塊,首先應(yīng)對(duì)接收到的文件進(jìn)行校驗(yàn),如果文件校驗(yàn)和與升級(jí)啟動(dòng)報(bào)文里下發(fā)的校驗(yàn)和一致,接收端將重啟進(jìn)入Bootloader 開(kāi)始更新用戶程序。如果文件校驗(yàn)和不一致,則不會(huì)進(jìn)行后續(xù)程序更新操作。
步驟4:?jiǎn)?dòng)端讀取接收端軟件版本信息,判斷接收端是否升級(jí)成功。
如果步驟1 或步驟2 中由于連接中斷、通信忙碌等原因無(wú)法繼續(xù),則會(huì)進(jìn)入等待階段。待通信恢復(fù)正常后,轉(zhuǎn)到步驟3 執(zhí)行。
如果步驟3 中啟動(dòng)端發(fā)現(xiàn)接收端接收的文件塊不完整,首先判斷是否因步驟2 文件傳輸中斷導(dǎo)致的,如果是則會(huì)返回步驟2,按順序補(bǔ)發(fā)接收端缺失的文件塊。如果不是傳輸中斷則返回步驟1,重新啟動(dòng)升級(jí)。
如果步驟4 啟動(dòng)端讀取接收端軟件版本與升級(jí)文件的軟件版本不一致,認(rèn)為升級(jí)失敗,則返回步驟1 重新啟動(dòng)升級(jí)。
以上文件傳輸方案實(shí)現(xiàn)了支持?jǐn)帱c(diǎn)續(xù)傳的升級(jí),可以大大提高遠(yuǎn)程升級(jí)成功率和升級(jí)效率,避免了由于缺失某個(gè)或某幾個(gè)文件塊而重新開(kāi)始文件傳輸?shù)臒馈?/p>
本文設(shè)計(jì)了一種雙單片機(jī)嵌入式設(shè)備的遠(yuǎn)程升級(jí)方案,詳細(xì)介紹了遠(yuǎn)方主站功能、主/從單片機(jī)升級(jí)流程以及文件傳輸流程,對(duì)于主/從單片機(jī)Bootloader 程序的差異化設(shè)計(jì)、升級(jí)文件的斷點(diǎn)續(xù)傳同樣做了詳細(xì)說(shuō)明。該遠(yuǎn)程升級(jí)技術(shù)同樣可以擴(kuò)展到其他多單片機(jī)或者主從設(shè)備的遠(yuǎn)程升級(jí)場(chǎng)景中,具有廣泛的應(yīng)用前景和較高的使用價(jià)值。