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

        ?

        基于IAP和網口的ARM Cortex- M3固件升級技術※

        2014-07-02 08:42:56蔣俊藍敏
        關鍵詞:鏡像文件固件PC機

        蔣俊,藍敏

        (長沙職業(yè)技術學院,長沙410081)

        引 言

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

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

        圖1 網口升級固件

        1 原理介紹

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

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

        圖2 軟件地址空間

        基于IAP固件升級一般會把軟件設計成兩部分:BOOT和應用程序。其中BOOT相當于PC機的BIOS,負責升級固件和引導應用程序,它對于用戶是不可見的;應用程序就是常見的嵌入式軟件。這兩個軟件的存儲地址如圖3所示。

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

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

        圖3 存儲地址視圖

        2 IAP關鍵技術

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

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

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

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

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

        千萬要注意的是,調用IAP函數期間,中斷需要特別處理,一起看看NXP官方的說明文檔:在IAP函數調用期間,芯片的Boot Loader會暫時禁止訪問用戶ROM空間數據,用戶ROM空間被映射到一些配置數據區(qū)以便于IAP調用。因為原來的中斷向量地址沒有包含正確的中斷向量,所以當IAP調用正在處理時發(fā)生一個中斷,該中斷將不能被正確對待,同時MCU的行為也是不確定的。在一些情況下,當中斷不能被正確處理時,MCU將會復位[4]。

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

        最后,當APP代碼被引導運行時,中斷向量表不再位于0地址了,在本例中位于0x0001 0000,因此需要將這個新地址告訴MCU,有一個專門寄存器VTOR(Vector Table Offset Register)用來存儲該地址。該工作必須由BOOT代碼來完成,因為一旦跳轉到APP代碼,MCU的第一件事情就是訪問中斷向量表。

        千萬要注意的一個問題是:APP代碼不要再對VTOR寄存器進行任何操作,否則MCU將因為無法訪問中斷向量表而紊亂。(筆者就遇到這個問題,APP代碼中的匯編文件startup_LPC17xx.s啟動時“靜悄悄地”調用了NXP庫函數SystemInit,該函數會重置VTOR導致APP的中斷不能使用)。

        3 網口下載鏡像

        這部分內容是偏向策略進行的設計,因此很多地方值得商榷,在這里堅持的原則是——簡單就是美。

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

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

        圖5 無需升級固件通信時序

        當正常升級固件時,首先有3次握手,接下來是分片傳輸鏡像文件,最后嵌入式設備會回應“升級成功”幀,如圖6所示。

        圖6 正常升級固件通信時序

        如果某分片通信時發(fā)生錯誤,嵌入式設備會回應“錯誤原因”幀,當重傳達到5次仍出錯時,PC機需要提醒用戶,最好還能說明錯誤原因,如圖7所示。

        圖7 升級固件出錯通信時序

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

        圖8 二進制通信幀格式

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

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

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

        結 語

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

        編者注:源程序見本刊網站www.mesnet.com.cn。

        [1]David E.Simon.嵌入式系統(tǒng)軟件教程[M].陳向群,等譯.北京:機械工業(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機
        沒光驅不要緊 裝個免費虛擬的
        基于PC機與單片機的多機通信技術及抗干擾方法
        基于三菱FXPLC的感應淬火機床與PC機的串行通信實現(xiàn)
        用RamOS降低公用機的維護工作量
        VC.NET下實現(xiàn)dsPIC單片機與PC機的通信
        電子制作(2017年23期)2017-02-02 07:16:47
        基于固件的遠程身份認證
        Win7升級Win10教程
        電腦迷(2015年9期)2015-05-30 22:08:35
        提取ROM固件中的APP
        電腦愛好者(2015年7期)2015-04-09 08:54:02
        一種通過USB接口的可靠固件升級技術
        奧林巴斯XZ—2新固件升級
        中國攝影(2014年1期)2014-02-24 01:50:23
        中国老熟妇506070| 色婷婷一区二区三区77| 久久精品一区二区熟女| 凹凸国产熟女精品视频app| 天天看片视频免费观看| 亚洲电影久久久久久久9999| 视频一区中文字幕日韩| 国产在线无码精品无码| 精品国产人妻一区二区三区| 在线视频一区二区日韩国产| 亚洲天堂线上免费av | 免费国产黄网站在线观看视频| 久久久久久久久久久国产| 在线国产视频精品视频| 一卡二卡国产av熟女| 亚洲妇熟xxxx妇色黄| 色欲麻豆国产福利精品| 99久久久久久亚洲精品| 亚洲av毛片在线网站| 亚洲国产av精品一区二区蜜芽| 日韩AV无码免费二三区| 成年女人午夜特黄特色毛片免| 免费a级毛片又大又粗又黑| 亚洲av日韩av综合| 97超级碰碰碰久久久观看| 熟女免费视频一区二区| 狠狠色噜噜狠狠狠777米奇小说 | 国产电影一区二区三区| japanese无码中文字幕| 日韩精品国产一区在线| 成人影院在线视频免费观看| 久久人人玩人妻潮喷内射人人 | 7777奇米四色成人眼影| 欧美zozo另类人禽交| 在线精品国产亚洲av麻豆| 国自产精品手机在线观看视频| 日韩一区二区肥| 日产一区一区三区区别| 日本大乳高潮视频在线观看| 美女视频一区| 日韩av一区二区在线观看|