0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于IAP的嵌入式系統(tǒng)升級(jí)方案

西西 ? 來源:f ? 作者:電子發(fā)燒友網(wǎng) ? 2019-01-01 08:40 ? 次閱讀

一、 需求引入

現(xiàn)有嵌入式設(shè)備:基于ARM Cortex-M3處理器、帶以太網(wǎng)通訊功能。為降低設(shè)備維護(hù)成本節(jié)省寶貴的時(shí)間和金錢,需要設(shè)計(jì)網(wǎng)口升級(jí)固件功能。

本文描述了基于IAP和網(wǎng)口升級(jí)該嵌入式系統(tǒng)的方法,其中處理器為NXP公司的ARM Cortex-M3,開發(fā)環(huán)境為IAR Embedded Workbench for ARM。

IAP( In Applicatin Programming)在應(yīng)用編程,一般指MCU可以通過通信端口UART口、網(wǎng)口等)從外部接收應(yīng)用程序鏡像并燒錄到FLASH中實(shí)現(xiàn)固件升級(jí)。

基于IAP的嵌入式系統(tǒng)升級(jí)方案

圖1網(wǎng)口升級(jí)固件

二、 原理介紹

先溫習(xí)下小知識(shí):一個(gè)典型的嵌入式軟件地址空間如圖2所示,程序代碼(RO段)和初始化數(shù)據(jù)(RW段)都是存儲(chǔ)在ROM(常見為FLASH)中,當(dāng)系統(tǒng)上電運(yùn)行時(shí),BootLoader程序會(huì)把RW段數(shù)據(jù)從ROM中拷貝到RAM中(.data),同時(shí)它會(huì)清零未初始化數(shù)據(jù)段(.bss),設(shè)置棧(.stack)和堆(.heap),之后系統(tǒng)就可以正常運(yùn)行了。

這里會(huì)有2個(gè)疑問:為什么要拷貝RW段呢?還有BootLoader程序是什么?第一個(gè)問題很簡單,既然是RW(Read&Write)數(shù)據(jù),那就只能保存在RAM中,因?yàn)镽OM是無法執(zhí)行“寫數(shù)據(jù)”的操作。第二個(gè)問題很容易讓程序員忽視,它的實(shí)現(xiàn)有2種,一種是由芯片的Boot代碼(固化在ROM中)來執(zhí)行拷貝,另一種是由編譯器自帶的代碼(如IAR就有__iar_program_start函數(shù))

基于IAP的嵌入式系統(tǒng)升級(jí)方案

圖2軟件地址空間

基于IAP固件升級(jí)一般會(huì)把軟件設(shè)計(jì)成2部分:BOOT和應(yīng)用程序,其中BOOT相當(dāng)于PC機(jī)的BIOS負(fù)責(zé)升級(jí)固件和引導(dǎo)應(yīng)用程序,它對于用戶是不可見的;應(yīng)用代碼就是常見的嵌入式軟件。這2個(gè)軟件的存儲(chǔ)如圖3所示:

基于IAP的嵌入式系統(tǒng)升級(jí)方案

圖3存儲(chǔ)地址視圖

我們再一起來看看BOOT和APP啟動(dòng)時(shí)序。當(dāng)系統(tǒng)上電時(shí),它首先從0地址找到中斷向量表,取出Reset_Handler中斷服務(wù)代碼,該代碼先初始化芯片(如PLL和中斷寄存器),然后調(diào)用BootLoader代碼執(zhí)行搬運(yùn)工作,把存儲(chǔ)空間布置成圖2右邊的“運(yùn)行地址視圖”,之后跳轉(zhuǎn)到用戶代碼的main()函數(shù),此時(shí)BOOT軟件啟動(dòng)完成。

BOOT代碼開始檢測是否需要升級(jí)固件,如果需要就從外部取APP鏡像文件并燒錄FLASH,最后一步都是啟動(dòng)APP軟件。

