引言
嵌入式係統具有智能化程度高、體(ti) 積小、可靠性高、實時性強等諸多優(you) 點,已經越來越多地應用於(yu) 消費電子、工業(ye) 控製、汽車電子等各個(ge) 行業(ye) 。往往一個(ge) 大的係統又由許多小的嵌入式係統共同構成,它們(men) 之間通過相互通信協同完成各種檢測控製任務,構成分布式嵌入式係統。汽車電子係統中的車載GPS、倒車雷達、發動機控製、儀(yi) 表盤係統等,數控機床中的鍵盤顯示係統、馬達控製係統等,這些無一不是嵌入式係統的具體(ti) 應用。
眾(zhong) 多嵌入式係統的應用也為(wei) 軟件升級帶來了諸多困難,主要有以下幾點:
①這些係統分處於(yu) 大係統的各個(ge) 位置,單獨對每個(ge) 係統進行升級比較困難;
②某些係統為(wei) 了滿足保密和可靠性的要求,對係統進行了永久密封,隻預留了通信和電源端口,這就更不可能單獨對它進行升級。
針對這些問題,本文提出一種利用CAN總線的分布式嵌入式係統升級方案,實現了多點、單點甚至全係統的升級,其他種類的通信端口與(yu) 此類似。
1 係統架構
係統結構框圖如圖1所示。
整個(ge) 係統由多個(ge) 獨立的完成一定功能的嵌入式模塊、CAN總線和一個(ge) 用於(yu) 對整個(ge) 係統進行升級的控製模塊組成。其中,控製模塊也可以是其中一個(ge) 功能模塊。在每個(ge) 功能模塊上安裝有獨立的引導程序,可以看作該模塊的Bootloader,該引導程序永久固化在模塊內(nei) ,不隨程序升級而升級。在該引導程序中嵌入CAN總線通信程序。正常工作情況下每個(ge) 功能模塊單獨或通過CAN總線與(yu) 其他模塊協同工作。當需要對某個(ge) 模塊進行軟件升級時,通過係統升級控製模塊向該模塊發送升級命令,該模塊接收到命令後即跳轉至引導程序,並等待係統升級模塊發送升級數據,升級結束後再跳回至應用程序。
2 係統實現
2.1 在線升級的實現原理
采用ST公司基於(yu) ARM Cortex-M3核心的32位嵌入式處理器STM32F103VC,其片上Flash為(wei) 主存儲(chu) 區。應用程序代碼是存儲(chu) 在閃存(Flash)中的(0x0800C3000~0x0807FFFF),而Flash是按Page來管理的,所以可以把Flash分成幾個(ge) 區域來使用。在本係統中將Flash分成兩(liang) 個(ge) 區域,其中一個(ge) 為(wei) 前麵提到的引導程序區,另外一個(ge) 為(wei) 應用程序區。Flash分區如圖2所示。
圖2 Flash分區
芯片上電後,STM32F103VC會(hui) 自動跳轉到0x08000000地址執行後麵的程序。而一個(ge) 工程的起始位置(也就是main函數的地址)具體(ti) 映射到Flash的地址是可以設置的。在本係統的設計中,在Flash放了兩(liang) 個(ge) main函數。引導程序用於(yu) 對應用程序的升級和上電後跳轉至應用程序,應用程序則完成相應的模塊功能。這兩(liang) 個(ge) 區域通過特定的指令可以實現相互的跳轉,並以此實現在線升級。
2.2 硬件係統
STM32F103VC處理器具有高性能、低成本、低功耗等特點。該處理器片上外設豐(feng) 富,具有多個(ge) 係統定時器、CAN通信接口、USART通信接口、DMA等豐(feng) 富的資源,並且借助於(yu) ST公司提供的固件庫,可以很容易地對係統資源進行操作。該處理器集成了256 KB片上Flash和64KB片上SRAM,足以應對大多數任務。為(wei) 實現CAN總線通信,隻需要為(wei) STM32F103VC添加一片CAN驅動芯片進行電平轉換。
係統硬件結構框圖如圖3所示。
2.3 軟件係統
為(wei) 實現在線升級功能,首先需要編寫(xie) 引導程序,然後將它燒入Flash引導區中。為(wei) 防止應用程序升級失敗,在引導程序中需判斷Flash指定位置是否有程序完好標誌,該標誌由完整的應用程序在每次上電後寫(xie) 入。應用程序可采用燒寫(xie) 方式和升級方式寫(xie) 入相應程序區。為(wei) 實現引導程序和應用程序之間的相互跳轉,采取指向函數指針的方式來實現。可以將Flash中的引導程序和應用程序作為(wei) 兩(liang) 個(ge) 普通函數,這兩(liang) 個(ge) 函數的進入位置分別為(wei) 0x08000000和0x08004000,然後在引導程序中設置一個(ge) 指向函數的指針,其指針值為(wei) 0x08004000;同理,在應用程序中設置一個(ge) 函數指針,其值為(wei) 0x08000000.這樣在相應的程序中調用函數指針時就可以實現程序跳轉。
CAN總線采用多主競爭(zheng) 工作方式和非破壞性總線仲裁技術,總線上任意節點可在任意時刻主動地向網絡上其他節點發送信息而不分主次,各節點之間實現自由通信。當多個(ge) 節點同時向總線發信息時,優(you) 先級較低的節點會(hui) 主動退出發送,而優(you) 先級較高的節點不受影響,從(cong) 而大大節省了總線衝(chong) 突仲裁時間,即使在網絡負載很重的情況下,也不會(hui) 出現網絡癱瘓的情況。因此,適用於(yu) 分布式監控係統的數據通信。由於(yu) CAN總線協議規範隻定義(yi) 了物理層和數據鏈路層,所以在實際應用中必須根據實際係統製定合適的應用層協議。本係統中根據數據傳(chuan) 輸要求自定義(yi) 了幾個(ge) 應用層命令,分別是升級相關(guan) 命令和數據收發校驗相關(guan) 命令,限於(yu) 篇幅在此就不一一詳述。
3 軟件升級過程
軟件升級包括升級控製模塊部分和待升級模塊部分。
升級控製模塊部分的工作過程為(wei) :向待升級模塊發送升級命令,待接收到模塊返回的確認標誌後,再通過CAN應用層協議向待升級模塊發送升級數據,升級完成後向待升級模塊發送完成命令。
待升級模塊工作流程如圖4所示。分為(wei) 引導程序部分和應用程序部分,這兩(liang) 部分內(nei) 容在開發的時候是作為(wei) 兩(liang) 個(ge) 獨立的工程項目來完成的。
為(wei) 確保在線升級的安全性,在Flash指定位置設置了一個(ge) 程序完好標誌。由於(yu) Flash的擦寫(xie) 是按照Page進行的,所以這個(ge) 標誌即使隻有一位也需占用一個(ge) Page的大小。本係統中將標誌設置在Flash最後一個(ge) Page.如果應用程序區沒有空餘(yu) 的Page來寫(xie) 入該標誌,就要考慮換用更大Flash容量的產(chan) 品或者外擴存儲(chu) 器。程序完好標誌在應用程序進入的時候寫(xie) 入,在接收到升級命令時擦除。若在引導程序中檢測該標誌不合法,就一直處於(yu) 升級狀態,直到最後收到升級成功命令為(wei) 止。
程序跳轉示例性跳轉代碼如下:
typedef void(*pFunc)(vold); //自定義(yi) 函數指針數據類型
pFunc Jump_To_App; //定義(yi) 一個(ge) 指向應用程序的指針
Jump_To_App=(pFunc)0x08004000;
Jump_To_App();#p#分頁標題#e#
需要注意的是,在程序執行跳轉代碼前,需要關(guan) 閉中斷響應,以避免發生不可預測的異常。同時,當程序跳轉前,需要將堆棧指針設置到相應的程序區域。
結語
通過CAN總線對分布式嵌入式係統進行在線升級非常具有代表性,隨著越來越多的芯片集成了豐(feng) 富多樣的片上通信外設(如以太端口、I2C總線等),使得嵌入式係統的升級也具有更多樣式,甚至可以通過公用網絡(如因特網、GPRS等)進行遠程升級。
轉載請注明出處。







相關文章
熱門資訊
精彩導讀



















關注我們

