国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

一種基于Ymodem協(xié)議的設(shè)備固件在線升級(jí)解決方案

2021-10-12 00:33蓓,

葉 蓓, 魏 彥

(上海船舶運(yùn)輸科學(xué)研究所 艦船自動(dòng)化系統(tǒng)事業(yè)部,上海 200135)

0 引 言

隨著科技的不斷發(fā)展,嵌入式設(shè)備在船舶自動(dòng)化領(lǐng)域的應(yīng)用越來越廣泛,應(yīng)用場(chǎng)景逐漸朝著多元化、復(fù)雜化方向發(fā)展,用戶對(duì)嵌入式設(shè)備的維護(hù)和固件升級(jí)提出了新的要求。嵌入式設(shè)備在應(yīng)用期間受軟件設(shè)計(jì)缺陷、系統(tǒng)需求更改等多種因素的影響,不可避免地需要更新軟件程序。但是,在船舶自動(dòng)化領(lǐng)域,嵌入式設(shè)備體積龐大且不便拆卸,以往采用的程序更新方法是將設(shè)備拆卸之后再更新程序,操作極其繁瑣,且技術(shù)含量不高,會(huì)極大地浪費(fèi)人力資源和物力資源。因此,為避免因拆卸設(shè)備而引入新的系統(tǒng)隱患,用戶一般不接受先拆卸嵌入式設(shè)備,再對(duì)其進(jìn)行軟件升級(jí)的方案。為提高嵌入式設(shè)備的可維護(hù)性,新設(shè)備需具有固件在線升級(jí)的功能,為新設(shè)備增加該功能會(huì)大大提高工作人員的工作效率。

在船舶自動(dòng)化應(yīng)用場(chǎng)景中,普遍應(yīng)用的現(xiàn)場(chǎng)通信總線是CAN(Controller Area Network)現(xiàn)場(chǎng)總線。CAN現(xiàn)場(chǎng)總線在船舶自動(dòng)化領(lǐng)域中沒有通用的升級(jí)協(xié)議,特別是當(dāng)系統(tǒng)設(shè)備較多時(shí),制定的CAN現(xiàn)場(chǎng)總線協(xié)議往往較為復(fù)雜,若單獨(dú)制定特殊的CAN現(xiàn)場(chǎng)總線升級(jí)協(xié)議,可能會(huì)出現(xiàn)無法兼容已安裝的其他嵌入式設(shè)備的現(xiàn)象,從而導(dǎo)致升級(jí)失敗或無法滿足升級(jí)要求。同時(shí),船用設(shè)備中一般沒有通用串行總線 (Universal Serial Bus,USB)接口,因此采用USB接口進(jìn)行固件升級(jí)也是不現(xiàn)實(shí)的。在實(shí)際應(yīng)用中,嵌入式設(shè)備一般采用串口接口作為調(diào)試接口,而串口接口基本上不作為通信接口使用。因此,本文提出一種基于Ymodem協(xié)議的設(shè)備固件升級(jí)方案。該方案能在不更改任何硬件設(shè)備的前提下,通過上位機(jī)軟件對(duì)嵌入式設(shè)備微控制器固件進(jìn)行升級(jí),核心是利用Ymodem協(xié)議與升級(jí)程序之間的不斷交互,以及Ymodem協(xié)議完善的握手機(jī)制和出錯(cuò)管理機(jī)制,將更新的程序準(zhǔn)確無誤地?zé)龑懙角度胧皆O(shè)備微控制器的Flash中,實(shí)現(xiàn)對(duì)嵌入式設(shè)備的固件升級(jí)。

1 工作原理

該方案選用的微控制器主要以Cortex-M3核為基礎(chǔ),本文以LPC1768微控制器為例進(jìn)行詳細(xì)說明。

