<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 電源與新能源 > 設計應用 > 嵌入式多節點(diǎn)的無(wú)線(xiàn)批量程序更新系統設計(一)

嵌入式多節點(diǎn)的無(wú)線(xiàn)批量程序更新系統設計(一)

作者: 時(shí)間:2018-08-31 來(lái)源:網(wǎng)絡(luò ) 收藏

  一 總體設計和平臺簡(jiǎn)介

本文引用地址:http://dyxdggzs.com/article/201808/388163.htm

  項目旨在實(shí)現多ARM節點(diǎn)通過(guò)無(wú)線(xiàn)通信完成對批量節點(diǎn)的程序燒錄,如圖2.1所示。系統分為上位機、發(fā)射接收模塊和待燒錄節點(diǎn)三個(gè)部分,上位機通過(guò)ID號選擇待燒錄節點(diǎn)并通過(guò)無(wú)線(xiàn)模塊向下廣播燒錄數據,各被選擇節點(diǎn)通過(guò)無(wú)線(xiàn)模塊接收燒錄數據檢查無(wú)誤后存儲。上位機軟件設定待燒錄節點(diǎn)的ID、燒錄文件目錄、發(fā)送數據包大小、發(fā)送速率等參數后將數據打包傳送到基站,基站通過(guò)無(wú)線(xiàn)發(fā)射模塊廣播數據。

  整體思想是利用已有的代碼和目標代碼進(jìn)行比較。將兩者的差異通過(guò)無(wú)線(xiàn)網(wǎng)絡(luò )(802.15.4)廣播出去。在每個(gè)接受節點(diǎn)根據收到的差異文件(也就是補丁文件patch),對原有代碼進(jìn)行修改(patching的過(guò)程)以達到更新程序的目的。

  總體上來(lái)說(shuō)本項目有兩大難點(diǎn),涉及到巧妙的算法設計。

  1、如何用盡可能少的字節數,來(lái)表示不同代碼之間的差異?

  2、如何確??煽啃詡鬏?

  關(guān)于問(wèn)題1,我們知道要待傳輸的字節數越少,對通信的要求越低。更新程序的效率也會(huì )更高。而且少的字節數也意味著(zhù)丟更少的包。關(guān)于問(wèn)題2,由于我們是要對代碼進(jìn)行修正,所以一個(gè)字節的錯誤可能就會(huì )造成整個(gè)程序的崩潰。這對嵌入式程序,特別是運行在成千上萬(wàn)個(gè)節點(diǎn)上的程序是不可接受的,必須保證100%的正確接受。除此兩大難點(diǎn)(也是關(guān)鍵點(diǎn))之外,還有一些別的附加要求。如果滿(mǎn)足了能夠提高系統的持久性。分別是:

  1、使用盡可能小的RAM。因為嵌入式芯片的RAM普遍珍貴。

  2、消耗盡可能少的能量。

  3、更新速度盡可能的快。

  項目使用的硬件平臺是我們自制的智能小車(chē)eMouse 。平臺采用 TI公司32位Stellaris LM3S1968微處理器,工作頻率為50MHz,內含256 KB單周期Flash和64 KB單周期SRAM,flash支持可由用戶(hù)管理的塊保護和數據編程;板上Zigbee模塊通過(guò)串口與CPU通信,模塊僅提供MAC層服務(wù),CPU與模塊間以MAC幀的形式通過(guò)串口傳遞數據。eMouse外觀(guān)如圖2.2所示。

  項目開(kāi)發(fā)系統環(huán)境為Ubuntu9.04,程序編譯和下載工具分別為開(kāi)源的sourcery G++和Openocd,用戶(hù)界面采用java語(yǔ)言編寫(xiě)。

  以下章節將對系統設計作詳盡的論述。

  二 程序更新設計與實(shí)現

  一些傳統的更新方法注重代碼本身的特點(diǎn)。比如以函數為基本的更新單位。在每個(gè)節點(diǎn)上運行一個(gè)動(dòng)態(tài)鏈接器,將新的函數重新鏈接到原程序。其實(shí)代碼本身可以將其視為一串二進(jìn)制的文本文件。代碼的更新即是從一串舊的文本更新為一串新的文本。

  為此我們定義了一系列基本的更新操作命令,以及兩個(gè)輔助的索引指針:in_index以及out_index。in_index代表輸入文件當前的索引值,而out_index代表輸出文件當前的索引值。

  基本的命令如下:

  Copy:將in_index所指的字節復制到out_index處,并且in_index和out_index分別加1。

  Replace A:將當前out_index所指的字節用A來(lái)替換,并且in_index和out_index分別加1。

  Delete:in_index加1,out_index不變。實(shí)際為刪除in_index所指的字節

  Insert A:在當前out_index處插入A,in_index不變,out_index加1。

  Kill:表示刪除in_index后所有的原程序代碼。

  其中包含了如下的子問(wèn)題:

  2.1 命令的表示

  通過(guò)上面所說(shuō)的基本命令的組合,我們可以表示出從一個(gè)舊文件到一個(gè)新文件的過(guò)程。隨之帶來(lái)了一個(gè)問(wèn)題。這些命令應該如何表示才能盡可能的降低補丁文件(命令的組合)的大小?

  有幾個(gè)需要注意的地方:

  如果有連續的Copy命令,我們可以將其合并成一條命令,只要在Copy后加上表示長(cháng)度的Length參數即可。

  同理,如果有連續的Delete命令,也可以將其合并成一條命令,只要在Delete后加上表示長(cháng)度的Length參數即可。

  如果可以利用Replace命令,就不要用Delete和Insert命令的組合。這其實(shí)是另一重要的子問(wèn)題:如何根據這些命令產(chǎn)生盡可能少補丁文件?

  有五條基本命令,這樣為了區別這五條命令,至少需要3個(gè)比特。

  由于大多數情況下,更新的大多數是程序的參數。也就是說(shuō)Copy命令的數目遠遠大于其他命令。我們定義這5條命令如下表所示:

表3.1

命令

操作碼(最左端開(kāi)始)

操作數的長(cháng)度(緊跟操作碼)

總長(cháng)度(字節)

Copy

1

15

2

Delete

000

13

2

Replace

001XXXXX

8

2

Insert

010XXXXX

8

2

Kill

011XXXXX

8

2


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞:

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>