那么BOOT代碼如何啟動(dòng)APP代碼呢?其實(shí)很簡單,因?yàn)锳PP代碼它自身包含中斷向量表和BootLoader代碼,BOOT代碼只需要告訴MCU新的中斷向量表地址,然后跳轉(zhuǎn)到APP代碼區(qū)。之后,APP的BootLoader會(huì)把自己的RW數(shù)據(jù)搬運(yùn)到RAM中,同樣也會(huì)布置存儲(chǔ)空間如圖2右邊所示,最終跳轉(zhuǎn)到APP代碼的用戶main()函數(shù),這樣APP代碼完成了啟動(dòng)。

三、 IAP關(guān)鍵技術(shù)

首先,APP代碼需要將程序地址重定向,在本例中需要把代碼地址重定向到0x0001 0000。為什么要執(zhí)行如此操作呢?我們看一個(gè)實(shí)例,假設(shè)代碼中有調(diào)用f1(),如果沒有執(zhí)行重定向,那么f1()可能被鏈接器分配在0x1234,當(dāng)PC寄存器導(dǎo)入該地址并解析指令執(zhí)行時(shí),致命的錯(cuò)誤發(fā)生了——該地址根本沒有f1()代碼,因?yàn)锳PP代碼是從0x0001 0000開始存儲(chǔ)的。重定向就是告訴鏈接器,請從0x0001 0000開始定位程序代碼,這樣在本例中f1()將分配在0x0001 1234,才能正確調(diào)用f1()。

在IAR環(huán)境下程序空間重定向操作如下:打開“Options”-》“Linker”-》“Config”,點(diǎn)擊“Edit”,在彈出的窗口中設(shè)置如圖4所示地址空間。

基于IAP的嵌入式系統(tǒng)升級(jí)方案

圖4鏈接器重定向代碼地址

然后,BOOT代碼在使用外設(shè)后,一定要De-Initialize該外設(shè)再啟動(dòng)APP代碼,即要讓APP代碼認(rèn)為MCU只是剛上電運(yùn)行,而不是跑完一個(gè)系統(tǒng)再調(diào)用自己。如果BOOT代碼沒有執(zhí)行該動(dòng)作,當(dāng)APP代碼運(yùn)行時(shí),MCU的外設(shè)處于不確定狀態(tài)(尤其是中斷未關(guān)閉),可能會(huì)帶來一些預(yù)料不到的錯(cuò)誤。

再次,BOOT代碼操作FLASH是通過調(diào)用IAP函數(shù)來實(shí)現(xiàn)的(NXP公司的IAP庫函數(shù)提供Erase()/Write()/Compare()等),其中寫FLASH函數(shù)一次操作只能接收256/512/1024/4096字節(jié),如果不足也需要填充。

千萬要注意的是調(diào)用IAP函數(shù)期間中斷需要特別處理,一起看看NXP官方的說明文檔(原為英文,翻譯如下)“當(dāng)IAP函數(shù)調(diào)用期間,芯片的BootLoader會(huì)暫時(shí)禁止訪問用戶ROM空間數(shù)據(jù)。用戶ROM空間被映射到一些配置數(shù)據(jù)區(qū)以便于IAP調(diào)用。因此原來的中斷向量地址沒有包含正確的中斷向量。所以當(dāng)IAP調(diào)用正在處理時(shí)如果一個(gè)中斷發(fā)生,該中斷將不能被正確對待同時(shí)MCU的行為是不確定的。在一些情況下,當(dāng)中斷不能被正確處理時(shí)MCU將會(huì)復(fù)位。”

解決該問題有2種方法:如果中斷是至關(guān)重要的(任何時(shí)候都不能禁止),那么需要把中斷向量表和ISR重定向到SRAM中;另外一個(gè)簡單的辦法是調(diào)用IAP函數(shù)之前先禁止中斷,調(diào)用完成之后再使能中斷。在本固件升級(jí)中,采用第二種方法,畢竟短暫地關(guān)閉中斷對于本設(shè)計(jì)是可以接受的。

最后,當(dāng)APP代碼被引導(dǎo)運(yùn)行時(shí),中斷向量表不再位于0地址了,在本例中位于0x0001 0000,因此需要將這個(gè)新地址告訴MCU,有一專門寄存器VTOR(Vector Table Offset Register)用來存儲(chǔ)該地址。該工作必須由BOOT代碼來完成,因?yàn)橐坏┨D(zhuǎn)到APP代碼MCU第一件事情就是訪問中斷向量表。