基于Ymodem協(xié)議的設(shè)備固件升級(jí)方案硬件結(jié)構(gòu)見圖1,主要由LPC1768微控制器、復(fù)位電路、時(shí)鐘電路、看門狗電路、串口電路和電源電路組成。上位機(jī)升級(jí)軟件與USB轉(zhuǎn)串口模塊相連,USB轉(zhuǎn)串口模塊與設(shè)備的串口接口相連。在對(duì)設(shè)備進(jìn)行固件升級(jí)時(shí),首先由上位機(jī)升級(jí)軟件給待升級(jí)設(shè)備發(fā)送固件升級(jí)命令,待升級(jí)設(shè)備接收到升級(jí)命令之后做好固件升級(jí)準(zhǔn)備,等待接收上位機(jī)升級(jí)軟件發(fā)送的固件升級(jí)數(shù)據(jù),從而實(shí)現(xiàn)對(duì)整個(gè)設(shè)備的固件升級(jí)。

圖1 基于Ymodem協(xié)議的設(shè)備固件升級(jí)方案硬件結(jié)構(gòu)

LPC1768微控制器的Flash區(qū)分為Bootloader固件程序區(qū)、APP區(qū)、APP備份區(qū)和數(shù)據(jù)存儲(chǔ)區(qū)。Bootloader固件程序在運(yùn)行過程中實(shí)現(xiàn)對(duì)片內(nèi)代碼存儲(chǔ)Flash的擦除和拷貝,當(dāng)需對(duì)設(shè)備進(jìn)行固件升級(jí)時(shí),運(yùn)行的應(yīng)用程序通過串口接口將新的應(yīng)用程序拷貝到LPC1768微控制器的APP備份區(qū)內(nèi)。當(dāng)新的應(yīng)用程序升級(jí)結(jié)束之后,APP程序跳轉(zhuǎn)到Bootloader程序,Bootloader程序首先擦除舊版本的APP程序,然后從APP備份區(qū)讀取新的固件數(shù)據(jù),并將其寫入APP程序所屬的Flash區(qū)中,從而完成對(duì)APP程序的更新。

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

2.1 IAP技術(shù)

在應(yīng)用編程(In Application Programming,IAP)技術(shù)是微控制器片內(nèi)Flash程序存儲(chǔ)器中普遍應(yīng)用的一種編程技術(shù)。該技術(shù)的特點(diǎn)是確保應(yīng)用程序在正常工作的情況下,通過調(diào)用特殊的IAP程序,對(duì)微控制器片內(nèi) Flash某段空間進(jìn)行讀寫操作,為設(shè)備固件升級(jí)創(chuàng)造條件。

在應(yīng)用IAP技術(shù)時(shí),需滿足以下2個(gè)要求:

1) 微控制器片內(nèi)Flash需存儲(chǔ)IAP程序,主要負(fù)責(zé)檢查并更新固件。該IAP程序即下文所述Bootloader程序,Bootloader程序需通過JTAG(Joint Test Action Group)工具或ISP(In System Programming)燒寫,默認(rèn)在微控制器片內(nèi)Flash的最低地址區(qū)開始存儲(chǔ),并設(shè)定所占存儲(chǔ)空間的大小。

2) 微控制器片內(nèi)Flash需存儲(chǔ)APP程序,APP程序需設(shè)置微控制器片內(nèi)Flash的起始地址、所占存儲(chǔ)空間的大小和中斷向量表偏移量,且偏移量需與微控制器片內(nèi)Flash的偏移量相同。APP程序一般存儲(chǔ)在微控制器片內(nèi)Flash的Bootloader程序之后,第一次需通過JTAG工具或ISP燒寫。

2.2 Ymodem協(xié)議

Ymodem協(xié)議是一種發(fā)送且等待的協(xié)議,即發(fā)送方在發(fā)送任意一個(gè)數(shù)據(jù)包之后,都要等待接收方的確認(rèn)。Ymodem協(xié)議約定所有傳輸幀都由幀頭、數(shù)據(jù)段和幀尾組成,且附帶CRC(Cyclic Redundancy Check)校驗(yàn)碼,從而保證數(shù)據(jù)幀傳輸?shù)馁|(zhì)量。具體的Ymodem傳輸協(xié)議解析見表1。

