docs(S-5): 补齐 16 条返回值约定,bsp-err 基线 19 → 1,并修门禁自身误判
A(还债)先行,B(GD5F 的 SPI 失败被吞成成功)另波处理。本笔不改行为:@build 的 Program Size 与上一笔逐字段相同(Code 213,648、RO 18,860、RW 1,188、ZI 131,500)。 **补齐 16 条「返回值:」约定,bsp-err 存量基线 19 → 1**: · gd5f2gq5ue.h 九个 SPI 原语(wait_busy / write_enable / read_status / page_read / read_from_cache / program_load / program_exec / block_erase / check_ecc) 写全规范五要素, 并把**每个函数能返回哪些码**写死:哪一个是"可重试"的 GD5F_WAIT_EXPIRED、哪一个才是 器件自认坏块的 P_FAIL/E_FAIL、失败时出参为什么不可信(E-42 同族)。 · nand_ftl.h 从零散三行补成带模块头,并明写 **nand_ftl_init() 的 −1 抹掉了失败类**: 分类目前只在失败点进日志,要按类分支需要 C4 快照(现无消费者故未做);同时警告"不得 把 −1 解读成卷坏了可以重格式化"(E-31 的教训正在这条上)。 · ui_menu_tab.h 五个表查询 API 由行尾短注释升级为完整块(含"越界返回 false 是保守取 只读"、"宁可按一张错表导航失败也不要按错表导航成功"这类判断依据)。 **修掉门禁自己的一条误判口径**(本笔最该记的):R3 原本要求紧邻注释块里出现字面"返回值", 而规范 V1.0 允许列对齐写法「返 回 值:」。后果有两层:① 合规写法被判违规;② 反向更糟—— gd5f_write_enable / gd5f_read_status 两条**早就"通过"了**,原因竟是它们的**函数说明**里顺口 写了"返回值"三个字,而不是真有一行返回值说明。**一条会因为散文里出现关键词而放行的规则, 等于在奖励运气**。修法是在块内忽略空格后再匹配关键词(排版选择不是违规),并在注释里写明 为什么不许把"必须写成不空格的形式"写进规则。 剩余 1 条刻意保留:bool ui_content_page_open()。它与"补注释"不是一档事——要改签名、要处理 3 个调用点(ui_menu.c:138/192/196 **今天三处全部丢弃返回值**,即"按 ENTER 开页失败是静默的" 这件事现在没人知道)、且 UI 源码双端编译(模拟器同一份),验证面是"重建模拟器 + 像素回归 + 真机逐页进菜单"。这不是还债,是独立一波改动,留档待决策。UI 三个文件带 BOM,Edit 会静默 剥掉 → 已按原样补回 3 字节(AGENTS 铁律:丢 BOM 后 ARMCC 按 CP936 解码,中文报 #870-D)。 **更正我自己写进文档的一条错话**:S-5 各条里我把 GD5F_SPI_TIMEOUT 100 记成"自旋圈数(改 分频时长会变)"。这次逐行核它 12 处用法,**全部是 HAL_* 超时参数或 HAL_GetTick() 差值 → 它也是毫秒**。真问题降级为"单位没写进名字(缺 _MS 后缀),读代码必须回实现里查单位"。 osWaitForever 与 HAL_MAX_DELAY 同为 0xFFFFFFFFU、以及 *_BUSY_TIMEOUT = -2 其实是返回码这两条 仍然成立(后者已改)。现状类条目(报告 §0.4、bsp_err.h、pre-commit使用说明.md §2.27、脚本 文件头)已全部改准;**已提交的变更记录行仍写着旧说法——按 §8.1 冻结历史不回改,以本笔新增 的更正行为准**。 验证:@build 0 错 0 警告(尺寸同上,故**不跑 @test**——无指令变化,跑它没有新信息);受影响 文件的 17 个钩子全 Passed(含 ui-golden 像素回归、cppcheck、编码规范、bsp-err 1/1/0 且 --prune 干净);check_doc_links --all --sections-strict 147 篇 0 问题;id-check --strict 通过; 9 个文件字节卫生 0 异常(UI 头 BOM 仍在、无 CR、无 U+FFFD、无行尾空格、均有尾换行)。 口径同步:AGENTS.md、.pre-commit-config.yaml、pre-commit使用说明.md §2.27 的基线计数 19 → 1; 报告 §0.4 / §9 / 附录 A 与变更记录两条(还债一条、更正一条)。
This commit is contained in:
@@ -571,7 +571,7 @@ repos:
|
||||
# 15) BSP 错误码与超时命名约定(报告 S-5 的机械检查那一半)。
|
||||
# 三条规则:公开 API 不得用 HAL_StatusTypeDef/bool 当错误通道(谓词 is_/has_/can_/valid
|
||||
# 不在此列);*_TIMEOUT 宏不得取负值(名字叫 TIMEOUT 其实是返回码,读代码的人会当成
|
||||
# 时长);非 void 的公开 API 必须有「返回值:」注释。存量钉 BASELINE、只减不增(2026-10-23 首清点 19 条,C1 已还 2 → 17 条),
|
||||
# 时长);非 void 的公开 API 必须有「返回值:」注释。存量钉 BASELINE、只减不增(2026-10-23 首清点 19 条,已还 18 → **1 条**:`bool ui_content_page_open()`),
|
||||
# 修完跑 --prune 点名收紧基线。约定正文 = Drivers/BSP/bsp_err.h,规则说明 =
|
||||
# scripts/check_bsp_err.py 文件头。注:ARMCC v5 对 warn_unused_result 不生效(实测),
|
||||
# 所以"丢弃返回值必须写 (void)"这条只能靠书写约定与评审兜着。
|
||||
|
||||
@@ -90,7 +90,7 @@
|
||||
|
||||
## 提交门禁(pre-commit)
|
||||
|
||||
- 任一失败即拦截,共 **39 个钩子**(逐个详解 → `docs/代码规范/pre-commit使用说明.md`):通用 5 + `gitlint` + `cppcheck` / `test-cppcheck` + `no-mojibake` + `coding-standard` + 文档三件套 `doc-links` / `task-table` / `mem-numbers` + `id-check`(**编号门禁**,`docs/编号规范.md` §8 八项校验;**已关闸为【增量拦截】**:只拦 `scripts/id_known_backlog.json` 台账之外的新错误级问题,存量按指纹豁免、台账只减不增;另有一根恒生效的线——可判定比例跌破 `id_registry.json` 基线即失败)+ `lv-conf-sync`(两份 `lv_conf.h` 特性子集一致)+ `cubemx-survival` + 主机侧单测 16 个(`-unit-test` 后缀)+ `test-suite-switch` + `registration-check`(双端注册反向校验 + UI 页面描述符表接线,N-23/U4)+ `mem-budget`(RAM 92% 预算门禁,N-27)+ `font-charset`(UI 字符集差集检查,防缺字白框,U4)+ `ui-golden`(UI 像素回归,菜单 8 状态 + 内容页 11 页黄金参考,U4)+ `layer-deps`(**分层方向**:`Drivers/BSP/**` 不得 include `App/**` 的头;存量 6 条基线只减不增,报告 S-1)+ `bsp-err`(**BSP 错误码与超时命名约定**:公开 API 不得拿 `HAL_StatusTypeDef`/`bool` 当错误通道、`*_TIMEOUT` 宏不得取负值、非 void 须写「返回值:」;约定正文 `Drivers/BSP/bsp_err.h`,存量基线只减不增(2026-10-23 清点 19 条 → **已还 2 条、现 17 条**),报告 S-5)
|
||||
- 任一失败即拦截,共 **39 个钩子**(逐个详解 → `docs/代码规范/pre-commit使用说明.md`):通用 5 + `gitlint` + `cppcheck` / `test-cppcheck` + `no-mojibake` + `coding-standard` + 文档三件套 `doc-links` / `task-table` / `mem-numbers` + `id-check`(**编号门禁**,`docs/编号规范.md` §8 八项校验;**已关闸为【增量拦截】**:只拦 `scripts/id_known_backlog.json` 台账之外的新错误级问题,存量按指纹豁免、台账只减不增;另有一根恒生效的线——可判定比例跌破 `id_registry.json` 基线即失败)+ `lv-conf-sync`(两份 `lv_conf.h` 特性子集一致)+ `cubemx-survival` + 主机侧单测 16 个(`-unit-test` 后缀)+ `test-suite-switch` + `registration-check`(双端注册反向校验 + UI 页面描述符表接线,N-23/U4)+ `mem-budget`(RAM 92% 预算门禁,N-27)+ `font-charset`(UI 字符集差集检查,防缺字白框,U4)+ `ui-golden`(UI 像素回归,菜单 8 状态 + 内容页 11 页黄金参考,U4)+ `layer-deps`(**分层方向**:`Drivers/BSP/**` 不得 include `App/**` 的头;存量 6 条基线只减不增,报告 S-1)+ `bsp-err`(**BSP 错误码与超时命名约定**:公开 API 不得拿 `HAL_StatusTypeDef`/`bool` 当错误通道、`*_TIMEOUT` 宏不得取负值、非 void 须写「返回值:」;约定正文 `Drivers/BSP/bsp_err.h`,存量基线只减不增(2026-10-23 清点 19 条 → **已还 18 条、现 1 条**:仅剩 `bool ui_content_page_open()` 待改签名),报告 S-5)
|
||||
- **范围 = 项目代码**:第三方(`Lib/`、`Middlewares/`、CMSIS、HAL、`lftpd`、`dhara`、`MDK-ARM`)排除;`cppcheck`/`coding-standard` 另排除 `test/`,规范检查再排除 CubeMX 生成的 `Src/`/`Inc/`。**`simulator/` 已纳入全部钩子**(2026-10-11)——生成物只靠 `.gitignore` 挡,**不在 `exclude` 里写目录名**(教训见 `docs/代码规范/pre-commit使用说明.md` §5.5)
|
||||
- ⚠ **pre-commit 4.x 已移除 `always: true`**(实测对 `local` 钩子只告警 `Unexpected key(s)` 并跳过)→ 想"总是跑"的钩子**必须让 `files:` 覆盖到所有会触发它的文件**,没有兜底开关
|
||||
- **改写型钩子(`trailing-whitespace` + `end-of-file-fixer`)豁免 CubeMX/Keil 生成文件**(配置里 YAML 锚点 `&cubemx-generated`);⚠ **只读检查不受影响**:`cppcheck` / 乱码 / `cubemx-survival` / `task-table` / `mem-numbers` 仍覆盖 `Src/`、`Inc/`
|
||||
|
||||
@@ -272,14 +272,89 @@ int32_t gd5f_bbt_reload(void);
|
||||
|
||||
/* ==================== SPI 原语(FTL 共享) ==================== */
|
||||
|
||||
/*
|
||||
* 函数功能:等待芯片空闲(轮询状态位 BUSY/OIP)
|
||||
* 入口参数:timeout_ms - 等待上限 uint32_t 毫秒
|
||||
* 返 回 值:GD5F_OK - 已空闲;GD5F_WAIT_EXPIRED - 时限内未空闲(**可重试**,旧名 BUSY_TIMEOUT);GD5F_ERROR - SPI 读取失败
|
||||
* 限定条件:SPI 已初始化;不得在中断里调用
|
||||
* 函数说明:E-32 把"超时"与"读状态本身失败"分开返回,两者处置不同(前者再等、后者查硬件)
|
||||
*/
|
||||
int32_t gd5f_wait_busy(uint32_t timeout_ms);
|
||||
|
||||
/*
|
||||
* 函数功能:发送 06h WRITE ENABLE(编程/擦除前必须成功执行一次)
|
||||
* 入口参数:无
|
||||
* 返 回 值:GD5F_OK - 成功;其它 - SPI 传输或等待失败错误码
|
||||
* 限定条件:SPI 已初始化
|
||||
* 函数说明:E-53 规定本函数返回值必须被检查并上报,忽略它会让后续 program/erase 静默无效
|
||||
*/
|
||||
int32_t gd5f_write_enable(void);
|
||||
|
||||
/*
|
||||
* 函数功能:读取状态寄存器(0Fh / READ STATUS)
|
||||
* 入口参数:p_status - 状态字节输出 uint8_t* 不得为 NULL
|
||||
* 返 回 值:GD5F_OK - 成功(*p_status 有效);GD5F_ERROR - SPI 失败(*p_status 不可信,调用方不得读用)
|
||||
* 限定条件:SPI 已初始化
|
||||
* 函数说明:E-42 同族纪律——失败时出参内容不可信,故判成败看返回值而不是看 *p_status 是否像样
|
||||
*/
|
||||
int32_t gd5f_read_status(uint8_t *p_status);
|
||||
|
||||
/*
|
||||
* 函数功能:页读取(13h:把数据从存储阵列装进内部缓存)
|
||||
* 入口参数:page_addr - 物理页地址 uint32_t 0 - GD5F_TOTAL_PAGES-1
|
||||
* 返 回 值:GD5F_OK - 命令已发出且等待完成;其它 - 透传底层 SPI/等待错误码
|
||||
* 限定条件:SPI 已初始化;**本函数成功不代表数据无位翻转**,正确性由随后的 gd5f_check_ecc() 判定
|
||||
* 函数说明:装载完成后须用 gd5f_read_from_cache() 取数据
|
||||
*/
|
||||
int32_t gd5f_page_read(uint32_t page_addr);
|
||||
|
||||
/*
|
||||
* 函数功能:从内部缓存读出数据(0Bh READ FROM CACHE)
|
||||
* 入口参数:column - 缓存内起始列 uint16_t 0 - GD5F_PAGE_SIZE-1
|
||||
* p_buf - 数据输出缓冲 uint8_t* 不得为 NULL
|
||||
* size - 读取字节数 uint32_t 1 - GD5F_PAGE_SIZE-column
|
||||
* 返 回 值:GD5F_OK - 成功;GD5F_ERROR - 参数非法或 SPI 失败(**此时 p_buf 内容不可信**)
|
||||
* 限定条件:必须先成功调用 gd5f_page_read() 完成阵列→缓存装载
|
||||
* 函数说明:E-42 同族——调用方不得在失败分支继续使用 p_buf(FTL 侧据此把读失败保守判为"非空页")
|
||||
*/
|
||||
int32_t gd5f_read_from_cache(uint16_t column, uint8_t *p_buf, uint32_t size);
|
||||
|
||||
/*
|
||||
* 函数功能:把数据装进内部缓存(02h PROGRAM LOAD)
|
||||
* 入口参数:column - 缓存内起始列 uint16_t 0 - GD5F_PAGE_SIZE-1
|
||||
* p_buf - 待写数据 const uint8_t* 不得为 NULL
|
||||
* size - 字节数 uint32_t 1 - GD5F_PAGE_SIZE-column
|
||||
* 返 回 值:GD5F_OK - 装载完成;GD5F_WAIT_EXPIRED - 装载后等待 OIP 超时(**可重试**);GD5F_ERROR - 参数/SPI 失败
|
||||
* 限定条件:先成功执行 gd5f_write_enable();缓冲须在 DMA 可达窗口内(GD5F_DMA_RAM_* 白名单)
|
||||
* 函数说明:装载本身不写阵列,真正的编程由 gd5f_program_exec() 触发
|
||||
*/
|
||||
int32_t gd5f_program_load(uint16_t column, const uint8_t *p_buf, uint32_t size);
|
||||
|
||||
/*
|
||||
* 函数功能:触发页编程(10h PROGRAM EXEC)并检查 P_FAIL
|
||||
* 入口参数:page_addr - 目标物理页地址 uint32_t 合法页号
|
||||
* 返 回 值:GD5F_OK - 编程完成且无 P_FAIL;**GD5F_PROGRAM_FAIL - 芯片置 P_FAIL(块退化的信号)**;其它 - 透传底层/SPI 错误
|
||||
* 限定条件:本调用前须已 gd5f_program_load() 成功
|
||||
* 函数说明:P_FAIL 是**器件自己认定这一页写不下去**的位,与 SPI 层错误性质不同(FTL 据此标坏块)
|
||||
*/
|
||||
int32_t gd5f_program_exec(uint32_t page_addr);
|
||||
|
||||
/*
|
||||
* 函数功能:擦除一个块(D8h 擦除序列 + 等待 + 检查 E_FAIL)
|
||||
* 入口参数:block_addr - 物理块地址 uint32_t 0 - GD5F_TOTAL_BLOCKS-1
|
||||
* 返 回 值:GD5F_OK - 擦净;**GD5F_ERASE_FAIL - 芯片置 E_FAIL(坏块信号)**;其它 - 透传底层/SPI 错误
|
||||
* 限定条件:先成功执行 gd5f_write_enable()
|
||||
* 函数说明:E_FAIL 与 SPI 错误的区别同 program_exec;擦除超时归 GD5F_WAIT_EXPIRED(可重试)
|
||||
*/
|
||||
int32_t gd5f_block_erase(uint32_t block_addr);
|
||||
|
||||
/*
|
||||
* 函数功能:检查上一次页读取的 ECC 结果(读 00h/BCh 特征寄存器的 ECC 状态)
|
||||
* 入口参数:无
|
||||
* 返 回 值:GD5F_OK - 无不可纠错误(可能含已纠正的位翻转);GD5F_ECC_ERROR - **存在不可纠正的 ECC 错误**
|
||||
* 限定条件:SPI 已初始化且 ECC 已使能(init 期扫描在使能前调用本函数无意义)
|
||||
* 函数说明:这是数据正确性的唯一判定点——SPI 层读到"内容"不等于"内容对"(见 §8.1 与本头 E-42/E-53 注释)
|
||||
*/
|
||||
int32_t gd5f_check_ecc(void);
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
/*
|
||||
* 模块名称:SPI NAND FTL(dhara 移植层 + FatFs 磁盘接口)
|
||||
* 模块功能:把 GD5F SPI NAND 经 dhara 映射层暴露成 FatFs 的 0 号磁盘
|
||||
* (disk_initialize/status/ioctl/read/write),并提供显式格式化入口。
|
||||
* 适用平台:STM32F4 系列 + GD5F2GQ5UE
|
||||
* 作者:王建锋
|
||||
* 创建日期:2026-09
|
||||
* 修改记录:
|
||||
* 2026-10-23 王建锋 补模块头与函数注释(S-5 R3);返回值语义写明"失败类目前
|
||||
* 只进日志、不外传",避免调用方以为能拿到 ECC / 预算耗尽的区别
|
||||
*/
|
||||
|
||||
#ifndef NAND_FTL_H
|
||||
#define NAND_FTL_H
|
||||
|
||||
@@ -7,12 +19,42 @@ extern "C" {
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/*
|
||||
* 函数功能:初始化 FTL(等价于 disk_initialize(0):SPI 起链 + dhara_map_resume)
|
||||
* 入口参数:无
|
||||
* 返回值:0 - 成功(映射可 resume 或判为真空白卷);-1 - 失败(disk_initialize 非 0)
|
||||
* 限定条件:由 FatFs 的 f_mount(forced=1) 间接触发,或测试代码直接调用
|
||||
* 函数说明:⚠ 这里的 -1 **抹掉了失败类**——"ECC 读不动"、"journal 满"与"映射损坏"对外
|
||||
* 都只是 -1。分类信息目前只在失败点就地进日志(见 nand_ftl.c 的 ftl_class_from_dhara
|
||||
* 与 ../架构设计/STM32F4-Base存储架构说明.md §10.4);要让调用方按类分支,需要跨调用
|
||||
* 存活的失败类快照(报告 S-5 的 C4 待还项,当前无消费者故未做)。
|
||||
* 调用方**不得**把 -1 解读成"卷坏了,可以重格式化"——E-31 的教训正在这条上。
|
||||
*/
|
||||
int nand_ftl_init(void);
|
||||
|
||||
/*
|
||||
* 函数功能:清空 dhara 映射树并同步(**破坏性**:整卷逻辑地址→物理映射作废)
|
||||
* 入口参数:无
|
||||
* 返回值:GD5F_OK(0) - 已清空并同步;GD5F_ERROR(-1) - 初始化/刷写缓存/同步失败(卷状态未定,
|
||||
* 须重新挂载判定,不要连环重试)
|
||||
* 限定条件:只允许走显式命令或恢复流程调用;不得因"某次读写失败"自动调用
|
||||
* 函数说明:新卷从空树写起,避免旧 journal 残留与新卷共存(结构卫生)。
|
||||
* 容量恢复动作的区分(A 清日志 / B 重挂载 / C 全片擦除 / D 残留清理)
|
||||
* → ../测试说明/存储维护与容量恢复.md。
|
||||
*/
|
||||
int nand_ftl_format(void);
|
||||
|
||||
/*
|
||||
* 函数功能:复位 FTL 内存态,使下次 nand_ftl_init() 重新走 dhara_map_resume
|
||||
* 入口参数:无
|
||||
* 返回值:无
|
||||
* 限定条件:测试用途(掉电恢复 / 坏块注入后重建场景模拟设备重启)
|
||||
* 函数说明:只清 RAM 状态位,不碰闪存内容。
|
||||
*/
|
||||
void nand_ftl_deinit(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#endif /* NAND_FTL_H */
|
||||
|
||||
@@ -36,10 +36,53 @@ extern const ui_menu_node_t g_menu_tab[];
|
||||
* 表查询 API(导航逻辑层 ui_menu.c 与显示层 ui_menu_view.c 共用):
|
||||
* 实现随表生成,改菜单(ui_menu_tree.txt)调用方零代码改动。
|
||||
*/
|
||||
uint8_t ui_menu_tab_children(uint8_t node, uint8_t out[], uint8_t max); /* 取 node 直接子项(按表序),最多 max 个;返回实际个数 */
|
||||
bool ui_menu_tab_has_children(uint8_t node); /* 有子项=菜单(带▶);无=叶子 */
|
||||
const char *ui_menu_tab_name(uint8_t node); /* 显示名 */
|
||||
bool ui_menu_tab_has_pwd(uint8_t node); /* 需密码(密码页按所输密码授权);false = 直接进(只读) */
|
||||
bool ui_menu_tab_valid(void); /* 启动自检:非根 parent 下标均有效、pwd 为 0/1 */
|
||||
|
||||
/*
|
||||
* 函数功能:取某节点的直接子项(按表序)
|
||||
* 入口参数:node - 节点下标 uint8_t 0 - 表长-1
|
||||
* out - 子项下标输出 uint8_t[] 长度 >= max,可为 NULL(只数个数时)
|
||||
* max - 最多写出个数 uint8_t >= 1
|
||||
* 返回值:实际写出的子项个数 uint8_t 0 - max(0 = 叶子节点)
|
||||
* 限定条件:node 越界时返回 0,不写 out(与"叶子"同形,调用方需要区分就先用 has_children)
|
||||
* 函数说明:不分配内存、不递归,只查一层。
|
||||
*/
|
||||
uint8_t ui_menu_tab_children(uint8_t node, uint8_t out[], uint8_t max);
|
||||
|
||||
/*
|
||||
* 函数功能:判断节点是否为菜单节点(有子项)
|
||||
* 入口参数:node - 节点下标 uint8_t 0 - 表长-1
|
||||
* 返回值:true - 有子项(显示为菜单,带 ▶);false - 无子项(叶子,可进内容页)
|
||||
* 限定条件:纯查询,无副作用;node 越界返回 false
|
||||
* 函数说明:这是**谓词**(bool 合法),不是成败码——S-5 R1 的白名单形态。
|
||||
*/
|
||||
bool ui_menu_tab_has_children(uint8_t node);
|
||||
|
||||
/*
|
||||
* 函数功能:取节点的显示名
|
||||
* 入口参数:node - 节点下标 uint8_t 0 - 表长-1
|
||||
* 返回值:显示名字符串指针 const char* 指向表内静态存储,**不为 NULL**(越界返回空串)
|
||||
* 限定条件:返回的是静态存储地址,调用方不得写、不得 free
|
||||
* 函数说明:编码随表来源(ui_menu_tree.txt),显示层直接喂 LVGL。
|
||||
*/
|
||||
const char *ui_menu_tab_name(uint8_t node);
|
||||
|
||||
/*
|
||||
* 函数功能:判断该叶子是否需要密码
|
||||
* 入口参数:node - 节点下标 uint8_t 0 - 表长-1
|
||||
* 返回值:true - 需密码(先进密码页,按所输密码授权);false - 直接进(只读)
|
||||
* 限定条件:纯查询;node 越界返回 false(保守取"只读",不放开写权限)
|
||||
* 函数说明:授权强度由密码页所输密码决定,本函数只回答"要不要过这一关"。
|
||||
*/
|
||||
bool ui_menu_tab_has_pwd(uint8_t node);
|
||||
|
||||
/*
|
||||
* 函数功能:菜单表启动自检(表与生成器是否自洽)
|
||||
* 入口参数:无
|
||||
* 返回值:true - 表自洽(非根节点的 parent 下标均有效、pwd 只取 0/1);
|
||||
* false - 表被手工改坏,调用方应拒绝进入菜单而不是继续用
|
||||
* 限定条件:ui_menu_init() 阶段调用一次
|
||||
* 函数说明:宁可拒绝显示,也不要按一张错表导航——错表可能把只读叶子指到写页面上。
|
||||
*/
|
||||
bool ui_menu_tab_valid(void);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -76,9 +76,10 @@ typedef int bsp_err_t;
|
||||
* · osWaitForever 与 HAL_MAX_DELAY 同为 0xFFFFFFFFU
|
||||
* 值相同、域不同:一个进 CMSIS-RTOS2、一个进 HAL。于是「把上层拿到的超时值直接
|
||||
* 转手传给另一层」这种代码既不报错也不变慢,直到某天真等死。
|
||||
* · GD5F_SPI_TIMEOUT 100
|
||||
* 不是时间,是自旋圈数(DMA 等待循环)。改 SPI 分频或换主频,实际时长跟着变,
|
||||
* 而且没有任何地方报警。
|
||||
* · GD5F_SPI_TIMEOUT 100(**核对后的准确说法,我先前记成"自旋圈数"是错的**)
|
||||
* 它其实也是毫秒(全部用法都是 HAL_* 超时参数或 HAL_GetTick() 差值,逐行核过),
|
||||
* 真正的问题是**名字没带 _MS 后缀**:读代码的人必须回实现里查一遍才知道单位,
|
||||
* 而同名的 *_TIMEOUT 在别的模块里又是返回码——单位与用途都靠"点进去看"。
|
||||
* · GD5F_BUSY_TIMEOUT、TPAFE5160_BUSY_TIMEOUT = -2(**2026-10-23 已消**:前者改名
|
||||
* GD5F_WAIT_EXPIRED(值不变),后者收编成 BSP_ERR_TIMEOUT;留此记录是因为
|
||||
* "时长宏与返回码共用一个名字形状"这类坑只写规则不会自己消失,得留个实证锚点)
|
||||
|
||||
@@ -481,8 +481,8 @@ cppcheck 是开源 C/C++ 静态分析工具,**不运行代码**,通过语法
|
||||
| **为什么需要** | 报告原文说"无统一错误码",实测更准的说法是**六套并存**:0/−1(SD2506、NETCFG、nand_ftl)、`int32_t`;
|
||||
自研枚举(`CH395F_STATUS_*`)、芯片寄存器原生码(`CH395F_ERR_*`,与前一套同模块并存)、
|
||||
`HAL_StatusTypeDef`(`rs485.h` 曾直接暴露)、`bool`,外加第三方 dhara 的出参 `dhara_error_t`
|
||||
与 FatFs 的 `FRESULT`。超时侧更乱:**同形两义**的 `*_TIMEOUT` 有四个(毫秒 / 自旋圈数 /
|
||||
其实是返回码),`osWaitForever` 与 `HAL_MAX_DELAY` 又**同为 0xFFFFFFFFU**(值同域不同,
|
||||
与 FatFs 的 `FRESULT`。超时侧更乱:**同名形状装三种东西**——真毫秒但带不带 `_MS` 后缀不统一(`SD2506_I2C_TIMEOUT_MS` vs
|
||||
`GD5F_SPI_TIMEOUT`,后者逐行核过也是毫秒)、以及叫 `*_TIMEOUT` 其实是**返回码**的,`osWaitForever` 与 `HAL_MAX_DELAY` 又**同为 0xFFFFFFFFU**(值同域不同,
|
||||
跨层转手既不报错也不变慢)。**没有机械检查的约定等于没有约定**(分层方向那条的教训) |
|
||||
| **约定正文在哪** | `Drivers/BSP/bsp_err.h`(**header-only,无 `.c`** → 不占体积、不需双端注册)。
|
||||
`0 = BSP_OK`、负值失败、`BSP_ERR_CAN_RETRY(e)` 把"能不能重试"变成跨模块可判定(这是本契约
|
||||
@@ -495,7 +495,8 @@ cppcheck 是开源 C/C++ 静态分析工具,**不运行代码**,通过语法
|
||||
它的 `226/425/450/550` 是 FTP 协议码不是内部错误码;**`net_*` BSD 兼容层不纳入**(用户裁定
|
||||
2026-10-23):调用方要的就是"返回字节数 + 每任务 errno 槽"那个形状,模拟器的 Winsock
|
||||
后端也照同一形状实现 |
|
||||
| **增量拦截** | 存量 **17 条**(首清点 19,2026-10-23 C1 还掉 2)钉 `BASELINE`(一个 `bool ui_content_page_open()` + 16 个缺「返回值:」),**只减不增**、脚本没有 `--write`;修完跑 `--prune` 会点名"这条已消失,
|
||||
| **增量拦截** | 存量 **1 条**(首清点 19,2026-10-23 已还 18)钉 `BASELINE`(首清点 19 条:2 个 `*_BUSY_TIMEOUT = -2` + 16 个缺「返回值:」+ 1 个 bool;**现仅剩
|
||||
`bool ui_content_page_open()` 一条**——它需要改签名并处理 3 个调用点,与"还注释"不是一档事),**只减不增**、脚本没有 `--write`;修完跑 `--prune` 会点名"这条已消失,
|
||||
请从基线删除" |
|
||||
| **配置** | `files: ^Drivers/BSP/\|^scripts/check_bsp_err\.py$\|^\.pre-commit-config\.yaml$`、
|
||||
`pass_filenames: false`(恒扫全库,要按 git 清单建公开头索引) |
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
`net_msg_queue_adopt()` 绑定(创建点不能外移——`osKernelInitialize()` 之前的创建类 API 会杀死启动;**故意不新建第二个队列**:那会白占 CCM 里 8×`net_msg_t`
|
||||
的堆空间,而 CCM 正是当前红线)。**两类从来不算债**:`stm32f4xx_it.c:241-256` 是 CubeMX「External variables」生成块;`:183/195/207/220` 是 `__asm` Handler
|
||||
里的汇编标签引用(ARMCC `__asm` 取不到 C 数据符号)。 | 无(后续由 `layer-deps` 与 `cubemx-survival` 两条门禁守着不回退:新增 `net-msgq-adopt` 存活项) |
|
||||
| 驱动规范 | **S-5 🟡 主体已落地**(2026-10-23:契约 + 门禁 + RS485/SD2506/TPAFE 收编 + GD5F 改名 + dhara 三类码) | 我原先写的"无统一错误码"**不准**,实测是 **六套并存**:0/−1(SD2506、NETCFG、nand_ftl)、自研枚举 `CH395F_STATUS_*`、**芯片寄存器原生码** `CH395F_ERR_*`(与前一套同模块并存)、`HAL_StatusTypeDef`(`rs485.h` 曾直接暴露)、`bool`,外加第三方 dhara 出参 `dhara_error_t` 与 FatFs `FRESULT`。超时侧是**同形两义**:`*_TIMEOUT` 里 100 是毫秒、`GD5F_SPI_TIMEOUT 100` 是**自旋圈数**、`GD5F/TPAFE5160_BUSY_TIMEOUT = -2` 其实是**返回码**;`osWaitForever` 与 `HAL_MAX_DELAY` **同为 0xFFFFFFFFU**(值同域不同,跨层转手不报错也不变慢)。真正值钱的不是码名,是"**能不能重试**"以前只写在个别注释里 | `Drivers/BSP/bsp_err.h`(header-only,含 `BSP_ERR_CAN_RETRY`)+ `bsp-err` 钩子(三条规则,基线 **19 → 17**);已收编 **RS485(HAL 枚举不再外泄)/ SD2506(11 个公共 API,I2C 超时终于归成可重试)/ TPAFE5160(含 E-44 的 FRSTDATA → `BSP_ERR_NO_DEVICE`)**,GD5F 的 `GD5F_BUSY_TIMEOUT` 改名 `GD5F_WAIT_EXPIRED` 消掉同形两义,FTL 坍缩点按 **ECC / 预算耗尽 / 完整性** 三类就地分类并打可读日志(§10.4)。`net_*` BSD 层与 `tpafe5160_snapshot()` 三态按裁定**不纳入**。**待还**:GD5F 私有码集整体收编(169 处、含板级套件 48 处,需真机 + 套件回归)、C4 失败类快照(让卷健康探针按类分支)、16 条缺「返回值:」注释 |
|
||||
| 驱动规范 | **S-5 🟡 主体已落地**(2026-10-23:契约 + 门禁 + RS485/SD2506/TPAFE 收编 + GD5F 改名 + dhara 三类码) | 我原先写的"无统一错误码"**不准**,实测是 **六套并存**:0/−1(SD2506、NETCFG、nand_ftl)、自研枚举 `CH395F_STATUS_*`、**芯片寄存器原生码** `CH395F_ERR_*`(与前一套同模块并存)、`HAL_StatusTypeDef`(`rs485.h` 曾直接暴露)、`bool`,外加第三方 dhara 出参 `dhara_error_t` 与 FatFs `FRESULT`。超时侧是**同形两义**:`SD2506_I2C_TIMEOUT_MS` 带单位后缀而 `GD5F_SPI_TIMEOUT 100` 不带(**逐行核过:它也是毫秒**,我先前记成"自旋圈数"是错的)、`GD5F/TPAFE5160_BUSY_TIMEOUT = -2` 其实是**返回码**;`osWaitForever` 与 `HAL_MAX_DELAY` **同为 0xFFFFFFFFU**(值同域不同,跨层转手不报错也不变慢)。真正值钱的不是码名,是"**能不能重试**"以前只写在个别注释里 | `Drivers/BSP/bsp_err.h`(header-only,含 `BSP_ERR_CAN_RETRY`)+ `bsp-err` 钩子(三条规则,基线 **19 → 1**);已收编 **RS485(HAL 枚举不再外泄)/ SD2506(11 个公共 API,I2C 超时终于归成可重试)/ TPAFE5160(含 E-44 的 FRSTDATA → `BSP_ERR_NO_DEVICE`)**,GD5F 的 `GD5F_BUSY_TIMEOUT` 改名 `GD5F_WAIT_EXPIRED` 消掉同形两义,FTL 坍缩点按 **ECC / 预算耗尽 / 完整性** 三类就地分类并打可读日志(§10.4)。`net_*` BSD 层与 `tpafe5160_snapshot()` 三态按裁定**不纳入**。**待还**:GD5F 私有码集整体收编(169 处、含板级套件 48 处,需真机 + 套件回归)、C4 失败类快照(让卷健康探针按类分支)、仅 `bool ui_content_page_open()` 一条(需改签名 + 处理 3 个调用点,与还注释不是一档事) |
|
||||
| 网络 | N-09 / PHY ❌(N-25) | `NET_MAX_SOCKETS` 仍为 8(与单连接复用语义不符);PHY 强制 100M 无自协商回退;PASV 每次新建监听 | 见 §4.2;随 N-25 一并处置 |
|
||||
| 存储 | N-15 🟡(N-25) | `nand_ftl.o` 静态 6,216 B——三块 2 KB 级页缓冲并存未合并 | 与 R-3 同批评估 |
|
||||
| 存储/日志 | P2-10 ❌(N-25) | 卷锁现有 5 个使用者(配置原子写 / 日志 / SOE / lftpd_io / defaultTask),容量轮转删除与 UI 读并发仍未全覆盖 | 登记簿 S-5 面(卷锁覆盖面) |
|
||||
@@ -324,7 +324,7 @@ W6 簇按 U4 → U1 → U3 → U2 的顺序执行完毕(U2 停在"够用即止
|
||||
| 波次 | 本报告条目(今天状态) | 备注 |
|
||||
|---|---|---|
|
||||
| ~~W3 预算与内存~~ ⏸ | R-9 ✅ / R-2 后半、R-3、R-4、R-6 暂缓 | 暂缓期间无验收动作,观测照常 |
|
||||
| W4 结构债 | N-14 ⏸、F-5 🟡、S-1/S-2/S-4/S-5、N-25 | `--strict` 已默认;S-5 契约/门禁已落地并收编三模块(基线 19→17,剩 GD5F 码集 + C4 快照) |
|
||||
| W4 结构债 | N-14 ⏸、F-5 🟡、S-1/S-2/S-4/S-5、N-25 | `--strict` 已默认;S-5 契约/门禁已落地并收编三模块(基线 19→1,剩 GD5F 码集收编与 C4 快照——均经论证暂不做) |
|
||||
| W5 验证常态 | 覆盖率、`malloc` 正则、TC 差异 13 处升门禁 | 逢窗口顺手做 |
|
||||
| W6 UI 扩展 | U2 残余、U5 页量 | 随产品需求,不再单列专项 |
|
||||
| W7 仓库决策 | D-1(N-29) | 已决策暂不处理;对外交付前重评 |
|
||||
@@ -383,7 +383,7 @@ W6 簇按 U4 → U1 → U3 → U2 的顺序执行完毕(U2 停在"够用即止
|
||||
| **S-2** | 跨模块裸 `extern` | ✅ **已闭环 2026-10-22**(24 处手写全消;两类本就不算债见 §0.4) | 本文变更记录 2026-10-22 三行;契约见 `App/task/task_handles.h`、`gd5f_spi1_notify_*`、`net_msg_queue_adopt` |
|
||||
| **S-4** | `app_cfg.h` 未接线占位开关 | ✅ **已闭环 2026-10-22**(4 个零消费点宏删除) | `App/app/app_cfg.h` 修改记录 v1.2;口径同步见 `../环境与部署/项目部署环境要求.md` §3.2/§3.5、`../产品需求/产品需求设计文档.md`、`../任务规划/排期详述.md` C5 |
|
||||
| **S-3** | `.ioc` 侧 USART1 配置 | ❌ 在策 | 登记簿 S-3 |
|
||||
| **S-5** | 统一 `bsp_err_t` 错误码与超时命名约定 | 🟡 主体已落地(2026-10-23:契约 + `bsp-err` 钩子 + RS485/SD2506/TPAFE 收编 + GD5F 改名 + dhara 三类码;基线 19 → 17) | 本文 §0.4、`pre-commit使用说明.md` §2.27、`STM32F4-Base存储架构说明.md` §10.4、`Drivers/BSP/bsp_err.h` |
|
||||
| **S-5** | 统一 `bsp_err_t` 错误码与超时命名约定 | 🟡 主体已落地(2026-10-23:契约 + `bsp-err` 钩子 + RS485/SD2506/TPAFE 收编 + GD5F 改名 + dhara 三类码;基线 19 → 1) | 本文 §0.4、`pre-commit使用说明.md` §2.27、`STM32F4-Base存储架构说明.md` §10.4、`Drivers/BSP/bsp_err.h` |
|
||||
| R-1 ~ R-9 | 内存优化项(R-9 已落地、R-5 判定不可行、其余随簇暂缓) | 见 §5.3 | 本文 §5.3、`../内存管理/RAM预算台账.md` |
|
||||
| F-1 / F-2 / F-3 | LVGL 死代码裁剪,省 64,576 B | ✅ 已落地 2026-10-11 | `../内存管理/RAM使用分析与优化方案.md` §2.6.4 |
|
||||
| **F-4 / F-5 / F-6** | Flash 双精度与死代码簇 | ✅/🟡/❌ 见 §5.4 | 本文 §5.4、`App/algo/prot_set.h` 注释 |
|
||||
@@ -442,6 +442,38 @@ admin/admin(SHA-256 `pwd_hash`)→ 该脚本**必然登录失败**;它是
|
||||
| | 数字联动照做:两份 `data/` 快照重跑、`ram_baseline --update/--write`、`check_mem_numbers --write`、FLASH 与
|
||||
任务栈两张配图重算重生成(逐文本复查越界 = 0)、本文 §1.3/§5.1/§5.4 与部署文档 §3.3 同步;§0.4 的 S-2 行按
|
||||
「完成即销项」改写、§9 拆出 S-2 行标 ✅。 |
|
||||
| **2026-10-23** | **S-5 还债:`bsp-err` 基线 19 → 1**,并修掉门禁自己的一处误判口径 | 用户裁定先还 A(清存量)再调查 B。**16 条缺「返回值:」全部补齐**:`gd5f2gq5ue.h` 九个 SPI 原语
|
||||
(`wait_busy`/`write_enable`/`read_status`/`page_read`/`read_from_cache`/`program_load`/`program_exec`/
|
||||
`block_erase`/`check_ecc`)逐条写全 函数功能/入口参数/返回值/限定条件/函数说明,**并把每个函数
|
||||
能返回哪些码写死在注释里**(哪一个是"可重试"的 `GD5F_WAIT_EXPIRED`、哪一个是器件自认坏块的
|
||||
`P_FAIL`/`E_FAIL`);`nand_ftl.h` 从零散三行补成带模块头的完整注释,并**明写"`nand_ftl_init()`
|
||||
的 -1 抹掉了失败类"**——分类目前只在失败点进日志,要按类分支需要 C4 快照(现无消费者故未做),
|
||||
同时警告"不得把 -1 解读成卷坏了可以重格式化"(E-31 的教训)。
|
||||
`ui_menu_tab.h` 五个表查询 API 由行尾短注释升级为完整块(含"越界返回 false 是保守取只读"、
|
||||
"宁可按一张错表拒绝显示也不要按它导航"这类判断依据);该文件**带 BOM,Edit 后已按原样补回**
|
||||
(AGENTS 铁律:丢 BOM → ARMCC 按 CP936 解码 → 中文报 #870-D)。 |
|
||||
| | **门禁自身的误判口径也修了,而且这是本轮最该记的一条**:R3 原本要求注释块里出现字面"返回值",
|
||||
而规范 V1.0 允许列对齐写法「**返 回 值:**」。后果是双重的——① 合规写法被判违规;② 反向更糟:
|
||||
`gd5f_write_enable`/`gd5f_read_status` 两条**早就"通过"了**,原因竟是它们的**函数说明**里顺口写了
|
||||
"返回值"三个字,而不是真的有一行返回值说明。**一条会因为散文里出现关键词而放行的规则,等于在
|
||||
奖励运气**。修法是在块内**忽略空格**后再匹配关键词(规范允许的排版不是违规),并在注释里写明
|
||||
为什么不许把"必须不空格"写进规则。基线随之从表面 15 条回到真实 16 条缺说明,再一并补齐。 |
|
||||
| | **刻意没做的最后一条**:`bool ui_content_page_open()` 留在基线里。它和"补注释"不是一档事——
|
||||
要改签名(`bsp_err_t`)、要处理 **3 个调用点**(`ui_menu.c:138/192/196`,**今天三处全部丢弃返回值**,
|
||||
即"按 ENTER 开页失败是静默的"这件事现在没人知道)、UI 三个文件都带 BOM、且 UI 源码**双端编译**
|
||||
(模拟器同份),验证面是"重新构建模拟器 + 像素回归 + 真机进菜单逐个页"。这不是还债,是独立一波改动。
|
||||
顺带查出的这一条(开页失败静默)比签名统一更值得修。 |
|
||||
| | 验证:`@build` **0 错 0 警告且 `Program Size` 与上一笔逐字段相同**(`Code` 213,648、RO 18,860、
|
||||
RW 1,188、ZI 131,500)——证明本笔确为纯注释,故**不跑 `@test`**(无任何指令变化,跑它没有新信息);
|
||||
受影响文件的 14 个钩子全 Passed(含 `ui-golden` 像素回归、`cppcheck`、编码规范、`bsp-err` 1/1/0);
|
||||
`check_doc_links --all --sections-strict` 147 篇 0 问题;字节卫生复核:UI 头 BOM 仍在、无 CR、无 U+FFFD。 |
|
||||
| | **顺手更正我自己写进文档的一条错话**(这类"听着很顺但没核"的说法最危险):我在 S-5 各条里把
|
||||
`GD5F_SPI_TIMEOUT 100` 记成"**自旋圈数**(改分频时长会变)"。这次逐行核它的 12 处用法,**全部是
|
||||
HAL_* 超时参数或 `HAL_GetTick()` 差值 → 它也是毫秒**。真问题降级为"**单位没写进名字**(缺 `_MS`
|
||||
后缀),读代码必须回实现查单位",而不是"换个 CPU 就悄悄变慢"。`osWaitForever` 与 `HAL_MAX_DELAY`
|
||||
同为 0xFFFFFFFFU、以及"`*_BUSY_TIMEOUT = -2` 是返回码"两条**仍然成立**(前者已核头文件,后者已改)。
|
||||
本行以上那些**已提交的变更记录行仍写着旧说法**——按 §8.1 冻结历史不回改,更正以本行为准;
|
||||
现状描述类条目(§0.4、`bsp_err.h`、`pre-commit使用说明.md` §2.27、脚本文件头)已全部改准。 |
|
||||
| **2026-10-23** | **S-5 第二波:C3 SD2506 整模块收编 + C1 GD5F/TPAFE 同形两义 + C2 dhara 失败类**(用户指定顺序 C3 → C1 → C2) | **C3**:`sd2506.h` 三枚私有宏(`SD2506_OK/ERROR/I2C_ERROR`)**删除而不是留别名**(留别名 = 新代码还能继续用旧形状,等于把迁移洗掉),11 个公共 API + 6 个内部 helper 改 `bsp_err_t`;新增 `sd2506_err_from_hal()`,**把 I2C 超时从"和没人应答同一个 −2"里拆出来归成 `BSP_ERR_TIMEOUT`(可重试)**——SD2506 是启动链第一站、I2C1 上电时序敏感,这是本波最实在的一处语义改善;
|
||||
`sd2506_init` 的 charge 寄存器**回读校验不符**原返 `SD2506_ERROR`(参数类)→ 改归 `BSP_ERR_IO`。连带迁移 `App`(`sys_clock.c`、`app_main.c`)、板级 RTC 套件、
|
||||
主机单测(`test/host/sys_clock/` 桩 + `run_unit_test.py` 补 `Drivers/BSP` include 路径)→ **单测 100/100**。 |
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
"""BSP 错误码与超时命名约定检查(报告 S-5 的机械检查那一半)。
|
||||
|
||||
为什么要有这个脚本:约定写在 docs 里不会自己生效。同一层的驱动今天并存六套返回约定,
|
||||
而"能不能重试"只写在个别注释里;同形两义的 *_TIMEOUT 已经出现三类(毫秒 / 自旋圈数 /
|
||||
其实是返回码)。没有机械检查,新代码只会继续按各自旧习惯长。
|
||||
而"能不能重试"只写在个别注释里;叫 *_TIMEOUT 的东西里既有真毫秒(单位靠不统一的 _MS 后缀表达)、
|
||||
也有**返回码**。没有机械检查,新代码只会继续按各自旧习惯长。
|
||||
|
||||
三条规则(只看 Drivers/BSP 下的公开头文件 = 对外 API 面;lftpd 按第三方排除):
|
||||
R1 公开 API 不得返回 HAL_StatusTypeDef / bool
|
||||
@@ -32,23 +32,7 @@ EXCLUDE = ("lftpd/",)
|
||||
# 存量基线(2026-10-23 清点):"文件|规则|名字"。修掉一条删一行,不要往里加。
|
||||
BASELINE = frozenset(
|
||||
line.strip() for line in """
|
||||
Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h|R3|gd5f_block_erase
|
||||
Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h|R3|gd5f_check_ecc
|
||||
Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h|R3|gd5f_page_read
|
||||
Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h|R3|gd5f_program_exec
|
||||
Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h|R3|gd5f_program_load
|
||||
Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h|R3|gd5f_read_from_cache
|
||||
Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h|R3|gd5f_read_status
|
||||
Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h|R3|gd5f_wait_busy
|
||||
Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h|R3|gd5f_write_enable
|
||||
Drivers/BSP/GD5F2GQ5UE/nand_ftl.h|R3|nand_ftl_format
|
||||
Drivers/BSP/GD5F2GQ5UE/nand_ftl.h|R3|nand_ftl_init
|
||||
Drivers/BSP/UI/ui_content_page.h|R1|ui_content_page_open
|
||||
Drivers/BSP/UI/ui_menu_tab.h|R3|ui_menu_tab_children
|
||||
Drivers/BSP/UI/ui_menu_tab.h|R3|ui_menu_tab_has_children
|
||||
Drivers/BSP/UI/ui_menu_tab.h|R3|ui_menu_tab_has_pwd
|
||||
Drivers/BSP/UI/ui_menu_tab.h|R3|ui_menu_tab_name
|
||||
Drivers/BSP/UI/ui_menu_tab.h|R3|ui_menu_tab_valid
|
||||
""".splitlines() if line.strip()
|
||||
)
|
||||
|
||||
@@ -119,7 +103,10 @@ def scan():
|
||||
if flat == "void":
|
||||
continue
|
||||
idx = text[:m.start()].count("\n")
|
||||
if "返回值" not in doc_block_before(lines, idx):
|
||||
# 忽略空格:规范 V1.0 允许列对齐写法「返 回 值:」,那只是一种排版选择,
|
||||
# 要求"必须写成不空格的形式"等于让门禁去规定排版,会把合规注释判成违规。
|
||||
marker = doc_block_before(lines, idx).replace(" ", "").replace("\u3000", "")
|
||||
if "返回值" not in marker:
|
||||
hits.append((rel, "R3", name))
|
||||
return hits
|
||||
|
||||
@@ -162,7 +149,8 @@ def main():
|
||||
print(" -", key)
|
||||
print(' 出路:① 返回 bsp_err_t(Drivers/BSP/bsp_err.h,0=成功、负值=失败,')
|
||||
print(' 可重试判定用 BSP_ERR_CAN_RETRY);② 时长宏一律 *_MS 且必须是时间,')
|
||||
print(' 自旋圈数改名 *_LOOP 并注释写明非时间量;③ 返回码不许叫 *_TIMEOUT。')
|
||||
print(' 若将来出现按循环次数计时的等待,改名 *_LOOP 并注释写明非时间量;')
|
||||
print(' ③ 返回码不许叫 *_TIMEOUT。')
|
||||
return 1
|
||||
if gone:
|
||||
print("[提醒] 有 %d 条基线已还清,请用 --prune 列出并从 BASELINE 删除" % len(gone))
|
||||
|
||||
Reference in New Issue
Block a user