feat: deep dive the GUI part#11
Merged
Merged
Conversation
model/view/panels 分层 + dock 框架 + 调速 + 持续 blink + Session 单测 的分层与设计决策落纸;为 ABC 深化铺地基。反汇编器后置到下里程碑。
新增 BoardView(QPainter 自定义 widget)作 central 主视觉:画 LQFP 芯片体 + 右侧 PA5/PA0 → LED1/LED2、PA9/PA10 → UART TX/RX、左侧 PA13/PA14 → SWD、底部 PC13 板载 LED。LED 按 GPIO ODR bit 亮灭—— 模拟器知道每个引脚电平,这是相对真机调试器的独门卖点。serial 从 central 降到底 dock 跟 GPIO 并排。只读输出,引脚输入注入归 A2。 验证:GUI 编译 + offscreen smoke(F103.axf 跑 3s 不崩)+ ctest 359 绿。
MainWindow 构造末尾 restoreGeometry/restoreState 从 QSettings 恢复上次 窗口几何 + dock 布局;closeEvent 里 saveGeometry/saveState 存盘。所有 dock 已 setObjectName(含新 serial_dock),restoreState 据此还原位置; 首次启动无存档则保持默认布局。用户拖好的面板下次启动原样还原。 验证:GUI 编译 + offscreen smoke(restore 路径不崩)+ ctest 359 绿。
SerialPanel 加 QLineEdit 输入框(回车 → inputSubmitted signal), GpioPanel 加 PA0/PC13 toggle 按钮(点击 → gpioInputRequested signal); 都经 MainWindow 转发到 Session.inject_rx / simulate_gpio_input, panel 只发信号不碰 simulator,保持 view/model 解耦。底层复用现成的 Stm32f1Usart::inject_rx / Stm32f1Gpio::simulate_input。 补 3 个 Session 单测(valid/invalid 注入安全),test floor 357→360。 验证:GUI 编译 + offscreen 不崩 + ctest 362 绿(core + gui 双 build)。
ClockSnapshot(sysclk/hclk/apb1/apb2)加入 IntrospectionSnapshot, read_introspection 经 SimulationCoordinator→VirtualClock 取三域频率; HCLK 暂报 SYSCLK(AHB prescaler 未建模)。新增 ClockPanel 面板 (SYSCLK→HCLK→APB1/APB2 树形 MHz 显示)接到右 dock。时钟树是 STM32 最难讲的概念,这是教学利器。 补 introspection 单测(默认 HSI 8MHz 三域全 8/8/8)。 验证:core+gui 编译 + offscreen 不崩 + ctest 363 绿。
Session::read_memory(addr,len) 经 tools::memory_dump 从 SoC 总线读内存 返回 hex dump 文本。新增 MemoryPanel:地址输入框(hex,回车跟踪)+ hex dump 显示;MainWindow 每 tick 读 64 字节回填,addr 改了立刻刷。让用户 能盯着某段内存看固件运行时的变化。反汇编仍后置(下里程碑)。 补 2 个 Session 单测(read_memory valid 返回 dump / invalid 返回空)。 验证:core+gui 编译 + offscreen 不崩 + ctest 365 绿。
新增 `micro-forge probe <firmware>` 子命令:enable_probe_mode 后跑固件, missing opcode 被 skip 并记录(不 fault),跑完去重列出 unique 未实现 指令 + 执行次数 + 首次 PC。模拟器相对真机调试器的独门卖点——真机 跑起来才知道缺啥,probe 直接告诉你模拟器还差哪些指令。 补 2 个 CLI 测试(probe hello 全覆盖 / probe 0xFFFF 验能发现 missing)。 验证:CLI 编译 + 手动 probe F103.axf 报 full coverage + ctest 367 绿。
set_nvic/set_scb 是裸指针 setter,看似违反 DIRECTIVES §A WeakPtr 铁律。 调研确认:NVIC/SCB 与 CPU 同属 SoC(同生共死)、无循环引用(NVIC→CPU 已 是 callback/WeakPtr)、用在异常路径非每指令热路径——bus_ 注释早已论证 过同一 pattern。故收口为文档标注(不机械改 WeakPtr,那纯属 churn 无 收益):set_nvic/set_scb 加注释 + notes 041 记录决策。DIRECTIVES §A 加例外澄清(gitignored 内部文档)。纯注释/文档改动,无逻辑变更。 验证:cortex_m3.hpp 重编 + ctest 367 绿。
ci.yml apt install 加 qemu-system-arm。test/CMakeLists 的 find_program (qemu-system-arm) 找到后自动配置 oracle_cortex_m3 test(同份固件在 QEMU 参考 Cortex-M3 下跑 + 比对行为),否则 self-skip(exit 77)。之前 CI 没装 qemu,oracle 只本机跑。oracle RUN_SERIAL(不并发)。 验证:本地 qemu 已装 + oracle Passed;CI 装 qemu-system-arm(同包)后 同行为,CI 实跑待 push 后确认。
重构:BoardView 移到 gui/view/widgets/stm32_board_widget.{hpp,cpp},类名
BoardView → Stm32BoardWidget(用户要 widget 独立目录)。
LED 通用化(修用户实测看不到灯转):原来固定 PA5/PA0/PC13 三个 LED,
gpio_blink 用 PA5 能看,但 F103 示例翻 PA1 看不到(没画)。改成 PA0-PA7
一排 LED,任何固件翻哪个 PA pin 都显示——F103 PA1 / gpio_blink PA5 全
覆盖。顺带修 toolbar saveState 警告(setObjectName("main_toolbar"))。
验证:build + offscreen(blink.elf)+ ctest 367 全绿。LED 翻转靠 sim 层
(E2E.GpioBlink 已证 PA5 翻 6 次/4M 步)+ 切 25× 档肉眼可见。
toggle 按钮调 simulate_input 改的是 GPIO 输入寄存器(IDR),但面板和 板子显示的是输出寄存器(ODR)——注入输入不改输出,且演示固件(blink) 根本不读 IDR,所以按钮无可见效果(用户实测 PA0/PC13 都没翻)。这是 A2 当时想当然的设计失误。移除按钮 + gpioInputRequested signal + toggle 状态,gpio_panel 回纯 ODR 显示。Session::simulate_gpio_input 保留(语义 没错,是给读 IDR 的固件注入外部信号,只是演示固件不读)。 验证:build + offscreen + ctest 367 绿。
实测 4M 步翻 PA5 共 40 次(10 万步/翻),原断言 >=6 远低于实际、藏回归。 收紧到 >=25(实际 40,留 buffer)。加 cout 打印实际值,blink 频率可观察: 1× 档 250ms/翻(~4Hz),跟用户实测 ~300ms 吻合。 验证:ctest 367 绿 + GpioBlink 单跑打印 "40 toggles"。
这一轮 9 项(A1-A4/B1/C2/C3/C4-mem)+ 3 follow-up 的设计决策、陷阱、 验证落纸(L8 纪律)。BoardView PA0-7 通用化、GPIO toggle 移除(IDR vs ODR)、set_nvic 收口、时钟树、内存视图、probe mode 都记。B2 DMA/SPI + 反汇编后置记录在案。
CI 只装了 gcc-arm-none-eabi(不含 gdb)+ qemu,oracle_cortex_m3 需 gdb 连 QEMU gdbstub 验证 Tier-1 语义,缺 gdb 自跳失败。apt 加 gdb-multiarch + Test 步骤设 ARM_GDB=gdb-multiarch(oracle 脚本默认找 arm-none-eabi-gdb, ubuntu 无该包,override 成 gdb-multiarch)。 实测失败日志:'skip: required tool arm-none-eabi-gdb not found on PATH'。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.