Files
STM32F4-Base/docs/images/架构总览_端到端链路.svg
T
wandering1 045ca7f688 docs(配图): 端到端链路鸟瞰进生成器体系,补大图碰撞审计判据
把 archify 出的交互架构图落回仓内可复现形态,避免 docs/ 里出现「没有生成器的
SVG」:

- 新生成器 tools/arch_diagram/gen_arch_endtoend_svg.py → docs/images/架构总览_
  端到端链路.svg(42 框 / 37 边 / 5 条纵带,线型分数据·命令·屏障心跳三类);
  数据全部内嵌在 .py 里(generated-fresh 只把单个 gen_*.py 拷进临时目录重跑,
  外部 JSON 输入会 rc≠0 假红),SVG 内不含时间戳/commit/绝对路径
- docs/架构设计/项目架构总览.md 新增 §1.3 挂图并写清与 §1 分层图的分工
  (那张答「谁在哪一层」,这张答「一条数据走到底穿过谁」;纵带只是列分组,
  依赖方向仍以 §1.1 表与 layer-deps 门禁为准),版本 v1.2 → v1.3
- 两处生成器清单登记:tools/arch_diagram/README.md 脚本一览、
  docs/架构设计/图形绘制流程.md 的选型表与产物对照表
- draw-diagram skill 新增 §三b(大图碰撞审计判据 + 两条几何纪律)+
  reference/svg-collision-audit.py(拷进 ci-artifacts 用,刻意不进 tools/)

本窗实测(都已写进 skill):42 框 37 边的图缩略目检看着干净,解析式审计一眼
报出 23 条——边标签文字盒压到节点框会被后画的节点白底吃掉半个字(「串行执行」
渲染成「行执行」);根因是同行两框走了「同轴加一段走廊」的通用规则,产出退化
四点折线,把标签落点推到第一半中点。修法:同轴且已对齐直接返回两点线,标签
落点改按总弧长取 50%。

零余量第二遍(用生成器自己的 Box/route/label_at 真值扫,框不膨胀不内缩)又抓到
两处近失:「TRGO 触发」「帧 B 下发」与相邻框只剩 0.7px / 1.5px,缩成「TRGO」
「帧 B」后最紧余量升到 3.5px;同一遍还纠正了审计器自己的错——`hi > y0` 误写成
`hi > x0` 凭空报 3 条穿框,差点重排三条边的走线,所以判据里加了「先验审计器
本身再信 0 条」。

自查:连跑两次产物 sha1 不变;scripts/check_generated_fresh.py rc=0(25 生成器
/ 21 一致 / 4 在只减不增基线内);碰撞审计 rc=0(0 条);生成器无 OVERFLOW;
doc-links --sections-strict 逐篇 rc=0;mermaid-syntax / nested-comment /
skill-size / bom-drift 无新发;改动文件字节体检干净;/keil-build 0 错 0 警。
2026-10-30 15:59:24 +08:00

