<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 汽車電子 > 設(shè)計(jì)應(yīng)用 > 基于WiFi的車載終端遠(yuǎn)程軟件升級方法

          基于WiFi的車載終端遠(yuǎn)程軟件升級方法

          作者: 時間:2016-10-22 來源:網(wǎng)絡(luò) 收藏

          ⑤Error(ERROR);

          本文引用地址:http://www.ex-cimer.com/article/201610/309975.htm

          ⑥OACK。

          目前常用的是前5種。由于系統(tǒng)只需實(shí)現(xiàn)終端從數(shù)據(jù)采集設(shè)備上下載軟件文件,無需實(shí)現(xiàn)完整的TFTP協(xié)議,僅實(shí)現(xiàn)上述第1、3、4、5類數(shù)據(jù)包功能即可。主要定義以下4個接口函數(shù):

          ①RRQ發(fā)送接口函數(shù)定義:

          void tftpReadQuerry(void);

          該函數(shù)用于終端發(fā)送讀文件請求,數(shù)據(jù)采集設(shè)備收到該包將發(fā)送文件數(shù)據(jù)包給終端;

          ②數(shù)據(jù)包接收接口函數(shù)定義:

          void tftp_recvpacket(void);

          該函數(shù)用于接收數(shù)據(jù)采集設(shè)備發(fā)送到的包,根據(jù)包類型分別對ERROR包、DATA包進(jìn)行處理。如果是ERROR包則需要重新傳輸文件,本次傳輸失敗。如果是DATA包,則校驗(yàn)后根據(jù)包號存儲到FLASH指定位置,然后調(diào)用發(fā)送ACK函數(shù)回復(fù)ACK。掉包、錯包等的錯誤處理也在該函數(shù)執(zhí)行;

          ③ACK發(fā)送接口函數(shù)定義:

          void tftpSendAck(unsigned char BlockNo[2]);

          該函數(shù)用于根據(jù)接收到的包的編號回復(fù)ACK。

          ④ERROR包接口函數(shù)定義:

          void tftpSendErr(unsigned char BlockNo[2]);

          該函數(shù)用于返回傳輸錯誤信息。

          文件傳輸實(shí)現(xiàn)流程如下:

          ①數(shù)據(jù)采集設(shè)備在端口為69的UDP上等待終端發(fā)出讀文件請求包;

          ②終端通過UDP發(fā)送符合TFTP請求格式的RRQ包給數(shù)據(jù)采集設(shè)備;

          ③數(shù)據(jù)采集設(shè)備收到終端的這個請求包后,將直接發(fā)送DATA包給終端,這個DATA包中含數(shù)據(jù)采集設(shè)備選擇的TID作為UDP的源端口和終端的TID作為UDP目標(biāo)端口,起始包號為1,往后包號逐次加1。

          ④終端接收來自數(shù)據(jù)采集設(shè)備的DATA包并回復(fù)ACK。直到請求完成。

          傳輸過程中的掉包或包錯誤會導(dǎo)致重傳,重傳不超過三次,否則認(rèn)為傳輸失敗。傳輸過程中的錯誤,會觸發(fā)發(fā)送ERROR包。ERROR包的錯誤代碼值供程序員分析使用。

          (4)拷貝軟件到應(yīng)用程序區(qū)

          軟件正確的下載到臨時區(qū)后,需要拷貝到應(yīng)用程序區(qū)。該部分關(guān)鍵部分在于內(nèi)嵌FLASH的擦除與讀寫。

          F107內(nèi)嵌FLASH是通過分頁機(jī)制來實(shí)現(xiàn)對尋址空間的擴(kuò)展和FLASH頁面的使用和管理的。所以對FLASH的擦除操作需要按頁進(jìn)行擦除。即擦除FLASH不能擦除某一字節(jié)或一次擦除小于一頁(2048字節(jié))。

          FLASH擦除的具體步驟:

          ①解鎖FLASH編程控制寄存器;

          ②定位要擦除的扇區(qū);

          ③寫扇區(qū)擦除命令;

          ④等待命令執(zhí)行完成;

          ⑤鎖定FLASH編程控制寄存器。

          對FLASH執(zhí)行寫操作步驟如下:

          ①解鎖FLASH編程控制寄存器;

          ②向指定的地址寫若干字?jǐn)?shù)據(jù);

          ③等待上一條命令執(zhí)行完成;

          ④如果未寫完數(shù)據(jù),則遞增源地址和目標(biāo)地址,重復(fù)步驟②和③;

          ⑤鎖定FLASH編程控制寄存器。

          (5)軟件跳轉(zhuǎn)應(yīng)用程序區(qū)

          應(yīng)用程序準(zhǔn)備好后,程序需要從BOOT區(qū)跳轉(zhuǎn)到應(yīng)用程序區(qū)首地址處執(zhí)行應(yīng)用程序。這里分為兩步:

          ①修改中斷向量表位置。由于F107采用ARM Cortex—M3內(nèi)核,該內(nèi)核的系統(tǒng)控制空間中寫中斷向量表的寄存器地址NVIC_VectTaD_ Addr為0xE000ED08,在該地址寫入應(yīng)用程序起始地址即可,本程序應(yīng)用程序起始地址APP_START_ADDRESS為0x08005000。設(shè)計(jì)如下:

          ldr r0,=0x08005000

          ldr r1,=0xe000ed08

          Str r0, [r1]

          ②跳轉(zhuǎn)到應(yīng)用程序首地址處執(zhí)行應(yīng)用程序。該步驟完成堆棧指針和程序指針(PC)的修改。在上述匯編代碼之后,通過以下方式實(shí)現(xiàn):

          ;從應(yīng)用程序向量表中載入堆棧指針

          ldr r1, [r0]

          mov sp,r1

          ;從應(yīng)用程序向量表中初始化程序指針(PC),并跳轉(zhuǎn)到應(yīng)用程序

          ;入口

          ldr r0, [r0,#4]

          bx r0

          為保證軟件升級錯誤不導(dǎo)致系統(tǒng)崩潰,將終端程序隔離為引導(dǎo)程序(BOOT區(qū)程序)及應(yīng)用程序兩部分,如單次軟件升級失敗仍可進(jìn)行再次升級。兩部分程序分別在Keil中編譯,并把BOOT區(qū)程序燒寫在FLASH首地址0x08005000處,以便終端啟動直接進(jìn)入BOOT區(qū)。用于應(yīng)用程序編譯夾梟瓚ㄉ招吹刂肺應(yīng)用程序區(qū)首地址,并生成bin文件以便直接下載到FLASH中即可運(yùn)行。

          結(jié)語

          該方法實(shí)現(xiàn)了采用通信方式,通過TFTP協(xié)議將編譯后的軟件文件下載到終端設(shè)備,完成軟件升級的功能。在嵌入式系統(tǒng)領(lǐng)域,程序升級可以方便地對程序缺陷進(jìn)行彌補(bǔ)和修改,或?qū)Τ绦蚬δ苓M(jìn)行擴(kuò)充,運(yùn)用該方法可極大提高產(chǎn)品的生存周期,節(jié)省對項(xiàng)目的維護(hù)成本和提高了開發(fā)效率。

          基于該方法已成功設(shè)計(jì)出可遠(yuǎn)程程序的車輛管理系統(tǒng)。使用情況表明,該系統(tǒng)能穩(wěn)定、可靠地工作,且為系統(tǒng)的維護(hù)節(jié)省了大量的工作量,對同類型的軟件設(shè)汁有很好的參考價值。


          上一頁 1 2 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();