亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于IAP和網(wǎng)口的ARM Cortex- M3固件升級(jí)技術(shù)※

        2014-07-02 08:42:56蔣俊藍(lán)敏
        關(guān)鍵詞:鏡像文件固件PC機(jī)

        蔣俊,藍(lán)敏

        (長(zhǎng)沙職業(yè)技術(shù)學(xué)院,長(zhǎng)沙410081)

        引 言

        現(xiàn)有的一臺(tái)嵌入式設(shè)備基于ARM Cortex-M3處理器,具有以太網(wǎng)通信功能。為了降低設(shè)備維護(hù)成本,需要設(shè)計(jì)網(wǎng)口升級(jí)固件功能。本文描述了基于IAP和網(wǎng)口升級(jí)該嵌入式系統(tǒng)的方法,其中處理器為NXP公司的ARM Cortex-M3,開(kāi)發(fā)環(huán)境為IAR Embedded Workbench for ARM。

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

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

        1 原理介紹

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

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

        圖2 軟件地址空間

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

        再來(lái)看看BOOT和APP啟動(dòng)時(shí)序,當(dāng)系統(tǒng)上電時(shí),它首先從0地址找到中斷向量表,取出Reset_Handler中斷服務(wù)代碼,該代碼先初始化芯片(如PLL和中斷寄存器),然后調(diào)用Boot Loader代碼執(zhí)行搬運(yùn)工作,把存儲(chǔ)空間布置成圖2(b)所示的“運(yùn)行地址視圖”,之后跳轉(zhuǎn)到用戶代碼的main()函數(shù),此時(shí)BOOT軟件啟動(dòng)完成。BOOT代碼開(kāi)始檢測(cè)是否需要升級(jí)固件,如果需要,就從外部取APP鏡像文件并燒錄到FLASH中,最后一步是啟動(dòng)APP軟件。

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

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

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

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

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

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

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

        再次,BOOT代碼操作FLASH是通過(guò)調(diào)用IAP函數(shù)來(lái)實(shí)現(xiàn)的(NXP公司的IAP庫(kù)函數(shù)提供Erase()/Write()/Compare()等),其中寫FLASH函數(shù)一次操作只能接收256/512/1 024/4 096字節(jié),如果不足就需要填充[3]。

        千萬(wàn)要注意的是,調(diào)用IAP函數(shù)期間,中斷需要特別處理,一起看看NXP官方的說(shuō)明文檔:在IAP函數(shù)調(diào)用期間,芯片的Boot Loader會(huì)暫時(shí)禁止訪問(wèn)用戶ROM空間數(shù)據(jù),用戶ROM空間被映射到一些配置數(shù)據(jù)區(qū)以便于IAP調(diào)用。因?yàn)樵瓉?lái)的中斷向量地址沒(méi)有包含正確的中斷向量,所以當(dāng)IAP調(diào)用正在處理時(shí)發(fā)生一個(gè)中斷,該中斷將不能被正確對(duì)待,同時(shí)MCU的行為也是不確定的。在一些情況下,當(dāng)中斷不能被正確處理時(shí),MCU將會(huì)復(fù)位[4]。

        解決該問(wèn)題有兩種方法:如果中斷是至關(guān)重要的(任何時(shí)候都不能禁止),那么需要把中斷向量表和ISR重定向到SRAM中;另外一個(gè)簡(jiǎn)單的辦法是調(diào)用IAP函數(shù)之前先禁止中斷,調(diào)用完成之后再使能中斷。在本固件升級(jí)中,采用第二種方法,因?yàn)槎虝旱仃P(guān)閉中斷對(duì)于本設(shè)計(jì)來(lái)說(shuō)是可以接受的。

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

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

        3 網(wǎng)口下載鏡像

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

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

        升級(jí)固件時(shí),PC與嵌入式設(shè)備的通信邏輯如下:當(dāng)設(shè)備發(fā)出握手幀連續(xù)10次無(wú)應(yīng)答后,BOOT代碼將直接引導(dǎo)原APP程序啟動(dòng),即無(wú)需升級(jí)固件,如圖5所示。

        圖5 無(wú)需升級(jí)固件通信時(shí)序

        當(dāng)正常升級(jí)固件時(shí),首先有3次握手,接下來(lái)是分片傳輸鏡像文件,最后嵌入式設(shè)備會(huì)回應(yīng)“升級(jí)成功”幀,如圖6所示。

        圖6 正常升級(jí)固件通信時(shí)序

        如果某分片通信時(shí)發(fā)生錯(cuò)誤,嵌入式設(shè)備會(huì)回應(yīng)“錯(cuò)誤原因”幀,當(dāng)重傳達(dá)到5次仍出錯(cuò)時(shí),PC機(jī)需要提醒用戶,最好還能說(shuō)明錯(cuò)誤原因,如圖7所示。

        圖7 升級(jí)固件出錯(cuò)通信時(shí)序

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

        圖8 二進(jìn)制通信幀格式

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

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

        圖9 分片寫鏡像文件流程圖

        結(jié) 語(yǔ)

        本文重點(diǎn)研究了基于IAP和網(wǎng)口的固件升級(jí)技術(shù),雖然基于NXP公司的ARM Cortex-M3處理器和IAR開(kāi)發(fā)環(huán)境,但技術(shù)原理對(duì)于其他架構(gòu)的嵌入式系統(tǒng)也是適用的。論文中涉及的技術(shù)方法在IAR V6.0和NXP LPC1768芯片上測(cè)試成功,并研制成產(chǎn)品,接受過(guò)嚴(yán)格的現(xiàn)場(chǎng)升級(jí)考驗(yàn)。實(shí)踐證明,論文中的方法穩(wěn)定可行。

        編者注:源程序見(jiàn)本刊網(wǎng)站www.mesnet.com.cn。

        [1]David E.Simon.嵌入式系統(tǒng)軟件教程[M].陳向群,等譯.北京:機(jī)械工業(yè)出版社,2005.

        [2]IAR.IAR embedded workbench user guides,2010.

        [3]NXP.LPC176x/5x user manual,2013.

        [4]NXP.AN11333 interrupt handling during IAP calls for LPC177x_8x and LPC407x_8x ,2014.

        猜你喜歡
        鏡像文件固件PC機(jī)
        沒(méi)光驅(qū)不要緊 裝個(gè)免費(fèi)虛擬的
        基于PC機(jī)與單片機(jī)的多機(jī)通信技術(shù)及抗干擾方法
        基于三菱FXPLC的感應(yīng)淬火機(jī)床與PC機(jī)的串行通信實(shí)現(xiàn)
        用RamOS降低公用機(jī)的維護(hù)工作量
        VC.NET下實(shí)現(xiàn)dsPIC單片機(jī)與PC機(jī)的通信
        電子制作(2017年23期)2017-02-02 07:16:47
        基于固件的遠(yuǎn)程身份認(rèn)證
        Win7升級(jí)Win10教程
        電腦迷(2015年9期)2015-05-30 22:08:35
        提取ROM固件中的APP
        一種通過(guò)USB接口的可靠固件升級(jí)技術(shù)
        奧林巴斯XZ—2新固件升級(jí)
        国产精品无码日韩欧| 精品人妻一区三区蜜桃| 精品久久久bbbb人妻| 性一交一乱一伦a片| JIZZJIZZ国产| 日韩精品中文字幕人妻中出| 美女扒开内裤让我捅的视频| 亚洲国产精品无码久久久| 成人看片黄a免费看那个网址| 久久精品国产亚洲5555| 日本精品啪啪一区二区| 久久国产精品一区二区三区| 欧美性受xxxx白人性爽| 国产一区二区精品在线观看 | 亚洲国产天堂av成人在线播放| 亚洲成人av一二三四区| 少妇性荡欲视频| 无码人妻少妇久久中文字幕蜜桃| 国产91九色视频在线播放| 国产av综合网站不卡| 琪琪的色原网站| AV无码中文字幕不卡一二三区| 成人短篇在线视频夫妻刺激自拍| 日本熟女中文字幕在线| 久久久久人妻一区精品色欧美| 麻豆AV免费网站| 国产免费99久久精品| 一区二区三区中文字幕p站| 亚洲伊人成综合网| 精品人伦一区二区三区蜜桃麻豆| 五月婷婷丁香视频在线观看| 美女mm131爽爽爽| 97精品伊人久久大香线蕉| 中文亚洲成a人片在线观看| 亚洲综合在线观看一区二区三区| 色欲色欲天天天www亚洲伊| 亚洲综合久久久| 一区二区三区日本久久| 伊人久久大香线蕉av波多野结衣| 午夜丰满少妇性开放视频| 国产精品女丝袜白丝袜|