在嵌入式開發(fā)中,設計文檔和系統(tǒng)架構圖是溝通需求、梳理邏輯的核心工具。
但傳統(tǒng)的拖拽式繪圖工具效率低、難以維護,而PlantUML通過代碼生成圖表的方式,完美解決了這一問題。
它不僅支持UML圖,還能繪制網(wǎng)絡拓撲、狀態(tài)機等嵌入式常用圖表,代碼即文檔,版本可控!
今天我們就來分享如何用PlantUML進行嵌入式圖表設計!
一、plantuml環(huán)境
我們可以使用plantuml在線服務器,也可以自己安裝本地環(huán)境。
1、plantuml在線服務器
在線服務器提供了個很簡潔的界面,在編輯區(qū)編寫plantuml代碼,對應地就能顯示繪圖效果;可以導出PNG、SVG、ASCII Art三種格式。
http://www.plantuml.com/plantuml/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa700001
2、本地環(huán)境
我們可以搭建本地環(huán)境:VSCode中安裝plantuml 插件。
搭建本地環(huán)境需要依賴Java與GraphViz:
plantuml快速入門指南:https://plantuml.com/zh/starting
java:https://www.oracle.com/java/technologies/downloads
graphviz:https://graphviz.org/download/
二、繪制時序圖
在我們嵌入式中,常常需要梳理各種業(yè)務流程的時序。
比如嵌入式設備與傳感器、外設的通信協(xié)議解析。
假設需要通過I2C讀取溫濕度傳感器的數(shù)據(jù),時序圖可清晰展示主從設備交互,PlantUML代碼示例如:
@startumlparticipant MCU as "主控MCU"participant Sensor as "溫濕度傳感器"MCU -> Sensor: 發(fā)送啟動信號(START)MCU -> Sensor: 發(fā)送設備地址(0x44)activate Sensor #LightBluealt 地址匹配成功 Sensor --> MCU: ACK響應 MCU -> Sensor: 讀取溫濕度寄存器 Sensor --> MCU: 發(fā)送數(shù)據(jù)字節(jié)(2 Bytes)else 地址不匹配 Sensor --> MCU: NACK響應 MCU -> MCU: 錯誤處理enddeactivate Sensor@enduml
效果:
圖中展示了I2C通信的啟動、尋址、數(shù)據(jù)傳輸和異常處理流程,箭頭方向明確,邏輯一目了然。
代碼解讀:
1、起始、結束聲明
@startuml@enduml
2、參與者定義
participant MCU as "主控MCU"participant Sensor as "溫濕度傳感器"
3、消息交互
MCU -> Sensor: 發(fā)送啟動信號(START)MCU -> Sensor: 發(fā)送設備地址(0x44)
->
表示從一個參與者向另一個參與者發(fā)送消息的箭頭。
4、激活參與者
activate Sensor #LightBlue
activate
關鍵字用于激活一個參與者,表示該參與者開始處理接收到的消息。#LightBlue
是給激活狀態(tài)添加的顏色,這里將溫濕度傳感器的激活狀態(tài)標記為淺藍色,方便在可視化的時序圖中區(qū)分。
5、條件分支處理
alt 地址匹配成功 Sensor --> MCU: ACK響應 MCU -> Sensor: 讀取溫濕度寄存器 Sensor --> MCU: 發(fā)送數(shù)據(jù)字節(jié)(2 Bytes)else 地址不匹配 Sensor --> MCU: NACK響應 MCU -> MCU: 錯誤處理end
alt
和else
關鍵字用于創(chuàng)建條件分支,根據(jù)不同的條件執(zhí)行不同的操作。
6、 停用參與者
deactivate Sensor
deactivate
關鍵字用于停用一個參與者,表示該參與者完成了當前的處理任務。這里表示溫濕度傳感器處理完與主控 MCU 的通信交互,結束激活狀態(tài)。
三、繪制狀態(tài)機圖
在嵌入式開發(fā)中,常常使用使用狀態(tài)機模型來管理系統(tǒng)的復雜行為,確保邏輯清晰且可靠。
嵌入式設備的狀態(tài)管理,如低功耗模式切換、故障恢復機制。
如智能手表的電源狀態(tài)切換(運行、休眠、充電、故障),PlantUML代碼示例如:
@startumlstate "休眠" as Sleepstate "運行" as Activestate "充電" as Chargingstate "故障" as Error[*] --> Sleep : 上電初始化Sleep --> Active : 用戶按鍵喚醒Active --> Sleep : 無操作超時Active -right-> Charging : 插入充電器Charging --> Active : 充滿電Active --> Error : 硬件異常Error --> [*] : 重啟復位@enduml
代碼解讀:
1、狀態(tài)定義
state "休眠" as Sleepstate "運行" as Activestate "充電" as Chargingstate "故障" as Error
state
關鍵字用于定義狀態(tài)圖中的狀態(tài)。
2、初始狀態(tài)及狀態(tài)轉換
[*] --> Sleep : 上電初始化
[*]
表示狀態(tài)圖的初始狀態(tài),即設備的起始點。-->
表示狀態(tài)之間的轉換箭頭。: 上電初始化
是轉換的觸發(fā)條件。整個語句表示設備上電后,首先進行初始化操作,然后進入 “休眠” 狀態(tài)。
通過代碼定義狀態(tài)轉移條件,方便迭代修改,避免圖形拖拽導致的錯位問題。
四、類圖
類圖是描述嵌入式系統(tǒng)中各個類以及它們之間關系的一種重要工具。例如,對于一個智能溫度控制系統(tǒng),需要考慮溫度傳感器、微控制器、顯示器、按鍵等實體,以及它們之間的數(shù)據(jù)傳輸和控制關系。PlantUML代碼示例如:
@startumlclass TemperatureSensor { - temperatureValue: float + readTemperature(): float}class MicroController { - processedData: float + processData(temperature: float): void + controlOutput(): void}class Display { - displayMode: int + showData(data: float): void}class Button { - buttonState: bool + checkButtonState(): bool}TemperatureSensor "1" --> "1" MicroController : sends dataMicroController "1" --> "1" Display : sends dataMicroController "1" --> "1" Button : checks state@enduml
五、其它圖表
1、部署圖
嵌入式系統(tǒng)中,部署圖需要展示硬件節(jié)點和軟件組件的分布情況。常見的應用場景可能有智能家居、工業(yè)控制、車載系統(tǒng)等。
嵌入式系統(tǒng)的硬件連接拓撲,如物聯(lián)網(wǎng)網(wǎng)關的模塊部署。 智能家居網(wǎng)關連接示意圖PlantUML代碼示例如:
@startumlnwdiag { network SmartHome { address = "192.168.1.x/24" gateway [address="192.168.1.1", description="主控單元"]; zigbee [address="192.168.1.2", description="Zigbee協(xié)調(diào)器"]; sensor1 [address="192.168.1.3", description="溫度傳感器"]; sensor2 [address="192.168.1.4", description="人體紅外"]; }}@enduml
2、活動圖
嵌入式系統(tǒng)啟動自檢、中斷處理流程。 設備上電自檢(POST)流程活動圖:
@startumlstart:上電初始化;if (電源電壓正常?) then (是) :初始化外設; if (內(nèi)存校驗通過?) then (是) :加載固件; :啟動主任務; else (否) #red:觸發(fā)看門狗復位; endifelse (否) #red:進入安全關機模式;endifstop@enduml
用PlantUML讓你的嵌入式設計既專業(yè)又高效,從此告別“畫圖兩小時,改圖一整天”!