285 lines
46 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<svg xmlns="http://www.w3.org/2000/svg" width="1192" height="1042" viewBox="0 0 1192 1042" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif">
<defs><marker id="ar-d" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse"><path d="M0 0 L10 5 L0 10 z" fill="#334155"/></marker><marker id="ar-c" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse"><path d="M0 0 L10 5 L0 10 z" fill="#64748b"/></marker><marker id="ar-e" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse"><path d="M0 0 L10 5 L0 10 z" fill="#7c3aed"/></marker></defs>
<rect x="0" y="0" width="1192" height="1042" fill="#ffffff"/>
<text x="34.0" y="34.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="20" fill="#0f172a" text-anchor="start" font-weight="bold">STM32F407ZGTx 工业 DTU 平台 · 端到端链路总览</text>
<text x="34.0" y="55.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="12.5" fill="#475569" text-anchor="start" font-weight="normal">一个电气量从引脚到 104 报文 / 显存 / 记录文件穿过的框,与「谁在什么时候被谁唤醒」;分层归属与层内模块清单见 项目架构总览.svg,本图只画链路与握手</text>
<rect x="34.0" y="104.0" width="174.0" height="874.0" rx="10" fill="#f1f5f9" stroke="#475569" stroke-width="1.1" fill-opacity="0.50"/>
<text x="44.0" y="123.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="13.5" fill="#475569" text-anchor="start" font-weight="bold">片外硬件</text>
<text x="44.0" y="137.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="10.5" fill="#475569" text-anchor="start" font-weight="normal" fill-opacity="0.85">板级器件 · 不走软件分层</text>
<rect x="230.0" y="104.0" width="174.0" height="874.0" rx="10" fill="#fffbeb" stroke="#d97706" stroke-width="1.1" fill-opacity="0.50"/>
<text x="240.0" y="123.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="13.5" fill="#d97706" text-anchor="start" font-weight="bold">驱动层 Drivers/BSP</text>
<text x="240.0" y="137.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="10.5" fill="#d97706" text-anchor="start" font-weight="normal" fill-opacity="0.85">手写芯片驱动与总线</text>
<rect x="426.0" y="104.0" width="174.0" height="874.0" rx="10" fill="#f0fdf4" stroke="#16a34a" stroke-width="1.1" fill-opacity="0.50"/>
<text x="436.0" y="123.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="13.5" fill="#16a34a" text-anchor="start" font-weight="bold">中间件与算法</text>
<text x="436.0" y="137.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="10.5" fill="#16a34a" text-anchor="start" font-weight="normal" fill-opacity="0.85">取数 → 相量 → 快照</text>
<rect x="622.0" y="104.0" width="174.0" height="874.0" rx="10" fill="#f0fdfa" stroke="#0d9488" stroke-width="1.1" fill-opacity="0.50"/>
<text x="632.0" y="123.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="13.5" fill="#0d9488" text-anchor="start" font-weight="bold">任务编排与握手</text>
<text x="632.0" y="137.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="10.5" fill="#0d9488" text-anchor="start" font-weight="normal" fill-opacity="0.85">App/task · 就绪屏障</text>
<rect x="818.0" y="104.0" width="174.0" height="874.0" rx="10" fill="#fff1f2" stroke="#e11d48" stroke-width="1.1" fill-opacity="0.50"/>
<text x="828.0" y="123.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="13.5" fill="#e11d48" text-anchor="start" font-weight="bold">平台服务与数据落点</text>
<text x="828.0" y="137.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="10.5" fill="#e11d48" text-anchor="start" font-weight="normal" fill-opacity="0.85">记录 / 配置 / 网络门面</text>
<path d="M195.0 176.0 L243.0 176.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="200.5" y="168.8" width="37.0" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="219.0" y="179.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">8 路帧</text>
<path d="M243.0 268.0 L195.0 268.0" fill="none" stroke="#64748b" stroke-width="1.25" stroke-dasharray="5 3" marker-end="url(#ar-c)"/>
<rect x="204.5" y="260.8" width="29.0" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="219.0" y="271.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#64748b" text-anchor="middle">TRGO</text>
<path d="M391.0 176.0 L439.0 176.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="392.5" y="168.8" width="45.0" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="415.0" y="179.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">原子快照</text>
<path d="M349.6 239.0 L349.6 222.0 L480.4 222.0 L480.4 205.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="386.2" y="214.8" width="57.5" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="415.0" y="225.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">DMA 双缓冲</text>
<path d="M513.0 205.0 L513.0 239.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="490.5" y="214.8" width="45.0" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="513.0" y="225.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">语义通道</text>
<path d="M513.0 297.0 L513.0 331.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="500.0" y="306.8" width="26.0" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="513.0" y="317.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">相量</text>
<path d="M709.0 205.0 L709.0 239.0" fill="none" stroke="#64748b" stroke-width="1.25" stroke-dasharray="5 3" marker-end="url(#ar-c)"/>
<rect x="667.7" y="214.8" width="82.6" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="709.0" y="225.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#64748b" text-anchor="middle">1 kHz → 20 ms</text>
<path d="M483.4 389.0 L483.4 413.0 L709.0 413.0 L709.0 423.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="566.7" y="405.8" width="45.0" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="589.2" y="416.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">同一上游</text>
<path d="M685.3 331.0 L685.3 297.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="672.3" y="306.8" width="26.0" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="685.3" y="317.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">定值</text>
<path d="M735.6 423.0 L735.6 389.0" fill="none" stroke="#64748b" stroke-width="1.25" stroke-dasharray="5 3" marker-end="url(#ar-c)"/>
<rect x="714.4" y="398.8" width="42.5" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="735.6" y="409.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#64748b" text-anchor="middle">YK 请求</text>
<path d="M783.0 452.0 L831.0 452.0" fill="none" stroke="#64748b" stroke-width="1.25" stroke-dasharray="5 3" marker-end="url(#ar-c)"/>
<rect x="794.0" y="444.8" width="26.0" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="807.0" y="455.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#64748b" text-anchor="middle">脏段</text>
<path d="M783.0 268.0 L831.0 268.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="784.5" y="260.8" width="45.0" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="807.0" y="271.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">边沿投递</text>
<path d="M783.0 636.0 L831.0 636.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="784.5" y="628.8" width="45.0" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="807.0" y="639.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">唯一写者</text>
<path d="M762.3 665.0 L762.3 682.0 L869.5 682.0 L869.5 699.0" fill="none" stroke="#64748b" stroke-width="1.25" stroke-dasharray="5 3" marker-end="url(#ar-c)"/>
<rect x="791.9" y="674.8" width="48.0" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="815.9" y="685.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#64748b" text-anchor="middle">try 语义</text>
<path d="M195.0 544.0 L243.0 544.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="195.0" y="536.8" width="48.0" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="219.0" y="547.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">SPI 事务</text>
<path d="M391.0 544.0 L439.0 544.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="392.5" y="536.8" width="45.0" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="415.0" y="547.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">集中读清</text>
<path d="M587.0 544.0 L635.0 544.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="588.5" y="536.8" width="45.0" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="611.0" y="547.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">串行执行</text>
<path d="M783.0 544.0 L831.0 544.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="789.2" y="536.8" width="35.5" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="807.0" y="547.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">单连接</text>
<path d="M979.0 530.1 L1115.8 530.1 L1115.8 481.0" fill="none" stroke="#64748b" stroke-width="1.25" stroke-dasharray="5 3" marker-end="url(#ar-c)"/>
<rect x="1047.9" y="522.8" width="48.0" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="1071.9" y="533.5" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#64748b" text-anchor="middle">TCP 对端</text>
<path d="M195.0 636.0 L243.0 636.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="201.2" y="628.8" width="35.5" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="219.0" y="639.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">页读写</text>
<path d="M391.0 636.0 L439.0 636.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="397.2" y="628.8" width="35.5" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="415.0" y="639.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">逻辑块</text>
<path d="M587.0 636.0 L635.0 636.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="598.0" y="628.8" width="26.0" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="611.0" y="639.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">挂载</text>
<path d="M195.0 728.0 L243.0 728.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="204.5" y="720.8" width="29.0" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="219.0" y="731.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">I2C1</text>
<path d="M391.0 728.0 L439.0 728.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="402.0" y="720.8" width="26.0" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="415.0" y="731.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">墙钟</text>
<path d="M635.0 728.0 L587.0 728.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="588.5" y="720.8" width="45.0" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="611.0" y="731.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">收包对时</text>
<path d="M439.0 820.0 L391.0 820.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="401.2" y="812.8" width="27.5" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="415.0" y="823.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">帧 B</text>
<path d="M635.0 820.0 L587.0 820.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="598.0" y="812.8" width="26.0" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="611.0" y="823.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">灌数</text>
<path d="M783.0 820.0 L831.0 820.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="784.5" y="812.8" width="45.0" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="807.0" y="823.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">同一显存</text>
<path d="M243.0 820.0 L195.0 820.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="199.0" y="812.8" width="40.1" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="219.0" y="823.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">700000</text>
<path d="M673.5 849.0 L673.5 861.0 L486.4 861.0 L486.4 883.0" fill="none" stroke="#64748b" stroke-width="1.25" stroke-dasharray="5 3" marker-end="url(#ar-c)"/>
<rect x="537.9" y="853.8" width="74.1" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="574.9" y="864.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#64748b" text-anchor="middle">100 ms 喂心跳</text>
<path d="M726.8 849.0 L726.8 866.0 L709.0 866.0 L709.0 883.0" fill="none" stroke="#64748b" stroke-width="1.25" stroke-dasharray="5 3" marker-end="url(#ar-c)"/>
<rect x="700.1" y="858.8" width="35.5" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="717.9" y="869.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#64748b" text-anchor="middle">等就绪</text>
<path d="M783.0 912.0 L831.0 912.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="784.2" y="904.8" width="45.6" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="807.0" y="915.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">WaitAll</text>
<path d="M979.0 820.0 L1027.0 820.0" fill="none" stroke="#7c3aed" stroke-width="1.25" stroke-dasharray="1.5 3" marker-end="url(#ar-e)"/>
<rect x="980.5" y="812.8" width="45.0" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="1003.0" y="823.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#7c3aed" text-anchor="middle">同源像素</text>
<path d="M560.4 389.0 L560.4 400.0 L1118.8 400.0 L1118.8 389.0" fill="none" stroke="#7c3aed" stroke-width="1.25" stroke-dasharray="1.5 3" marker-end="url(#ar-e)"/>
<rect x="812.3" y="392.8" width="54.5" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="839.6" y="403.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#7c3aed" text-anchor="middle">纯逻辑直跑</text>
<path d="M709.0 941.0 L709.0 954.0 L317.0 954.0 L317.0 941.0" fill="none" stroke="#7c3aed" stroke-width="1.25" stroke-dasharray="1.5 3" marker-end="url(#ar-e)"/>
<rect x="490.5" y="946.8" width="45.0" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="513.0" y="957.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#7c3aed" text-anchor="middle">唤醒发送</text>
<path d="M979.0 464.8 L1008.8 464.8 L1008.8 636.0 L979.0 636.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="981.5" y="543.1" width="54.5" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="1008.8" y="553.8" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">唯一落盘者</text>
<path d="M88.4 883.0 L88.4 861.0 L284.4 861.0 L284.4 849.0" fill="none" stroke="#334155" stroke-width="1.35" marker-end="url(#ar-d)"/>
<rect x="158.9" y="853.8" width="45.0" height="14.5" rx="3" fill="#ffffff" fill-opacity="0.94"/><text x="181.4" y="864.4" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="middle">回调宿主</text>
<rect x="47.0" y="147.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#475569" stroke-width="1.3"/>
<rect x="47.0" y="147.0" width="3.5" height="58.0" rx="1.75" fill="#475569" stroke="#475569" stroke-width="0"/>
<text x="58.0" y="171.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">TPAFE5160 前端</text>
<text x="58.0" y="187.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">并行总线 · 8 路</text>
<rect x="47.0" y="239.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#475569" stroke-width="1.3"/>
<rect x="47.0" y="239.0" width="3.5" height="58.0" rx="1.75" fill="#475569" stroke="#475569" stroke-width="0"/>
<text x="58.0" y="263.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">片内 ADC1 + DMA</text>
<text x="58.0" y="279.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">TIM3 TRGO 乒乓</text>
<rect x="47.0" y="515.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#475569" stroke-width="1.3"/>
<rect x="47.0" y="515.0" width="3.5" height="58.0" rx="1.75" fill="#475569" stroke="#475569" stroke-width="0"/>
<text x="58.0" y="539.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">CH395F 以太网</text>
<text x="58.0" y="555.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">SPI 串行化</text>
<rect x="47.0" y="607.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#475569" stroke-width="1.3"/>
<rect x="47.0" y="607.0" width="3.5" height="58.0" rx="1.75" fill="#475569" stroke="#475569" stroke-width="0"/>
<text x="58.0" y="631.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">GD5F SPI NAND</text>
<text x="58.0" y="647.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">2 KB 页 · ECC</text>
<rect x="47.0" y="699.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#475569" stroke-width="1.3"/>
<rect x="47.0" y="699.0" width="3.5" height="58.0" rx="1.75" fill="#475569" stroke="#475569" stroke-width="0"/>
<text x="58.0" y="723.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">SD2506 RTC</text>
<text x="58.0" y="739.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">I2C1 硬件亚秒</text>
<rect x="47.0" y="791.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#475569" stroke-width="1.3"/>
<rect x="47.0" y="791.0" width="3.5" height="58.0" rx="1.75" fill="#475569" stroke="#475569" stroke-width="0"/>
<text x="58.0" y="815.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">屏板 160×160</text>
<text x="58.0" y="831.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">USART1 700000</text>
<rect x="47.0" y="883.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#475569" stroke-width="1.3"/>
<rect x="47.0" y="883.0" width="3.5" height="58.0" rx="1.75" fill="#475569" stroke="#475569" stroke-width="0"/>
<text x="58.0" y="907.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">RS-485 总线</text>
<text x="58.0" y="923.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">UART4 · 未接线(暂缓)</text>
<rect x="243.0" y="147.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#d97706" stroke-width="1.3"/>
<rect x="243.0" y="147.0" width="3.5" height="58.0" rx="1.75" fill="#d97706" stroke="#d97706" stroke-width="0"/>
<text x="254.0" y="171.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">TPAFE 驱动</text>
<text x="254.0" y="187.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">原子快照 snapshot</text>
<rect x="243.0" y="239.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#d97706" stroke-width="1.3"/>
<rect x="243.0" y="239.0" width="3.5" height="58.0" rx="1.75" fill="#d97706" stroke="#d97706" stroke-width="0"/>
<text x="254.0" y="263.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">ADC · TIM3 · DMA</text>
<text x="254.0" y="279.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">手写上电自校准</text>
<rect x="243.0" y="515.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#d97706" stroke-width="1.3"/>
<rect x="243.0" y="515.0" width="3.5" height="58.0" rx="1.75" fill="#d97706" stroke="#d97706" stroke-width="0"/>
<text x="254.0" y="539.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">CH395F 驱动</text>
<text x="254.0" y="555.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">中断集中读清</text>
<rect x="243.0" y="607.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#d97706" stroke-width="1.3"/>
<rect x="243.0" y="607.0" width="3.5" height="58.0" rx="1.75" fill="#d97706" stroke="#d97706" stroke-width="0"/>
<text x="254.0" y="631.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">NAND 驱动 + FTL</text>
<text x="254.0" y="647.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">ECC · BBT</text>
<rect x="243.0" y="699.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#d97706" stroke-width="1.3"/>
<rect x="243.0" y="699.0" width="3.5" height="58.0" rx="1.75" fill="#d97706" stroke="#d97706" stroke-width="0"/>
<text x="254.0" y="723.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">RTC 驱动 + 墙钟</text>
<text x="254.0" y="739.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">sys_clock epoch</text>
<rect x="243.0" y="791.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#d97706" stroke-width="1.3"/>
<rect x="243.0" y="791.0" width="3.5" height="58.0" rx="1.75" fill="#d97706" stroke="#d97706" stroke-width="0"/>
<text x="254.0" y="815.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">屏板链路驱动</text>
<text x="254.0" y="831.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">借道 RS485</text>
<rect x="243.0" y="883.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#d97706" stroke-width="1.3"/>
<rect x="243.0" y="883.0" width="3.5" height="58.0" rx="1.75" fill="#d97706" stroke="#d97706" stroke-width="0"/>
<text x="254.0" y="907.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">控制台 UART5</text>
<text x="254.0" y="923.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">4 KB 环形</text>
<rect x="439.0" y="147.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#16a34a" stroke-width="1.3"/>
<rect x="439.0" y="147.0" width="3.5" height="58.0" rx="1.75" fill="#16a34a" stroke="#16a34a" stroke-width="0"/>
<text x="450.0" y="171.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">语义取数层</text>
<text x="450.0" y="187.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">有效性 · 标定</text>
<rect x="439.0" y="239.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#16a34a" stroke-width="1.3"/>
<rect x="439.0" y="239.0" width="3.5" height="58.0" rx="1.75" fill="#16a34a" stroke="#16a34a" stroke-width="0"/>
<text x="450.0" y="263.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">全周傅氏相量</text>
<text x="450.0" y="279.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">ring → phasor</text>
<rect x="439.0" y="331.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#16a34a" stroke-width="1.3"/>
<rect x="439.0" y="331.0" width="3.5" height="58.0" rx="1.75" fill="#16a34a" stroke="#16a34a" stroke-width="0"/>
<text x="450.0" y="355.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">遥测快照双区</text>
<text x="450.0" y="371.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">测频 200 ms</text>
<rect x="439.0" y="515.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#16a34a" stroke-width="1.3"/>
<rect x="439.0" y="515.0" width="3.5" height="58.0" rx="1.75" fill="#16a34a" stroke="#16a34a" stroke-width="0"/>
<text x="450.0" y="539.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">NET 中间件</text>
<text x="450.0" y="555.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">socket · 挂起</text>
<rect x="439.0" y="607.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#16a34a" stroke-width="1.3"/>
<rect x="439.0" y="607.0" width="3.5" height="58.0" rx="1.75" fill="#16a34a" stroke="#16a34a" stroke-width="0"/>
<text x="450.0" y="631.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">FTL + FatFs</text>
<text x="450.0" y="647.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">dhara · 8.3 短名</text>
<rect x="439.0" y="699.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#16a34a" stroke-width="1.3"/>
<rect x="439.0" y="699.0" width="3.5" height="58.0" rx="1.75" fill="#16a34a" stroke="#16a34a" stroke-width="0"/>
<text x="450.0" y="723.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">对时协议</text>
<text x="450.0" y="739.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">推送写 RTC</text>
<rect x="439.0" y="791.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#16a34a" stroke-width="1.3"/>
<rect x="439.0" y="791.0" width="3.5" height="58.0" rx="1.75" fill="#16a34a" stroke="#16a34a" stroke-width="0"/>
<text x="450.0" y="815.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">LVGL + ui_port</text>
<text x="450.0" y="831.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">160×160 1bpp</text>
<rect x="439.0" y="883.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#16a34a" stroke-width="1.3"/>
<rect x="439.0" y="883.0" width="3.5" height="58.0" rx="1.75" fill="#16a34a" stroke="#16a34a" stroke-width="0"/>
<text x="450.0" y="907.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">IWDG + Fault</text>
<text x="450.0" y="923.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">心跳掩码</text>
<rect x="635.0" y="147.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#0d9488" stroke-width="1.3"/>
<rect x="635.0" y="147.0" width="3.5" height="58.0" rx="1.75" fill="#0d9488" stroke="#0d9488" stroke-width="0"/>
<text x="646.0" y="171.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">adcTask</text>
<text x="646.0" y="187.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">1 kHz 消费者</text>
<rect x="635.0" y="239.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#0d9488" stroke-width="1.3"/>
<rect x="635.0" y="239.0" width="3.5" height="58.0" rx="1.75" fill="#0d9488" stroke="#0d9488" stroke-width="0"/>
<text x="646.0" y="263.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">protectTask</text>
<text x="646.0" y="279.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">20 ms 判据</text>
<rect x="635.0" y="331.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#0d9488" stroke-width="1.3"/>
<rect x="635.0" y="331.0" width="3.5" height="58.0" rx="1.75" fill="#0d9488" stroke="#0d9488" stroke-width="0"/>
<text x="646.0" y="355.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">定值层</text>
<text x="646.0" y="371.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">prot_set 校验</text>
<rect x="635.0" y="423.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#0d9488" stroke-width="1.3"/>
<rect x="635.0" y="423.0" width="3.5" height="58.0" rx="1.75" fill="#0d9488" stroke="#0d9488" stroke-width="0"/>
<text x="646.0" y="447.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">iec104Task</text>
<text x="646.0" y="463.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">100 ms · :2404</text>
<rect x="635.0" y="515.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#0d9488" stroke-width="1.3"/>
<rect x="635.0" y="515.0" width="3.5" height="58.0" rx="1.75" fill="#0d9488" stroke="#0d9488" stroke-width="0"/>
<text x="646.0" y="539.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">netTask</text>
<text x="646.0" y="555.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">MsgQueue 深 8</text>
<rect x="635.0" y="607.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#0d9488" stroke-width="1.3"/>
<rect x="635.0" y="607.0" width="3.5" height="58.0" rx="1.75" fill="#0d9488" stroke="#0d9488" stroke-width="0"/>
<text x="646.0" y="631.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">defaultTask</text>
<text x="646.0" y="647.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">记录唯一写者</text>
<rect x="635.0" y="699.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#0d9488" stroke-width="1.3"/>
<rect x="635.0" y="699.0" width="3.5" height="58.0" rx="1.75" fill="#0d9488" stroke="#0d9488" stroke-width="0"/>
<text x="646.0" y="723.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">timeSyncTask</text>
<text x="646.0" y="739.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">等 NET_READY</text>
<rect x="635.0" y="791.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#0d9488" stroke-width="1.3"/>
<rect x="635.0" y="791.0" width="3.5" height="58.0" rx="1.75" fill="#0d9488" stroke="#0d9488" stroke-width="0"/>
<text x="646.0" y="815.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">uiTask</text>
<text x="646.0" y="831.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">唯一写侧</text>
<rect x="635.0" y="883.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#0d9488" stroke-width="1.3"/>
<rect x="635.0" y="883.0" width="3.5" height="58.0" rx="1.75" fill="#0d9488" stroke="#0d9488" stroke-width="0"/>
<text x="646.0" y="907.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">就绪屏障</text>
<text x="646.0" y="923.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">位组 · NoClear</text>
<rect x="831.0" y="239.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#e11d48" stroke-width="1.3"/>
<rect x="831.0" y="239.0" width="3.5" height="58.0" rx="1.75" fill="#e11d48" stroke="#e11d48" stroke-width="0"/>
<text x="842.0" y="263.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">SOE 事件</text>
<text x="842.0" y="279.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">soe.log 定长</text>
<rect x="831.0" y="331.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#e11d48" stroke-width="1.3"/>
<rect x="831.0" y="331.0" width="3.5" height="58.0" rx="1.75" fill="#e11d48" stroke="#e11d48" stroke-width="0"/>
<text x="842.0" y="355.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">定值落盘</text>
<text x="842.0" y="371.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">/prot_set.bin</text>
<rect x="831.0" y="423.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#e11d48" stroke-width="1.3"/>
<rect x="831.0" y="423.0" width="3.5" height="58.0" rx="1.75" fill="#e11d48" stroke="#e11d48" stroke-width="0"/>
<text x="842.0" y="447.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">配置引擎</text>
<text x="842.0" y="463.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">net_cfg · ftp_cfg</text>
<rect x="831.0" y="515.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#e11d48" stroke-width="1.3"/>
<rect x="831.0" y="515.0" width="3.5" height="58.0" rx="1.75" fill="#e11d48" stroke="#e11d48" stroke-width="0"/>
<text x="842.0" y="539.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">TCP 服务面</text>
<text x="842.0" y="555.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">:21 / :2404</text>
<rect x="831.0" y="607.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#e11d48" stroke-width="1.3"/>
<rect x="831.0" y="607.0" width="3.5" height="58.0" rx="1.75" fill="#e11d48" stroke="#e11d48" stroke-width="0"/>
<text x="842.0" y="631.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">文件系统落点</text>
<text x="842.0" y="647.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">/log · /wave</text>
<rect x="831.0" y="699.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#e11d48" stroke-width="1.3"/>
<rect x="831.0" y="699.0" width="3.5" height="58.0" rx="1.75" fill="#e11d48" stroke="#e11d48" stroke-width="0"/>
<text x="842.0" y="723.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">卷锁 + 账本</text>
<text x="842.0" y="739.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">三路 try 协定</text>
<rect x="831.0" y="791.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#e11d48" stroke-width="1.3"/>
<rect x="831.0" y="791.0" width="3.5" height="58.0" rx="1.75" fill="#e11d48" stroke="#e11d48" stroke-width="0"/>
<text x="842.0" y="815.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">一份显存三出</text>
<text x="842.0" y="831.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">屏板 · :7003</text>
<rect x="831.0" y="883.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#e11d48" stroke-width="1.3"/>
<rect x="831.0" y="883.0" width="3.5" height="58.0" rx="1.75" fill="#e11d48" stroke="#e11d48" stroke-width="0"/>
<text x="842.0" y="907.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">ftpTask</text>
<text x="842.0" y="923.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">lftpd 根 :21</text>
<rect x="1027.0" y="331.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#2563eb" stroke-width="1.3"/>
<rect x="1027.0" y="331.0" width="3.5" height="58.0" rx="1.75" fill="#2563eb" stroke="#2563eb" stroke-width="0"/>
<text x="1038.0" y="355.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">主机侧第三端</text>
<text x="1038.0" y="371.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">直打生产 .c</text>
<rect x="1027.0" y="423.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#2563eb" stroke-width="1.3"/>
<rect x="1027.0" y="423.0" width="3.5" height="58.0" rx="1.75" fill="#2563eb" stroke="#2563eb" stroke-width="0"/>
<text x="1038.0" y="447.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">上位侧对端</text>
<text x="1038.0" y="463.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">104 主站</text>
<rect x="1027.0" y="791.0" width="148.0" height="58.0" rx="7" fill="#ffffff" stroke="#2563eb" stroke-width="1.3"/>
<rect x="1027.0" y="791.0" width="3.5" height="58.0" rx="1.75" fill="#2563eb" stroke="#2563eb" stroke-width="0"/>
<text x="1038.0" y="815.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="11.5" fill="#0f172a" text-anchor="start" font-weight="bold">PC 模拟器</text>
<text x="1038.0" y="831.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#475569" text-anchor="start" font-weight="normal">SDL2 同源码</text>
<line x1="34" y1="994.0" x2="1162" y2="994.0" stroke="#cbd5e1" stroke-width="1"/>
<line x1="34.0" y1="997.0" x2="60.0" y2="997.0" stroke="#334155" stroke-width="1.35"/>
<text x="65.0" y="1001.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="start" font-weight="normal">数据 / 读写</text>
<line x1="143.5" y1="997.0" x2="169.5" y2="997.0" stroke="#64748b" stroke-width="1.35" stroke-dasharray="5 3"/>
<text x="174.5" y="1001.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="start" font-weight="normal">命令 · 请求 · 配置</text>
<line x1="296.6" y1="997.0" x2="322.6" y2="997.0" stroke="#7c3aed" stroke-width="1.35" stroke-dasharray="1.5 3"/>
<text x="327.6" y="1001.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="start" font-weight="normal">屏障位 · 心跳 · 同源镜像</text>
<rect x="478.1" y="991.0" width="11.0" height="11.0" rx="2.5" fill="#ffffff" stroke="#475569" stroke-width="1.2"/>
<text x="493.1" y="1001.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="start" font-weight="normal">片外硬件</text>
<rect x="547.1" y="991.0" width="11.0" height="11.0" rx="2.5" fill="#ffffff" stroke="#d97706" stroke-width="1.2"/>
<text x="562.1" y="1001.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="start" font-weight="normal">驱动</text>
<rect x="597.1" y="991.0" width="11.0" height="11.0" rx="2.5" fill="#ffffff" stroke="#16a34a" stroke-width="1.2"/>
<text x="612.1" y="1001.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="start" font-weight="normal">中间件与算法</text>
<rect x="685.1" y="991.0" width="11.0" height="11.0" rx="2.5" fill="#ffffff" stroke="#0d9488" stroke-width="1.2"/>
<text x="700.1" y="1001.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="start" font-weight="normal">任务与握手</text>
<rect x="763.6" y="991.0" width="11.0" height="11.0" rx="2.5" fill="#ffffff" stroke="#e11d48" stroke-width="1.2"/>
<text x="778.6" y="1001.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="start" font-weight="normal">服务与落点</text>
<rect x="842.1" y="991.0" width="11.0" height="11.0" rx="2.5" fill="#ffffff" stroke="#2563eb" stroke-width="1.2"/>
<text x="857.1" y="1001.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#334155" text-anchor="start" font-weight="normal">对外 / 同构端</text>
<text x="34.0" y="1016.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#64748b" text-anchor="start" font-weight="normal">口径:AGENTS.md「数据主线」+ docs/架构设计/项目架构总览.md(行号级证据在那份文档与代码里)。RS-485 采集未接线:rs485_task 有实现但不建任务,接线后数据进语义取数层;其余行为条件(未标定闭锁 / 就绪位 NoClear / CH395F 单连接 / V0.</text>
<text x="34.0" y="1028.0" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif" font-size="9.5" fill="#64748b" text-anchor="start" font-weight="normal">1 双转换器无共同采样触发)见正文,它们只改变判据与端口、不改变本图的框与连线。</text>
</svg>