CAN總線(xiàn)分布式嵌入式系統的升級設計
2.3 軟件系統
為實(shí)現在線(xiàn)升級功能,首先需要編寫(xiě)引導程序,然后將它燒入Flash引導區中。為防止應用程序升級失敗,在引導程序中需判斷Flash指定位置是否有程序完好標志,該標志由完整的應用程序在每次上電后寫(xiě)入。應用程序可采用燒寫(xiě)方式和升級方式寫(xiě)入相應程序區。為實(shí)現引導程序和應用程序之間的相互跳轉,采取指向函數指針的方式來(lái)實(shí)現??梢詫lash中的引導程序和應用程序作為兩個(gè)普通函數,這兩個(gè)函數的進(jìn)入位置分別為0x08000000和0x08004000,然后在引導程序中設置一個(gè)指向函數的指針,其指針值為0x08004000;同理,在應用程序中設置一個(gè)函數指針,其值為0x08000000。這樣在相應的程序中調用函數指針時(shí)就可以實(shí)現程序跳轉。
CAN總線(xiàn)采用多主競爭工作方式和非破壞性總線(xiàn)仲裁技術(shù),總線(xiàn)上任意節點(diǎn)可在任意時(shí)刻主動(dòng)地向網(wǎng)絡(luò )上其他節點(diǎn)發(fā)送信息而不分主次,各節點(diǎn)之間實(shí)現自由通信。當多個(gè)節點(diǎn)同時(shí)向總線(xiàn)發(fā)信息時(shí),優(yōu)先級較低的節點(diǎn)會(huì )主動(dòng)退出發(fā)送,而優(yōu)先級較高的節點(diǎn)不受影響,從而大大節省了總線(xiàn)沖突仲裁時(shí)間,即使在網(wǎng)絡(luò )負載很重的情況下,也不會(huì )出現網(wǎng)絡(luò )癱瘓的情況。因此,適用于分布式監控系統的數據通信。由于CAN總線(xiàn)協(xié)議規范只定義了物理層和數據鏈路層,所以在實(shí)際應用中必須根據實(shí)際系統制定合適的應用層協(xié)議。本系統中根據數據傳輸要求自定義了幾個(gè)應用層命令,分別是升級相關(guān)命令和數據收發(fā)校驗相關(guān)命令,限于篇幅在此就不一一詳述。
3 軟件升級過(guò)程
軟件升級包括升級控制模塊部分和待升級模塊部分。
升級控制模塊部分的工作過(guò)程為:向待升級模塊發(fā)送升級命令,待接收到模塊返回的確認標志后,再通過(guò)CAN應用層協(xié)議向待升級模塊發(fā)送升級數據,升級完成后向待升級模塊發(fā)送完成命令。本文引用地址:http://dyxdggzs.com/article/149067.htm
待升級模塊工作流程如圖4所示。分為引導程序部分和應用程序部分,這兩部分內容在開(kāi)發(fā)的時(shí)候是作為兩個(gè)獨立的工程項目來(lái)完成的。
為確保在線(xiàn)升級的安全性,在Flash指定位置設置了一個(gè)程序完好標志。由于Flash的擦寫(xiě)是按照Page進(jìn)行的,所以這個(gè)標志即使只有一位也需占用一個(gè)Page的大小。本系統中將標志設置在Flash最后一個(gè)Page。如果應用程序區沒(méi)有空余的Page來(lái)寫(xiě)入該標志,就要考慮換用更大Flash容量的產(chǎn)品或者外擴存儲器。程序完好標志在應用程序進(jìn)入的時(shí)候寫(xiě)入,在接收到升級命令時(shí)擦除。若在引導程序中檢測該標志不合法,就一直處于升級狀態(tài),直到最后收到升級成功命令為止。
程序跳轉示例性跳轉代碼如下:
typedef void(*pFunc)(vold); //自定義函數指針數據類(lèi)型
pFunc Jump_To_App; //定義一個(gè)指向應用程序的指針
Jump_To_App=(pFunc)0x08004000;
Jump_To_App();
需要注意的是,在程序執行跳轉代碼前,需要關(guān)閉中斷響應,以避免發(fā)生不可預測的異常。同時(shí),當程序跳轉前,需要將堆棧指針設置到相應的程序區域。
結語(yǔ)
通過(guò)CAN總線(xiàn)對分布式嵌入式系統進(jìn)行在線(xiàn)升級非常具有代表性,隨著(zhù)越來(lái)越多的芯片集成了豐富多樣的片上通信外設(如以太端口、I2C總線(xiàn)等),使得嵌入式系統的升級也具有更多樣式,甚至可以通過(guò)公用網(wǎng)絡(luò )(如因特網(wǎng)、GPRS等)進(jìn)行遠程升級。
評論