千萬小心的一個(gè)錯(cuò)誤是:APP代碼不要再對VTOR寄存器進(jìn)行任何操作,否則MCU將因?yàn)闊o法訪問中斷向量表而紊亂。(本人就遇到這個(gè)錯(cuò)誤,APP代碼中的匯編文件startup_LPC17xx.s啟動(dòng)時(shí)“靜悄悄地”調(diào)用了NXP庫函數(shù)SystemInit,該函數(shù)會(huì)重置VTOR導(dǎo)致APP的中斷不能使用,這個(gè)錯(cuò)誤查了整整一天呀?。?/p>

四、 網(wǎng)口下載鏡像

本部分內(nèi)容是偏向策略進(jìn)行設(shè)計(jì),因此很多地方值得商榷,在這里堅(jiān)持的原則是——簡單就是美。

首先,通信幀直接建立在802.3以太網(wǎng)協(xié)議上,這樣保證簡單化;然后,不管鏡像文件實(shí)際長度,一律向1KB取整,不足則填充0;其次,因?yàn)橐蕴W(wǎng)MTU為1518字節(jié),通信幀每次傳輸1KB鏡像文件;再次,嵌入式系統(tǒng)與PC機(jī)通訊采用“停等+ACK”機(jī)制,即PC機(jī)只有接收到第i幀確認(rèn)后才能傳輸?shù)趇+1幀;最后,為確保鏡像文件在傳輸中不受損,每幀都包含CRC校驗(yàn)碼。

圖5較好地描述了升級(jí)固件時(shí)PC與嵌入式設(shè)備的通訊邏輯。當(dāng)設(shè)備發(fā)出握手幀連續(xù)10次無應(yīng)答后,BOOT代碼將直接引導(dǎo)原APP程序啟動(dòng),即無需升級(jí)固件;正常升級(jí)固件時(shí),首先有3次握手,接下來是分片傳輸鏡像文件,最后嵌入式設(shè)備會(huì)回應(yīng)“升級(jí)成功”幀;如果某分片通訊時(shí)發(fā)生錯(cuò)誤,嵌入式設(shè)備會(huì)回應(yīng)“錯(cuò)誤原因”幀,當(dāng)重傳達(dá)到5次仍出錯(cuò)時(shí)PC機(jī)需要提醒用戶,最好還能說明錯(cuò)誤原因。

基于IAP的嵌入式系統(tǒng)升級(jí)方案

圖5升級(jí)固件通訊時(shí)序

嵌入式設(shè)備回應(yīng)PC的數(shù)據(jù)幀直接封裝字符串,這樣做的好處是可以通過截取數(shù)據(jù)包查明通信內(nèi)容;而PC機(jī)傳輸給設(shè)備的數(shù)據(jù)幀采用二進(jìn)制,主要是照顧嵌入式系統(tǒng)較弱的計(jì)算和存儲(chǔ)能力,該二進(jìn)制通訊幀格式如圖6所示。

基于IAP的嵌入式系統(tǒng)升級(jí)方案

圖6二進(jìn)制通訊幀格式

FLASH一般是由Sector組成的,并且在寫操作之前需要擦除該Sector。本系統(tǒng)中使用的FLASH共30個(gè)Sector,前16個(gè)均為4KB,后14個(gè)為32KB,為了簡化設(shè)計(jì),將BOOT放置在前16個(gè)Sector中,共計(jì)64KB,APP鏡像放置在后14個(gè)32KB的Sector中,共448KB。

這樣安排程序依賴如下設(shè)定:鏡像文件起始位置為0x0001 0000,每接收與寫入FLASH字節(jié)數(shù)為1024,當(dāng)寫入FLASH地址為Sector之首時(shí)需要擦除該分區(qū),邏輯流程如圖7所示。

基于IAP的嵌入式系統(tǒng)升級(jí)方案

