Repository navigation
嵌入式工具箱 v1.21.0:E13 + pico-sdk 生态(verify v1.16.0)
嵌入式工具箱 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