1. 程式人生 > >嵌入式控制器分散式控制系統韌體更新方式探討

嵌入式控制器分散式控制系統韌體更新方式探討

機器人、AGV等自動化裝置,車身有大量嵌入式控制單元,開發及應用過程中有韌體更新需求。需要探討出一套通用的在應用程式設計模板。

其中涉及的通訊鏈路有: 乙太網 CAN UART
涉及應用層協議: TCP, UDP, TCP Modbus, CANopen, 485Modbus, 232Modbus以及一些開發者自定義的協議
在應用程式設計協議統一使用: ST IAP protocol
其中韌體更新所使用的程式為python指令碼。

其網路拓撲如下圖

裝置網路拓撲

對於一級裝置,可以直接由x86控制器或者交換機對外除錯口進行韌體更新。
對於二級裝置,需要通過一級裝置進行轉發,完成韌體更新功能。
本文主要討論的是二級裝置的韌體更新方式。

更新韌體的流程大致如下(以x86中執行pyscript,經一級裝置,更新232Modbus裝置的韌體為例):
1. pyscript傳送UDP指令,將一級裝置的232Modbus任務模式切換為透傳模式。
2. pyscript傳送UDP報文模擬Modbus指令,使二級裝置跳轉到 bootloader
3. pyscript傳送UDP報文模擬ST IAP Protocol, 對二級裝置進行韌體更新
4. pyscript傳送UDP報文模擬ST IAP Protocol, 修改二級裝置啟動選項
5. pyscript傳送UDP報文模擬ST IAP Protocol, 使二級裝置跳轉到應用層
6. pyscript傳送UDP指令,將一級裝置的透傳模式切換回232Modbus任務模式

為求通用性,將ST IAP Proto的裝置抽象為字元流裝置,chardev。
TCP UDP UART等介面均可直接抽象成對應的chardev。
對於CAN介面,將每幀8個位元組拼接,作為字元流裝置使用。

chardev的方法有:
chardev.open()
chardev.close()
chardev.read()
chardev.write()
chardev.ioctl()

將ST IAP Proto 本身的實現抽象為iapdev

iapdev的方法有:
iapdev.jumptoaddr(addr)
iapdev.getbootloaderversion()
iapdev.loadbin(filename, addr)
iapdev.readbin(filename, addr)
iapdev.readuint32(valueaddr)
iapdev.loaduint32(blockstartaddr, valueaddr)
iapdev.confirmack()
iapdev.forwardwrite(bytes)
iapdev.restorebootoption(blockstartaddr)

靜態方法
iapdev.getxor(bytes)
iapdev.getbytesfromuint32(bytes)
iapdev.isallbytes0xff(bytes)

和一級,二級裝置指令有關的方法有:
iapdev.setforwardmode()
iapdev.exitforwardmode()
iapdev.settaregetboardtobootloader()
iapdev.resettargetboard()

抽象後流程可以簡化成:
1. pyscript傳送一級裝置指令,將一級裝置的二級裝置任務模式切換為透傳模式。
2. pyscript傳送二級裝置指令,使二級裝置跳轉到 bootloader
3. pyscript傳送ST IAP Protocol, 對二級裝置進行韌體更新
4. pyscript傳送ST IAP Protocol, 修改二級裝置啟動選項
5. pyscript傳送ST IAP Protocol, 使二級裝置跳轉到應用層
6. pyscript傳送一級裝置指令,將一級裝置的透傳模式切換回二級裝置任務模式

可用函式描述為:
iapdev.setforwardmode()
iapdev.settargettobootloader()
iapdev.getbootloaderversion()
iapdev.loadbin(filename, *.bin)
iapdev.writeuint32(blockaddr, valueaddr)
iapdev.jumptoaddr(appaddr)
iapdev.exitforwardmode()

附:關於bootoption域的約定:
1. bootoption必須單獨佔一個flash block
2. bootoption所指明的啟動型別佔第一個uint32
3. bootoption的長度佔第二個uint32
4. bootoption的最後一個uint32_t為域的所有位元組的異或校驗和