ARM和GPRS相配合的軟件無線升級系統
int __main(void)
② 對片內Flash進行初始化操作。
void FLASH_Init(void)
③ 從第二扇區算起,計算代碼需要的扇區數。
u32 FLASH_SectorMask(vu32 Size)
④ 將新代碼需要的扇區去掉寫保護,為扇區擦除做準備。
void FLASH_WritePrConfig(u32 Xsectors,FunctionalState NewState)
⑤ 將新代碼需要的扇區進行擦除,為寫做準備。
void FLASH_SectorErase(u32 Xsectors)
⑥ 將新代碼寫入Flash扇區中。
void FLASH_WordWrite(u32 XtargetAdd,u32 Xdata)
2.2.2 終端應用程序設計
終端應用程序設定的起始地址是STR710Z2T6的0x40004000處,并可占用之后的整個Flash空間。終端應用程序不但完成日常各項工作任務,而且還負責接收監控中心服務器發送的應用程序升級命令。當收到升級命令后,終端回應服務器此時若接收升級代碼,則應用程序將升級包按照幀的方式通過GPRS模塊從服務器下載到終端,通過校驗后保存到終端外部Flash存儲器SST39VF1601中,下載成功后置位升級標志和記錄升級包版本號以備引導程序升級。由于升級包的下載過程可看成是數據傳輸過程,應用程序可在下載升級包的同時進行其他任務,且不影響終端的正常工作。當終端應用程序下載完升級包之后,應用程序對必要的現場進行保存然后主動復位,微控制器啟動之后直接執行引導程序,并進行Flash編程。由于很多系統終端日常任務繁多,可通過程序中相應的設置,使新代碼下載和Flash編程盡量選擇在終端可能空閑的時間段,從而盡可能地減少升級應用程序對終端正常工作的影響。
3 通信協議的設計
參照通信規約和已存在的無線配電監控系統的協議,本文定義了3種類型的協議幀:服務器請求升級幀、升級代碼數據幀和終端回應幀。
協議幀公共數據段:
服務器請求升級幀幀格式如下:
升級代碼數據幀幀格式如下:
終端回應幀幀格式如下:
通信幀部分數據段說明:
① 數據長度。表示數據域的字節數(由2字節構成),為0時表示無數據,其值為此數據段到校驗和之前的數據字節數之和。
② 升級軟件版本號。無線監控系統終端收到升級請求幀之后,將此數據段和其本身的軟件版本進行比較。如果版本號小于將要升級的軟件版本,終端將回應服務器同意升級,否則放棄升級。
③ 升級文件長度。用來判斷存儲空間夠不夠存放將要升級的文件,以及升級代碼是否傳輸完畢[4]。
4 終端編程注意事項
(1) 編程代碼大小。IAP編程是用戶的IAP代碼對片內Flash存儲器進行擦除/編程的過程。由于片內Flash存儲空間的限制以及代碼存儲空間的限定,編程時不但需要控制IAP自身代碼量的大小,而且還要控制終端應用程序代碼的大小,絕對不能夠超出所指定的存儲范圍。
(2) 提高遠程升級速度的措施。為了提高系統遠程升級的速度,在代碼傳輸過程本文采取3種措施:
① 數據壓縮。數據壓縮是解決由于數據大而導致整個下載過程時間長問題的最有效的辦法,本系統中服務器將升級代碼進行壓縮,終端設備接收到之后進行解壓、存儲。由于應用程序的代碼滿足ARM指令集的特征,所以壓縮效率較高。
② 應用程序分塊加載。在日常系統維護中,無論對系統進行升級或是修改程序中的“bug”,其實修改的只是程序中的一小部分,而大部分程序還保持原樣。因此,合理的方法是只把修改的代碼,而不是把整個二進制文件下載到遠程終端。具體的實現辦法是,建立分散文件,在其中按功能將應用程序劃分為多個裝載區,并為每個裝載區留有足夠大的空間,為以后的升級、修改做準備。這種做法大大減小了數據傳輸量,提高了軟件升級速度。
③ 小數據塊傳輸。由于系統采用錯誤重傳機制,根據實際應用經驗,數據塊越大出現錯誤的機率就越大;同時,由于數據塊大,傳輸一幀的速率較低,雖然接收到的數據幀較大,但由于錯誤的機率和傳輸的速率,反而造成效率低下。采用小數據塊傳輸,雖然一幀數據塊小,但彌補了上述不足。
(3) 遠程通信的誤碼處理。程序代碼傳輸過程中,終端校驗數據正確后存入SST39VF1601,檢驗錯誤時向服務器返回錯誤的編碼和幀序號并請求重發,直到檢測到結束幀為止。服務器發送最后一幀時,如果該幀的數據長度不夠,用00填充直到滿足協議中規定的長度。對于數據傳輸過程中產生的誤碼,系統采用最有效的解決辦法是CRC循環冗余效驗和重傳機制。
(4) 相同的存儲區,不同的運行區域。由于需要對Flash進行編程,但是對Flash操作的代碼不能在Flash本身運行,因此這部分代碼必須在內部RAM中運行。可以通過分散加載文件設置函數的運行空間。
(5) 用戶中斷。在系統中IAP程序燒寫在從0x00000000開始的兩個Flash扇區內,而用戶程序則是存儲在從0x40004000開始的Flash空間中。如果用戶程序產生中斷,那么內核會讀取到IAP的向量表,導致程序跑飛。解決辦法是,在跳轉到用戶程序之前,IAP程序把用戶程序的向量表拷貝到片內RAM中,然后將RAM重映射到0x00000000地址,最后進行跳轉,這樣就可以保證0x00000000地址有用戶程序的向量表。
由于RAM的起始地址用來存放用戶程序的中斷向表,往其中寫入數據時,需保證這些向量表不被覆蓋,故IAP程序、用戶程序的RW base使用的是0x20000100[5]。
結語
本文利用ARM微控制器和GPRS模塊,提出了一種解決無線監控系統終端軟件升級和維護困難問題的方案。相信在未來通信方式更加先進、微控制器性能更加優越的基礎上,軟件無線升級技術的應用會越來越廣泛。
存儲器相關文章:存儲器原理
晶振相關文章:晶振原理
評論