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