表1 Ymodem傳輸協(xié)議解析

Ymodem協(xié)議的工作流程見圖2,其中:發(fā)送端是上位機(jī)升級(jí)軟件;接收端是待升級(jí)設(shè)備。

圖2 Ymodem協(xié)議的工作流程

1) Ymodem協(xié)議規(guī)定所有的固件升級(jí)傳輸請(qǐng)求都由上位機(jī)升級(jí)軟件發(fā)起,待升級(jí)設(shè)備接收到固件升級(jí)命令之后,會(huì)向上位機(jī)升級(jí)軟件發(fā)送固件升級(jí)開始標(biāo)志符(“C”字符(ASCII碼))。

2) 上位機(jī)升級(jí)軟件發(fā)起傳輸起始幀,起始幀中包含待升級(jí)固件的名稱和大小,剩余字節(jié)用NUL補(bǔ)齊。

3) 待升級(jí)設(shè)備接收到起始幀之后,需發(fā)送應(yīng)答命令“ACK”和開始標(biāo)志符。

4) 上位機(jī)升級(jí)軟件接收到待升級(jí)設(shè)備的回復(fù)之后,將幀頭、幀序號(hào)、幀序號(hào)的補(bǔ)碼、數(shù)據(jù)區(qū)和CRC校驗(yàn)字段打包成數(shù)據(jù)幀,每個(gè)數(shù)據(jù)子幀的數(shù)據(jù)大小為1 024 Byte,開始傳輸數(shù)據(jù)幀。

5) 待升級(jí)設(shè)備接收到數(shù)據(jù)幀之后,需發(fā)送應(yīng)答命令“ACK”。

6) 重復(fù)執(zhí)行步驟4)和步驟5)。若待升級(jí)設(shè)備固件的最后一組數(shù)據(jù)的大小在128~1 024 Byte范圍內(nèi),則數(shù)據(jù)區(qū)剩余空間全部用0x1A填充。若待升級(jí)設(shè)備固件最后一組數(shù)據(jù)的大小不超過128 Byte,則按Ymodem協(xié)議的要求,選擇使用SOH數(shù)據(jù)幀,即用大小為128 Byte的數(shù)據(jù)傳輸。若數(shù)據(jù)的大小不足128 Byte,剩余的數(shù)據(jù)用0x1A填充。

7) 所有數(shù)據(jù)幀發(fā)送完之后,上位機(jī)升級(jí)軟件第一次發(fā)送“EOT”命令,通知待升級(jí)設(shè)備數(shù)據(jù)幀發(fā)送結(jié)束。

8) 待升級(jí)設(shè)備第一次接收到“EOT”命令之后,發(fā)送應(yīng)答命令“NAK”。

9) 上位機(jī)升級(jí)軟件第二次發(fā)送“EOT”命令,通知待升級(jí)設(shè)備數(shù)據(jù)幀發(fā)送結(jié)束。

10) 待升級(jí)設(shè)備第二次接收到“EOT”命令之后,發(fā)送應(yīng)答命令“ACK”和“C”。

11) 上位機(jī)升級(jí)軟件發(fā)送結(jié)束幀協(xié)議。

12) 待升級(jí)設(shè)備接收到結(jié)束幀之后,發(fā)送應(yīng)答命令“ACK”,按Ymodem協(xié)議進(jìn)行固件升級(jí)的流程結(jié)束。

2.3 中斷向量表重定位

在設(shè)計(jì)中,需先執(zhí)行Bootloader程序,再執(zhí)行APP程序,因此中斷向量表是需跳轉(zhuǎn)的。中斷向量表重定位是在APP程序中完成的,重定位中斷向量之前的中斷向量依然執(zhí)行Bootloader程序中的中斷向量表,若APP程序中完成中斷向量重定位之后再發(fā)生中斷事件,則執(zhí)行APP程序中重定位之后的中斷向量表,因此需在Bootloader程序執(zhí)行結(jié)束之后,在APP程序中修改中斷向量表。

