Skip to content

嵌入式工具箱 v1.21.0:E13 + pico-sdk 生态(verify v1.16.0)

Choose a tag to compare

@liujycode liujycode released this 17 Oct 10:58
· 19 commits to main since this release

嵌入式工具箱 v1.21.0:E13 + pico-sdk 生态(verify v1.16.0)

这轮把"写 1 清零"(oneToClear)语义的规则补上(E13),并自己抓了 pico-sdk 真实语料做探雷,
顺带支持了 RP2040/pico-sdk 的三种真实写法。

一、E13:写 1 清零寄存器上的读改写

  • SVD 带 modifiedWriteValues="oneToClear"(寄存器级或位域级)时,读改写(|=/&=/^=/
    SET_BIT/CLEAR_BIT/MODIFY_REG/REG_SET_FIELD/REG_CLR_FIELD)会先读回寄存器(已置位
    标志为 1)、再整体写回——写 1 即清零,于是当前所有已置位的标志都被清零(包括并非本意
    清除的那些;若对应其它中断源,可能丢中断)。
  • 真阳性示例(真实 RP2040 SVD):
    UART0->UARTICR |= 0x10;   /* E13:会把当前已置位的所有中断标志清零 */
    UART0->UARTICR = 0x10;    /* 正确:直写目标标志 */
    
  • 与 E10/E12 同口径:条件编译块内记未判定;只写寄存器走 E12;无 modifiedWriteValues 数据时
    不猜、不报。

二、pico-sdk 2.1.0 语料(RP2040)

  • 抓取 pico-sdk 2.1.0,选 22 个含寄存器写入的源文件(uart/gpio/dma/timer/clocks/flash/i2c/spi/
    adc/pwm/irq/pll/xosc/watchdog/ticks/time/rtc/rand/multicore/…),配 RP2040 官方 SVD + SDK
    头文件核验:47 处写入 → 0 报、33 通过、14 未判定。
  • 过程中修掉 1 个真实误报:clocks_hw->resus.ctrl(SDK 的嵌套结构体名 ↔ SVD 的扁平名
    CLK_SYS_RESUS_CTRL)→ 新增"下划线拼接名后缀唯一匹配";匹配不到唯一寄存器时改记
    "多段成员名"未判定(不再误报 E02)。

三、pico-sdk 写法支持

  • 小写指针宏按地址解析:#define dma_hw ((dma_hw_t *)DMA_BASE) → dma_hw->intr 核到 DMA.INTR;
  • _u() 单参数拼贴宏:#define _u(x) x ## u → _u(0x50000000) 求值成功(地址链路打通);
  • 运行时下标(io_bank0_hw->intr[gpio / 8]、clocks_hw->clk[gpclk].ctrl)照常记未判定。

四、顺带修掉的一个误报类:MODIFY_REG 带位置取值

  • ST 风格 MODIFY_REG(reg, Msk, VALUE << Pos)(置位值带位置)此前会误报 E04("值超出位域宽度")
    ——现在字段相对与带位置两种约定都接受,位域之外置位才报;唯一字段 + 字段相对取值时跳过
    只读位扫描(避免错位误报)。

五、实测

  • 九生态语料复测零回归(ESP-IDF 224/0/34/190、TI 363/0/300/63、libopencm3 366/3/287/76、
    AVR 33/0/2/31、SAMD 49/0/22/27、Renesas 36/0/26/10、Silabs 309/0/218/91、NXP 3/0/1/2);
  • 404 项测试全过(新增 E13×2、MODIFY_REG 带位置用例);召回 229/229 保持;正样本 55 文件 0 误报。

安装(不变)

  • Claude Code:/plugin marketplace add liujycode/embedded-toolkit 后 /plugin install embedded-toolkit@embedded-toolkit
  • 其他 Agent:npx skills add liujycode/embedded-toolkit