車(chē)載終端的功能應(yīng)當(dāng)隨著用戶的需求而變化,因此車(chē)載終端的升級(jí)維護(hù)也顯得越來(lái)越重要。然而,目前大部分車(chē)載終端還不具有遠(yuǎn)程升級(jí)的功能,必須在現(xiàn)場(chǎng)通過(guò)預(yù)留的通信口下載更新程序才能升級(jí),升級(jí)維護(hù)相對(duì)比較困難而且也增加了成本。針對(duì)這樣的情況,本文提出了一種具有可行性的遠(yuǎn)程升級(jí)解決方案。監(jiān)控中心只需要發(fā)送一條遠(yuǎn)程升級(jí)指令給車(chē)載終端,車(chē)載終端就能自動(dòng)的更新自身的固件程序,簡(jiǎn)單方便而且安全可靠,還可以讓所有的車(chē)輛同時(shí)升級(jí)。
1.遠(yuǎn)程升級(jí)的基本原理
1.1 lAP簡(jiǎn)介
lAP(In Application Programming)是用戶自己的程序在運(yùn)行過(guò)程中對(duì)內(nèi)部Flash的部分代碼區(qū)域重新燒寫(xiě)。要實(shí)現(xiàn)lAP功能需要在設(shè)計(jì)固件程序時(shí)編寫(xiě)兩個(gè)項(xiàng)目代碼,第一個(gè)項(xiàng)目代碼為BootLOAder程序,第二項(xiàng)目代碼為UserApp程序,即用戶功能程序。BootLoader程序不執(zhí)行正常的功能操作,只執(zhí)行對(duì)第二部分代碼的更新;UserApp程序才是真正的功能代碼,這兩部分項(xiàng)目代碼都同時(shí)燒錄在內(nèi)部Flash中。
1.2 遠(yuǎn)程升級(jí)的基本原理
遠(yuǎn)程升級(jí)有兩種模式,主動(dòng)模式和被動(dòng)模式。主動(dòng)模式是指車(chē)載終端自動(dòng)檢測(cè)是否有新版本的程序需要更新,被動(dòng)模式是指監(jiān)控中心給車(chē)載終端下發(fā)升級(jí)指令后車(chē)載終端才執(zhí)行遠(yuǎn)程升級(jí)操作。本課題中,使用的是被動(dòng)模式。車(chē)載終端收到監(jiān)控中心發(fā)送的遠(yuǎn)程升級(jí)指令后,連接遠(yuǎn)程FTP服務(wù)器,建立連接后下載要更新的程序代碼,同時(shí)將其寫(xiě)入車(chē)載終端的外部flash中,更新程序代碼下載完畢后,對(duì)其進(jìn)行校驗(yàn),校驗(yàn)通過(guò)后,自動(dòng)重啟終端進(jìn)入BootLoader模式,利用lAP技術(shù)重新燒寫(xiě)User-App程序代碼區(qū)域。燒寫(xiě)完畢后,跳轉(zhuǎn)到新的UserAPP程序執(zhí)行,然后給監(jiān)控中心發(fā)送遠(yuǎn)程升級(jí)成功指令?梢杂脠D1形象地表示遠(yuǎn)程升級(jí)的過(guò)程。
圖1 遠(yuǎn)程升級(jí)的過(guò)程
2.遠(yuǎn)程升級(jí)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
2.1 車(chē)載終端的硬件結(jié)構(gòu)
車(chē)載終端硬件結(jié)構(gòu)如圖2,這里只介紹與遠(yuǎn)程升級(jí)相關(guān)的模塊,核心處理器使用ST公司的STM32系列MCU,該系列MCU支持IAP編程技術(shù),外圍無(wú)線通信GPRS模塊使用SIMCOM公司SIM900A,SIM900A的最新軟件版本可以支持FTP協(xié)議,外部大容量存儲(chǔ)器。
圖2 車(chē)載終端硬件結(jié)構(gòu)簡(jiǎn)圖
2.2 Flash空間劃分
2.2.1 內(nèi)部Flash空間劃分
STM32的內(nèi)部Flash地址起始于0x08000000,一般情況下,程序文件從此地址開(kāi)始寫(xiě)入。STM32是基于ARM CortexM3內(nèi)核的微控制器,其內(nèi)部通過(guò)一張“中斷向量表”來(lái)響應(yīng)中斷,程序啟動(dòng)后首先從0x08000004地址取出復(fù)位中斷向量的地址,并跳轉(zhuǎn)到復(fù)位中斷服務(wù)程序,如圖標(biāo)號(hào)①所示;在復(fù)位中斷服務(wù)程序執(zhí)行完之后,會(huì)跳轉(zhuǎn)到我們的main函數(shù),如圖標(biāo)號(hào)②所示;而main函數(shù)一般都是一個(gè)死循環(huán)。在main函數(shù)執(zhí)行過(guò)程中,如果收到中斷請(qǐng)求,此時(shí)STM32強(qiáng)制將PC指針指回中斷向量表處,如圖標(biāo)號(hào)示;然后,根據(jù)中斷源進(jìn)入相應(yīng)的中斷服務(wù)程序,如圖標(biāo)號(hào)④所示;在執(zhí)行完中斷服務(wù)程序以后,程序再次返回main函數(shù)執(zhí)行,如圖標(biāo)號(hào)⑤所示。整個(gè)過(guò)程如圖3所示。
圖3 STM32程序運(yùn)行流程圖
BootLoader程序也有自己獨(dú)立的中斷向量表、中斷處理例程和主循環(huán)程序,在Flash中加入BootLoade程序后各個(gè)程序的地址分配如圖4,其中M為UserApp程序中斷向量表的偏移量,(0x08000000+M)為UserApp程序的起始地址。
圖4 BootLoade程序UserApp程序地址分配圖
2.2.2 外部Flash空間劃分
外部Flash空間大小為1MB,一共分成16個(gè)扇區(qū),每個(gè)扇區(qū)64KB,遠(yuǎn)程升級(jí)使用其中的4個(gè)扇區(qū),這4個(gè)扇區(qū)又劃分為兩部分,前兩個(gè)扇區(qū)作為更新代碼區(qū),后兩個(gè)扇區(qū)作為備份代碼區(qū)。每一次代碼更新成功后都會(huì)將更新代碼區(qū)的程序拷貝到備份代碼區(qū),也就是說(shuō)備份代碼區(qū)始終保留的是終端最近一次更新成功的代碼。
2.3 FTP遠(yuǎn)程文件下載
監(jiān)控中心給終端下發(fā)遠(yuǎn)程升級(jí)指令的同時(shí)會(huì)將FTP服務(wù)器的IP、端口號(hào)、用戶名、密碼、更新程序的文件名稱(chēng)和路徑發(fā)送到終端,終端根據(jù)這些參數(shù)通過(guò)AT指令配置GPRS模塊,然后連接到FTP服務(wù)器,連接成功后請(qǐng)求下載更新程序文件。由于更新程序文件大小一般為幾十KB,最大不會(huì)超過(guò)100K。而FTP一次請(qǐng)求不超過(guò)1460B,因此需不斷地發(fā)送請(qǐng)求,直到?jīng)]有數(shù)據(jù)可返回為止。所有的更新程序都會(huì)暫存在外部Flash的更新代碼區(qū)。圖5表示了這樣一個(gè)過(guò)程。
圖5 FTP遠(yuǎn)程文件下載流程圖
另外,遠(yuǎn)程升級(jí)系統(tǒng)可以自適應(yīng)網(wǎng)絡(luò),根據(jù)網(wǎng)絡(luò)的狀態(tài)調(diào)整數(shù)據(jù)下載的速度。終端和FTP服務(wù)器建立連接后,相當(dāng)于建立一條數(shù)據(jù)鏈路,監(jiān)控中心給終端反饋該鏈路的數(shù)據(jù)容量,終端依此調(diào)整請(qǐng)求數(shù)據(jù)下載的速度,以平衡網(wǎng)絡(luò)負(fù)荷,提高數(shù)據(jù)下載的可靠性。
2.4 lAP編程的實(shí)現(xiàn)
STM32有一個(gè)Flash編程和擦除控制器(FPEC),F(xiàn)PEC模塊是一個(gè)寄存器組用以處理Flash的編程和擦除操作。每次復(fù)位后,F(xiàn)PEC模塊是被上鎖的,需要向FPEC模塊控制寄存器寫(xiě)入一組鍵值序列keyl和key2才可以解鎖,解鎖后可以操作其他寄存器。為了防止對(duì)用戶代碼區(qū)的非法訪問(wèn),通常Flash的頁(yè)(每頁(yè)的大小為2KB)是加以保護(hù)的,試圖在受保護(hù)的頁(yè)面進(jìn)行編程都會(huì)在FPEC模塊中返回一個(gè)保護(hù)錯(cuò)誤標(biāo)志。
lAP編程的對(duì)象主要是UserApp代碼區(qū)域,在編程前必須先根據(jù)UserApp代碼區(qū)域的起始地址和代碼大小計(jì)算出要編程的區(qū)域在flash中的開(kāi)始和結(jié)束頁(yè)號(hào),然后判斷這些頁(yè)號(hào)是否在受保護(hù)的區(qū)域內(nèi),在去除保護(hù)后將這些頁(yè)統(tǒng)一擦除然后再進(jìn)行編程。由于要更新的程序存儲(chǔ)在外部Flash中,因此在運(yùn)行l(wèi)AP程序時(shí),需要在內(nèi)存開(kāi)辟緩存,將外部Flash的代碼讀到緩存中,然后再燒寫(xiě)到Flash UserApp代碼區(qū)。STM32是以半字(2個(gè)字節(jié))的方式對(duì)Flash進(jìn)行編程的,每寫(xiě)入半字后都要從Flash相同的地址再讀出這半字,如果讀出來(lái)的值跟寫(xiě)入的值相同,則繼續(xù)寫(xiě)入下個(gè)半字,否則重寫(xiě)這半個(gè)字,這種情況基本不會(huì)出現(xiàn),但是為了萬(wàn)無(wú)一失,在編寫(xiě)程序時(shí)還是加了這種判斷。在燒寫(xiě)完整個(gè)UserApp程序后,需要將編程過(guò)的頁(yè)重新設(shè)為寫(xiě)保護(hù),然后再將FPEC模塊上鎖。lAP編程的整個(gè)過(guò)程可以用圖6來(lái)表示。
圖6 lAP編程的過(guò)程
2.5 遠(yuǎn)程升級(jí)的可靠性
對(duì)于車(chē)載終端來(lái)說(shuō),可靠性永遠(yuǎn)都是最重要的。遠(yuǎn)程升級(jí)屬于危險(xiǎn)系數(shù)比較高的一個(gè)操作,因此需要對(duì)造成遠(yuǎn)程升級(jí)失敗的各種情況做分析,并制定好解決方案,以確保升級(jí)的可靠性。下面就具體地分析,在目前的技術(shù)條件下遠(yuǎn)程升級(jí)過(guò)程中可能會(huì)出現(xiàn)的一些不穩(wěn)定因素。
1)網(wǎng)絡(luò)不穩(wěn)定,文件下載一半就中斷了。這種情況是可能存在的,大部分車(chē)載終端使用的是GPRS網(wǎng)絡(luò),GPRS網(wǎng)絡(luò)并沒(méi)有覆蓋到每一個(gè)地方,特別是在山區(qū),中繼站的密度相對(duì)較小,那么離中繼站比較遠(yuǎn)的地方信號(hào)比較弱甚至沒(méi)有信號(hào),此時(shí)FTP連接最容易斷開(kāi),造成文件下載失敗。如果FTP連接斷開(kāi),終端是可以檢測(cè)到了,如果終端檢測(cè)到這種情況,會(huì)保存已經(jīng)下載的文件數(shù)據(jù),然后重新建立連接,請(qǐng)求下載余下的部分,如果連續(xù)幾次都失敗,就認(rèn)為本次升級(jí)失敗,然后將升級(jí)失敗的情況報(bào)告給監(jiān)控中心。
2)下載的更新文件中部分內(nèi)容出現(xiàn)錯(cuò)誤或丟失其中某些內(nèi)容。雖然FTP協(xié)議是一種建立連接的可靠協(xié)議,但是誤碼率并不是絕對(duì)的零。因此我們假設(shè)這種情況是存在的,當(dāng)一個(gè)更新文件下載完畢后根據(jù)約定的規(guī)則會(huì)對(duì)文件進(jìn)行校驗(yàn),如果校驗(yàn)結(jié)果與從監(jiān)控中心收到的校驗(yàn)信息不同,則認(rèn)為下載的更新文件有錯(cuò)誤,丟棄更新文件然后重新下載。另外GPRS模塊和MCU是通過(guò)串口通信的,在升級(jí)過(guò)程中必須將該串口置于最高優(yōu)先級(jí),否則下載的更新文件極易在串口傳輸中丟失某些字節(jié)造成升級(jí)失敗。
3)在lAP編程的過(guò)程中出現(xiàn)錯(cuò)誤。如果在lAP編程過(guò)程中出現(xiàn)錯(cuò)誤,新的UserAPP程序是不能正常的運(yùn)行的,在跳轉(zhuǎn)到UserAPP程序執(zhí)行之前看門(mén)狗是打開(kāi)的,如果UserAPP不能正常運(yùn)行,則不能執(zhí)行喂狗操作,在喂狗時(shí)間到后系統(tǒng)就會(huì)自動(dòng)重啟進(jìn)入BootLoader程序,在BootLoader程序中可以檢測(cè)到上一次更新失敗,然后會(huì)重新執(zhí)行l(wèi)AP編程操作,如果連續(xù)幾次升級(jí)失敗,說(shuō)明更新程序有問(wèn)題,最后BootLoader程序會(huì)加載備份程序代碼,將系統(tǒng)恢復(fù)到升級(jí)之前的狀態(tài)。
2.6 遠(yuǎn)程升級(jí)系統(tǒng)的總體實(shí)現(xiàn)
2.6.1 遠(yuǎn)程升級(jí)系統(tǒng)的總體實(shí)現(xiàn)
FTP遠(yuǎn)程文件下載,lAP編程這兩個(gè)部分實(shí)現(xiàn)后,再加入對(duì)遠(yuǎn)程升級(jí)系統(tǒng)可能出現(xiàn)的意外情況的處理,那么整個(gè)遠(yuǎn)程升級(jí)系統(tǒng)基本就實(shí)現(xiàn)了。圖7,表示出遠(yuǎn)程升級(jí)系統(tǒng)的總體實(shí)現(xiàn)過(guò)程。
圖7 遠(yuǎn)程升級(jí)系統(tǒng)的總體實(shí)現(xiàn)流程圖
2.6.2 遠(yuǎn)程升級(jí)系統(tǒng)的測(cè)試
以上分析過(guò)3種可能導(dǎo)致遠(yuǎn)程升級(jí)失敗的情況,除了第三種情況沒(méi)有辦法模擬,分別模擬了第一種和第二種情況。第一種情況,遠(yuǎn)程升級(jí)過(guò)程中,主動(dòng)斷開(kāi)FTP服務(wù)器的網(wǎng)絡(luò),那么終端必定不會(huì)下載到完整的更新程序,造成更新失敗,測(cè)試結(jié)果如表1。
表1 升級(jí)過(guò)程中斷開(kāi)FTP服務(wù)器網(wǎng)絡(luò)
第二種情況,預(yù)先生成更新文件的校驗(yàn)信息,傳送給終端,然后隨機(jī)將更薪程序文件中某些字節(jié)去掉,終端下載的是不完整的更新程序,必定校驗(yàn)通不過(guò),造成升級(jí)失敗,測(cè)試結(jié)果如表2。
表2 更新程序文件部分字節(jié)丟失
最后測(cè)試了在網(wǎng)絡(luò)良好的條件下的升級(jí)情況,一共測(cè)試了50次,每一次升級(jí)過(guò)程都在兩分鐘完成,沒(méi)有失敗的情況,測(cè)試結(jié)果如表3,因此這樣的升級(jí)系統(tǒng)是安全可靠的。
表3 網(wǎng)絡(luò)良好條件下測(cè)試
3.結(jié)束語(yǔ)
經(jīng)過(guò)多次測(cè)試,該升級(jí)系統(tǒng)具有比較高的可靠性。未來(lái)隨著3G網(wǎng)絡(luò)的普及,車(chē)載終端無(wú)線通信模塊若使用3G模塊,該升級(jí)系統(tǒng)也是同樣適用的。
核心關(guān)注:拓步ERP系統(tǒng)平臺(tái)是覆蓋了眾多的業(yè)務(wù)領(lǐng)域、行業(yè)應(yīng)用,蘊(yùn)涵了豐富的ERP管理思想,集成了ERP軟件業(yè)務(wù)管理理念,功能涉及供應(yīng)鏈、成本、制造、CRM、HR等眾多業(yè)務(wù)領(lǐng)域的管理,全面涵蓋了企業(yè)關(guān)注ERP管理系統(tǒng)的核心領(lǐng)域,是眾多中小企業(yè)信息化建設(shè)首選的ERP管理軟件信賴(lài)品牌。
轉(zhuǎn)載請(qǐng)注明出處:拓步ERP資訊網(wǎng)http://www.oesoe.com/
本文標(biāo)題:車(chē)載終端遠(yuǎn)程升級(jí)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
本文網(wǎng)址:http://www.oesoe.com/html/support/11121513206.html