LPC1768微控制器的中斷向量表是能重定位的,方法是在Flash中重建一個(gè)中斷向量表。中斷向量表重定位由NVIC(Nested Vectored Interrupt Controller)中的向量表偏移寄存器(Vector Table Offset Register,VTOR)控制,初始時(shí)中斷向量表放置在片內(nèi)Flash的最開頭,可通過設(shè)置SCB->VTOR向量動(dòng)態(tài)調(diào)整其位置,保證APP程序運(yùn)行之后還能改變向量的跳轉(zhuǎn)地址。

3 軟件的設(shè)計(jì)與實(shí)現(xiàn)

3.1 Flash空間劃分

LPC1768微控制器的Flash總大小為256 KB,地址范圍為0x00000000~0x0003FFFF,按頁碼劃分結(jié)果見表2。

表2 LPC1768微控制器Flash地址范圍按頁碼劃分結(jié)果

該方案需對(duì)LPC1768微控制器內(nèi)的片內(nèi)Flash進(jìn)行空間預(yù)規(guī)劃,系統(tǒng)軟件主要由Bootloader程序和APP程序組成,將其劃分為4個(gè)具有不同作用的區(qū)域,具體劃分結(jié)果見表3。

表3 Flash功能區(qū)劃分

1) Bootloader程序區(qū)的大小為20 KB,存儲(chǔ)地址范圍為0x00000000~0x00004FFF,主要檢查是否有新程序需更新,將程序從APP備份區(qū)拷貝到APP區(qū),完成程序從Bootloader程序區(qū)到APP區(qū)的跳轉(zhuǎn);

2) APP區(qū)的大小為115 KB,存儲(chǔ)地址范圍為0x00005000~0x00021BFF,存儲(chǔ)正常運(yùn)行的固件程序,其與Bootloader程序區(qū)的存儲(chǔ)區(qū)域相互獨(dú)立,只存在簡單的跳轉(zhuǎn)關(guān)系;

3) APP備份區(qū)的大小為115 KB,存儲(chǔ)地址范圍為0x00021C00~0x0003E7FF,用于存儲(chǔ)新的固件程序;

4) DATA區(qū)的大小為6 KB,存儲(chǔ)地址范圍為0x0003E800~0x0003FFFF,用于存儲(chǔ)應(yīng)用程序需保存的數(shù)據(jù),不可隨意擦除,其中升級(jí)標(biāo)志信息的存儲(chǔ)地址為0x0003FFFF。

每個(gè)區(qū)域中間預(yù)留一定的空白區(qū)域,防止區(qū)域程序重疊。

3.2 總體軟件流程

總體軟件流程圖見圖3。在初始上電時(shí),必須先執(zhí)行Bootloader程序,主要用于檢查APP備份區(qū)內(nèi)是否有新的程序,從而判斷是否需要更新軟件。Bootloader程序執(zhí)行完成之后必須跳轉(zhuǎn)到APP區(qū),執(zhí)行APP程序。

圖3 總體軟件流程圖

從Bootloader程序跳轉(zhuǎn)到APP程序主要由以下函數(shù)實(shí)現(xiàn):首先對(duì)堆棧指針進(jìn)行重定向,定向到新的程序存儲(chǔ)地址;然后將程序指針跳轉(zhuǎn)到APP程序;最后在APP程序中運(yùn)行程序,不再跳轉(zhuǎn)。部分代碼如下:

t_msp=__get_MSP();

LPC_Flash_WordWrite(&t_msp,FLASH_APP1_OFFSET,1);

LPC_Flash_WordRead(&address,FLASH_APP1_OFFSET+4,1);

pFunction=(void(*)(void))address;