圖7分片寫鏡像文件

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9107

    瀏覽量

    367942
  • 嵌入式系統(tǒng)
    +關(guān)注

    關(guān)注

    41

    文章

    3597

    瀏覽量

    129554
  • IAP
    IAP
    +關(guān)注

    關(guān)注

    2

    文章

    164

    瀏覽量

    24314
收藏 人收藏

    評論

    相關(guān)推薦

    實(shí)用的CAN總線分布嵌入式系統(tǒng)升級(jí)設(shè)計(jì)方案

    嵌入式系統(tǒng)具有智能化程度高、體積小、可靠性高、實(shí)時(shí)性強(qiáng)等諸多優(yōu)點(diǎn),已經(jīng)越來越多地應(yīng)用于消費(fèi)電子、工業(yè)控制、汽車電子等各個(gè)行業(yè)。往往一個(gè)大的系統(tǒng)又由許多小的嵌入式
    的頭像 發(fā)表于 01-13 07:30 ?8605次閱讀
    實(shí)用的CAN總線分布<b class='flag-5'>式</b><b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)升級(jí)</b>設(shè)計(jì)<b class='flag-5'>方案</b>

    一種嵌入式系統(tǒng)升級(jí)的設(shè)計(jì)和實(shí)現(xiàn)

    。本文提出了利用LPC2148的SD卡實(shí)現(xiàn)嵌入式系統(tǒng)升級(jí)的設(shè)計(jì)方案?! ?、總體系統(tǒng)升級(jí)方案設(shè)計(jì)  廠家生產(chǎn)出產(chǎn)品后,用戶購買回去使用,當(dāng)設(shè)
    發(fā)表于 07-18 08:31

    利用SD卡實(shí)現(xiàn)嵌入式Linux系統(tǒng)的自動(dòng)升級(jí)

    系統(tǒng)適應(yīng)性。傳統(tǒng)的嵌入式系統(tǒng)升級(jí),首先通過JTAG接口將Bootloader燒寫到目標(biāo)板的Flash中,然后在Bootloader中,將內(nèi)核映像文件和文件系統(tǒng)映像文件通過串口或者網(wǎng)絡(luò)下
    發(fā)表于 12-07 09:24

    嵌入式系統(tǒng)怎么實(shí)現(xiàn)遠(yuǎn)程監(jiān)控和升級(jí)?

    網(wǎng)絡(luò)、以電子郵件為載體的嵌入式系統(tǒng)遠(yuǎn)程監(jiān)控和升級(jí)方案,達(dá)到遠(yuǎn)程修改系統(tǒng)參數(shù)、索取系統(tǒng)自檢報(bào)告、索
    發(fā)表于 08-02 06:49

    嵌入式JavaPOS系統(tǒng)接口怎么測試?

    隨著嵌入式計(jì)算機(jī)應(yīng)用技術(shù)的發(fā)展,嵌入式技術(shù)已經(jīng)廣泛應(yīng)用到現(xiàn)代生活的方方面面。在零售系統(tǒng)方面,零售收款機(jī)是嵌入式應(yīng)用的一個(gè)重要領(lǐng)域。目前,市場上的收款機(jī)大體上可分為三類:第一類是基于PC
    發(fā)表于 10-08 08:05

    怎樣去設(shè)計(jì)一種SFP+雙MCU光收發(fā)模塊嵌入式系統(tǒng)?

    本文基于ADuC7023a的硬件平臺(tái)和Keil4的軟件平臺(tái),設(shè)計(jì)了一種SFP+雙MCU光收發(fā)模塊嵌入式系統(tǒng)升級(jí)方案
    發(fā)表于 05-24 06:02

    嵌入式系統(tǒng)在線升級(jí)流程是怎樣的

    嵌入式系統(tǒng)在線升級(jí)流程:1.U-boot判斷Boot Flag Param 分區(qū)中的Boot Flag == 02.啟動(dòng)Normal App系統(tǒng),進(jìn)入
    發(fā)表于 12-22 07:23

    Linux嵌入式系統(tǒng)升級(jí)的相關(guān)資料推薦

    Linux 嵌入式系統(tǒng)升級(jí)轉(zhuǎn)載于:https://www.cnblogs.com/aaronLinux/p/6979963.html
    發(fā)表于 12-27 08:02

    基于GIS的多點(diǎn)嵌入式系統(tǒng)遠(yuǎn)程在線升級(jí)

    在利用嵌入式終端進(jìn)行河流水質(zhì)數(shù)據(jù)采集的分布系統(tǒng)中,由于終端數(shù)量眾多,分布范圍廣,嵌入式系統(tǒng)升級(jí)非常困難。針對該困難,提出一種基于GIS的多
    發(fā)表于 07-08 15:09 ?13次下載

    基于LPC2148用SD卡實(shí)現(xiàn)嵌入式系統(tǒng)升級(jí)的應(yīng)用設(shè)計(jì)

     在嵌入式系統(tǒng)中,為了實(shí)現(xiàn)設(shè)備終端的內(nèi)核、文件系統(tǒng)升級(jí)和設(shè)備功能維護(hù),一般是將目標(biāo)板連接到主機(jī),通過JTAG口、串口或網(wǎng)口來實(shí)現(xiàn)升級(jí)。在此,提出一種更為方便的升
    發(fā)表于 12-20 16:58 ?37次下載

    基于LPC2148的SD卡實(shí)現(xiàn)嵌入式系統(tǒng)升級(jí)設(shè)計(jì)

    嵌入式系統(tǒng)中,為了實(shí)現(xiàn)設(shè)備終端的內(nèi)核、文件系統(tǒng)升級(jí)和設(shè)備功能維護(hù),一般是將目標(biāo)板連接到主機(jī),通過JTAG口、串口或網(wǎng)口來實(shí)現(xiàn)升級(jí)。在此,提出一種更為方便的
    發(fā)表于 06-02 15:51 ?40次下載
    基于LPC2148的SD卡實(shí)現(xiàn)<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)升級(jí)</b>設(shè)計(jì)

    嵌入式設(shè)備遠(yuǎn)程在線升級(jí)技術(shù)的研究

    介紹了嵌入式系統(tǒng)遠(yuǎn)程在線升級(jí)的工作原理,并詳細(xì)闡述了系統(tǒng)硬件平臺(tái)及軟件的設(shè)計(jì)原理,提出了基于Internet通信方式的嵌入式
    發(fā)表于 06-04 15:50 ?49次下載
    <b class='flag-5'>嵌入式</b>設(shè)備遠(yuǎn)程在線<b class='flag-5'>升級(jí)</b>技術(shù)的研究

    基于CAN總線的分布嵌入式系統(tǒng)升級(jí)方案

    汽車電子系統(tǒng)中的車載GPS、倒車?yán)走_(dá)、發(fā)動(dòng)機(jī)控制、儀表盤系統(tǒng)等,數(shù)控機(jī)床中的鍵盤顯示系統(tǒng)、馬達(dá)控制系統(tǒng)等,這些無一不是嵌入式
    發(fā)表于 01-22 11:57 ?1734次閱讀
    基于CAN總線的分布<b class='flag-5'>式</b><b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)升級(jí)</b><b class='flag-5'>方案</b>

    ARM在線升級(jí)的應(yīng)用IAP代碼

    ARM嵌入式應(yīng)用程序架構(gòu)設(shè)計(jì)實(shí)例精講--ARM在線升級(jí)的應(yīng)用IAP代碼
    發(fā)表于 07-08 11:08 ?6次下載

    基于IAP遠(yuǎn)程升級(jí)技術(shù)在空間應(yīng)用系統(tǒng)解決方案

    IAP可通過專門設(shè)計(jì)的固件程序來編程內(nèi)部存儲(chǔ)器,不需要硬件支持,所以IAP技術(shù)提高了嵌入式系統(tǒng)的可擴(kuò)展性與可維護(hù)性,能在不變的硬件平臺(tái)上升級(jí)
    發(fā)表于 11-27 17:19 ?2次下載
    基于<b class='flag-5'>IAP</b>遠(yuǎn)程<b class='flag-5'>升級(jí)</b>技術(shù)在空間應(yīng)用<b class='flag-5'>系統(tǒng)</b>解決<b class='flag-5'>方案</b>