pFunction();

3.3 Bootloader程序設(shè)計(jì)

Bootloader程序流程圖見圖4。Bootloader程序存儲(chǔ)在LPX1768微控制器內(nèi)部,F(xiàn)lash的地址范圍為0x00000000~0x00004FFF。設(shè)備上電或復(fù)位之后,Bootloader程序從地址0x00000000處開始執(zhí)行。硬件初始化完成之后,讀取存儲(chǔ)在DATA區(qū)內(nèi)的地址為0x0003FFFF的升級(jí)標(biāo)志信息。Bootloader程序根據(jù)升級(jí)標(biāo)志的值判斷是否需更新程序,若升級(jí)標(biāo)志位的值不是0x55,則此次上電沒有新的程序需更新,直接跳轉(zhuǎn)到APP區(qū),執(zhí)行APP程序。

圖4 Bootloader程序流程圖

若升級(jí)標(biāo)志的值是0x55,證明APP備份區(qū)內(nèi)有最新的固件程序,需進(jìn)入升級(jí)狀態(tài)。首先擦除整個(gè)APP程序區(qū)空間,將整個(gè)APP備份區(qū)內(nèi)的最新程序拷貝到APP區(qū)。在拷貝程序過程中,可能會(huì)出現(xiàn)部分?jǐn)?shù)據(jù)段拷貝失敗或丟失的情況,因此需對(duì)每次拷貝到APP區(qū)的數(shù)據(jù)進(jìn)行重新回讀,并將其與拷貝之前APP備份區(qū)內(nèi)的數(shù)據(jù)相對(duì)比,若二者一致,則此次拷貝工作成功,否則需重新拷貝,直至拷貝成功為止。APP備份區(qū)內(nèi)的程序拷貝結(jié)束之后,需擦除APP備份區(qū)內(nèi)的程序,將DATA區(qū)地址為0x0003FFFF的升級(jí)標(biāo)志信息的值更改為0x00,表示更新結(jié)束。接著程序跳轉(zhuǎn)到APP區(qū),開始執(zhí)行最新的APP程序。

3.4 APP程序設(shè)計(jì)

APP程序流程圖見圖5。APP程序存儲(chǔ)在LPX1768微控制器內(nèi)部,F(xiàn)lash的地址范圍為0x00005000~0x00021BFF。

圖5 APP程序流程圖

APP程序是在Bootloader程序執(zhí)行完畢之后執(zhí)行的程序,除了執(zhí)行正常的功能程序以外,還能實(shí)時(shí)檢測(cè)上位機(jī)發(fā)送過來的升級(jí)指令,完成升級(jí)工作。在執(zhí)行APP程序時(shí),首先要對(duì)中斷向量進(jìn)行重定位,具體原因如3.3節(jié)所述。在對(duì)中斷向量表進(jìn)行重定位時(shí),需在程序中使用庫函數(shù)NVIC_SetVectorTable(Application,IAP_FLASH_SIZE)設(shè)置向量表偏移,其中Application設(shè)置為APP區(qū)的起始地址0x00005000,IAP_FLASH_SIZE的大小設(shè)置為0x0001CC00。

中斷向量表重定位之后,進(jìn)行初始化工作,程序開始正常執(zhí)行功能。此時(shí)需定時(shí)查詢是否有上位機(jī)發(fā)出的升級(jí)指令:若無升級(jí)指令,則正常執(zhí)行功能;若有升級(jí)指令,則需做好升級(jí)準(zhǔn)備,升級(jí)協(xié)議使用Ymodem協(xié)議,將最新的固件寫到APP備份區(qū)。在升級(jí)過程中,需對(duì)數(shù)據(jù)進(jìn)行CRC校驗(yàn),防止數(shù)據(jù)出錯(cuò)導(dǎo)致無法正常工作。升級(jí)結(jié)束之后,需將DATA區(qū)地址為0x0003FFFF的升級(jí)標(biāo)志信息的值更改為0x55,然后采用庫函數(shù)NVIC_SystemReset()實(shí)現(xiàn)軟件復(fù)位,程序跳轉(zhuǎn)到Bootloader程序區(qū),升級(jí)結(jié)束。

3.5 上位機(jī)軟件設(shè)計(jì)

上位機(jī)軟件的開發(fā)語言是C++,開發(fā)平臺(tái)是VS2010。上位機(jī)通過USB轉(zhuǎn)串口模塊與設(shè)備通信,上位機(jī)軟件界面見圖6。上位機(jī)軟件操作流程如下:

圖6 上位機(jī)軟件界面

1) 參照?qǐng)D1,按要求連接被升級(jí)設(shè)備、USB轉(zhuǎn)串口模塊和上位機(jī)軟件,在計(jì)算機(jī)上運(yùn)行上位機(jī)軟件,根據(jù)設(shè)備固件的設(shè)計(jì)需求選擇合適的串口波特率,點(diǎn)擊“打開串口”按鈕;

2) 點(diǎn)擊“發(fā)送升級(jí)標(biāo)志”按鈕,根據(jù)Log確定上位機(jī)軟件與待升級(jí)設(shè)備之間的通信鏈路是否正常;

3) 點(diǎn)擊“讀取bin文件”按鈕,選擇更新的固件文件,上位機(jī)軟件會(huì)解析該bin文件;

4) 點(diǎn)擊“升級(jí)”按鈕,上位機(jī)軟件執(zhí)行升級(jí)操作,待升級(jí)設(shè)備接收到升級(jí)命令之后,在主程序中完成對(duì)固件的在線升級(jí);

5) 升級(jí)工作完成。

4 試驗(yàn)結(jié)果

為驗(yàn)證基于Ymodem協(xié)議的設(shè)備固件升級(jí)方案的可靠性,選擇不同大小的固件文件進(jìn)行升級(jí)試驗(yàn),任意一個(gè)固件文件的升級(jí)次數(shù)為15次。試驗(yàn)結(jié)果表明,當(dāng)固件文件的大小為20 KB、34 KB、49 KB和78 KB時(shí),固件升級(jí)的成功率均能達(dá)到100%。

此外,試驗(yàn)發(fā)現(xiàn),若在升級(jí)過程中人為斷開上位機(jī)升級(jí)軟件,則設(shè)備重新上電之后,程序會(huì)跳轉(zhuǎn)至未升級(jí)前的版本。再次升級(jí)成功之后,可重新運(yùn)行新的應(yīng)用程序。

5 結(jié) 語

本文基于Ymodem協(xié)議,在LPC1768微控制器中編寫APP程序和Bootloader 程序,同時(shí)編寫與之配套的上位機(jī)升級(jí)軟件,使船用設(shè)備的固件升級(jí)更加便捷和高效,降低系統(tǒng)開發(fā)和設(shè)備維護(hù)的成本。該方案具有良好的故障處理機(jī)制,若升級(jí)失敗,程序會(huì)跳轉(zhuǎn)至升級(jí)前的版本。試驗(yàn)結(jié)果表明,該方案具有較好的可行性、穩(wěn)定性和可靠性,可廣泛應(yīng)用于船用設(shè)備的固件升級(jí)中。

和静县| 平顶山市| 隆林| 阿拉善右旗| 清流县| 图片| 永泰县| 古浪县| 商城县| 大方县| 南涧| 阿拉善盟| 邹城市| 刚察县| 霍州市| 孟连| 阿克苏市| 泸水县| 邻水| 田阳县| 郓城县| 大埔区| 南部县| 西乌珠穆沁旗| 明星| 京山县| 新营市| 庐江县| 麻栗坡县| 洛阳市| 青海省| 繁昌县| 长武县| 嘉善县| 凭祥市| 隆昌县| 类乌齐县| 临高县| 巴东县| 晋城| 资阳市|