chore(编号): 存量编号全量转语义短语,门禁识别面与语料同批重打
登记簿、文档与代码注释里的存量字母加数字编号(N-x / S-x / T-x / E-x / A-x / 卡号) 一律改写为语义短语,净删 2,028 处引用;删除基线与待确认、并行分道方案、排期详述、 采集保护收尾 4 篇(内容已并入 docs/任务规划/README 与登记簿)。 门禁机器与三张账同批重打:check_ids.py 新增变更记录行豁免与第二根护栏 undecidable_total_ceiling;check_test_traceability.py 只加 stdout/stderr UTF-8 reconfigure(TC_RE 未动);check_cubemx_survival.py 的 --write 固定 newline=LF; id_registry / id_aliases(+19 条 retired-to-phrase)/ id_known_backlog 重打。 test/ 56 个文件同步 TC 标签语义化,其中 18 个 TU 改了 CHECK / printf 里的标签文字, 是本批唯一改变构建产物的文件集合。 为什么合成一笔、不拆四笔(实测撞闸,非偏好):pre-commit 跑钩子前会 stash 未 staged 部分,拆开后中间提交必然是「新规则 + 旧语料」——实跑可判定 85.15% < 基线 86.00%、 不可判定 1,453 > 上限 1,166,编号门禁直接拦下。编号识别面与它描述的语料只能同码移动。 实跑基线(工作区全量):754 文件 / 8,230 处编号字面量 / 可判定 7,079 = 86.01% (基线 86.0%,容差 0.1pp)/ 不可判定绝对数 1,151(上限 1,166)/ 校验 1-6 错误级 0 / 告警 = 悬空 2(App/algo/freq.c 的 S2,属 §4.4 同号不同义)+ 孤儿 50。 基线从 84.0 抬到 86.0 的理由见 docs/门禁说明/id-check.md §7.6:本批真删了 2,028 处 引用,可判定面随真实内容上升,不是把分母做小。同批新增排除 docs/硬件平台/ 语料,使 识别面少 264 处——芯片手册位号与网表料号不属编号空间(registry 有 excluded_paths_note)。 ⚠ 余量只剩 0.11pp(约 10 处)与绝对数 15 处:把「可判定的引用」改成散文会立刻撞第二 根护栏。另遗留一项:id_aliases 里 retired 的 N / S / T / A 别名没有 scope(U1~U5 有), 今后有人新写一个 A-4,校验 3 不会响,只能靠人,建议下批补 scope。 固件不变证据:115 个 .c/.h 剥注释并归一字符串后与 HEAD 逐字节全等,残留代码差异 0; App / Src / Drivers 的字符串字面量零改动。@build 0 错误 0 警告;40/40 主机套件、2,889 断言全通过;覆盖率 line 89.2% / func 92.6%;pre-commit 48 钩子 --all-files 全绿; check_doc_links --all 通过(176 文档,章节引用无法判定 0);逐字节卫生核过:14 个带 BOM 文件与 HEAD 一致、0 个 CR、0 个 U+FFFD,字符串字面量纯 ASCII。 .cubemx_survival_baseline.json 的 watchdog-module 哈希 56bf27 变 2bb051 属合法: Src/freertos.c 的 USER CODE 区内只有注释文字随编号改写,代码未变。 同批带上体积同码凭证与 RAM 台账行(@build 之后盖戳):RW_IRAM1 79,008 B / 60.3%, RW_CCM 57,376 B / 87.9%,阈值 92%。
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
| 文件 | 测试对象 / 作用 |
|
||||
|---|---|
|
||||
| `test_config.c/h` | **测试任务配置**:`TEST_SUITE_*` 套件选择开关(互斥)+ `ENABLE_DESTRUCTIVE_TESTS` |
|
||||
| `test_common.h` | **公共断言内核**:`test_stats_t` + `TEST_CHECK_IMPL`/`TEST_REPORT_IMPL`;各套件用一行宏绑定自身统计变量(T-4) |
|
||||
| `test_common.h` | **公共断言内核**:`test_stats_t` + `TEST_CHECK_IMPL`/`TEST_REPORT_IMPL`;各套件用一行宏绑定自身统计变量 |
|
||||
| `ch395f_test_task.c/h` + `ch395f_test.h` | CH395F 以太网(硬件层 Phase 1~5 / NET 层 Phase 6~11) |
|
||||
| `gd5f_test_task.c/h` + `gd5f_test.h` | GD5F2GQ5UE SPI NAND 存储 |
|
||||
| `sd2506_test_task.c/h` + `sd2506_test.h` | SD2506 RTC |
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/**
|
||||
* @file ch395f_reuse_bench.c
|
||||
* @brief N-30 芯片级 Socket 复用时序台架(裸机,内核前运行,OS/net/FTP 全剥离)
|
||||
* @brief relisten 沉降段原语化受阻的芯片级 Socket 复用时序台架(裸机,内核前运行,OS/net/FTP 全剥离)
|
||||
* @details 直接调用 ch395f_* 命令,循环执行受控时序矩阵(延迟/关闭次序/载荷/Socket 号),
|
||||
* 每步打印芯片状态与中断寄存器,定位"关→开→监听→连接"复用时序中
|
||||
* 芯片行为的确切规律。配套主机脚本 test/host/ch395f_reuse_host.py。
|
||||
@@ -10,7 +10,7 @@
|
||||
* 运行方法:在实验分支(如 n30-chip-bench)把本 .c 注册进 uvprojx Test 组、
|
||||
* Src/main.c 的 USER CODE 2 区在 app_main_init() 之前调 ch395f_reuse_bench()
|
||||
* (内核前裸机循环,永不返回,断电退出),烧录后跑主机脚本对照芯片日志。
|
||||
* 旧 N-30 定案矩阵(对照 vs "CONNECT 事件未收到捕获自 accept"修复组)保留在 s_vars[]/
|
||||
* 早先那轮定案矩阵(对照 vs "CONNECT 事件未收到捕获自 accept"修复组)保留在 s_vars[]/
|
||||
* bench_round(),由 s_bench_legacy=0 停泊不运行。
|
||||
*
|
||||
* 驱动原语前置实验:同一固件合并跑 E2/E3/E4——
|
||||
@@ -395,7 +395,7 @@ static void bench_round(unsigned idx) {
|
||||
* 驱动原语前置实验区:E2 / E3 / E4 一次固件合并跑
|
||||
* ===================================================================== */
|
||||
|
||||
/* 旧 N-30 定案矩阵停泊开关:0 = 不运行(保留代码备查,勿删) */
|
||||
/* 早先那轮定案矩阵的停泊开关:0 = 不运行(保留代码备查,勿删) */
|
||||
static const int s_bench_legacy = 0;
|
||||
|
||||
/* --- DWT 周期计数器:168 MHz,1 cycle ~= 5.95 ns(不依赖 HAL 时基/中断) --- */
|
||||
@@ -825,7 +825,7 @@ void ch395f_reuse_bench(void) {
|
||||
if (s_bench_legacy != 0) {
|
||||
/* 丢中断复核实验(2026-10-14):固定 8 周期 × 6 变体后返回正常启动
|
||||
* (主机脚本 ch395f_reuse_host.py --mode legacy --cycles 8 同步收工) */
|
||||
DBG_INFO("BENCH legacy N-30 matrix: 8 cycles x %u variants", (unsigned)BENCH_N_VARS);
|
||||
DBG_INFO("BENCH legacy matrix: 8 cycles x %u variants", (unsigned)BENCH_N_VARS);
|
||||
unsigned idx = 0;
|
||||
for (unsigned cyc = 0U; cyc < 8U; cyc++) {
|
||||
for (unsigned iv = 0U; iv < (unsigned)BENCH_N_VARS; iv++) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* ch395f_reuse_bench.h - N-30 芯片级 Socket 复用时序台架(裸机实验,临时分支专用)
|
||||
* ch395f_reuse_bench.h - relisten 沉降段原语化受阻的芯片级 Socket 复用时序台架(裸机实验,临时分支专用)
|
||||
*/
|
||||
|
||||
#ifndef CH395F_REUSE_BENCH_H
|
||||
|
||||
@@ -86,7 +86,7 @@ extern "C" {
|
||||
* test/run_all_suites.py 的 _rewrite_config 只改 TEST_SUITE_* 行(那些行没有行尾
|
||||
* 跨行注释)所以一直没炸;本文件是"人手工切阶段"的入口,必须自身安全。
|
||||
*
|
||||
* 链接余量构建实测(条目属主 docs/任务规划/测试与架构专项.md P1-10;2026-10-25,
|
||||
* 链接余量构建实测(条目属主 docs/任务规划/测试与架构专项.md;2026-10-25,
|
||||
* RW_IRAM1 = 128 KB 的 .sct 区,92% 红线 = 120,586 B):
|
||||
* 配置(TEST_SUITE_CH395F + 阶段) Code ZI RW_IRAM1 距红线余量
|
||||
* 产品基线(阶段全关) 214,104 131,852 75,632 57.7% 44,954 B
|
||||
|
||||
@@ -46,7 +46,7 @@ test_stats_t g_test_stats;
|
||||
* 测试目的:确认 CH395F 与 MCU 之间的 SPI 通信链路正常,所有底层命令
|
||||
* 能够正确发送并得到预期回复。这是其他所有 Phase 的前提条件。
|
||||
*
|
||||
* 共 9 项测试(P1-01 ~ P1-09),逐项执行,汇总报告。
|
||||
* 共 9 项测试,逐项执行,汇总报告。
|
||||
* =================================================================== */
|
||||
|
||||
/* 解析点分十进制 IP 字符串为数组(避免引入 sscanf 库)。
|
||||
@@ -79,12 +79,12 @@ static void phase1_run(void) {
|
||||
|
||||
/* 全局中断寄存器读即清,唯一读者 = net_poll(F-NET-7;用户裁定 2026-10-13:
|
||||
* 测试代码同样禁自行读取)。net_stack_bring_up() 的 set_phy 强制重协商会
|
||||
* 锁存 GINT_STAT_PHY_CHANGE(0x0004)——由 P1-06 内部双读自清,不在此预清。 */
|
||||
* 锁存 GINT_STAT_PHY_CHANGE(0x0004)——由全局中断状态项内部双读自清,不在此预清。 */
|
||||
|
||||
DBG_INFO("=== CH395F Phase 1 Tests ===");
|
||||
DBG_INFO("--- 9 test items (P1-01 ~ P1-09) ---");
|
||||
DBG_INFO("--- 9 test items ---");
|
||||
|
||||
/* ---- P1-01: ch395f_check_exist() ----
|
||||
/* ---- ch395f_check_exist() ----
|
||||
* 原理:SPI 写入命令 0x06 (CMD_CHECK_EXIST) 后跟测试字节 0x57。
|
||||
* CH395F 硬件将测试字节按位取反后返回,期望收到 ~0x57 = 0xA8。
|
||||
* 通过:函数返回 CH395F_ERR_SUCCESS(0x00)= SPI 回显取反匹配。
|
||||
@@ -95,15 +95,15 @@ static void phase1_run(void) {
|
||||
*/
|
||||
{
|
||||
ch395f_status_t ret = ch395f_check_exist();
|
||||
DBG_INFO(" [P1-01] ch395f_check_exist()");
|
||||
DBG_INFO(" ch395f_check_exist()");
|
||||
DBG_INFO(" SPI write: CMD=0x06, DATA=0x57");
|
||||
DBG_INFO(" expect: ~0x57 = 0xA8");
|
||||
DBG_INFO(" actual: 0x%02X", (uint8_t)ret);
|
||||
TEST_CHECK(ret == CH395F_ERR_SUCCESS,
|
||||
"P1-01 check_exist = 0x%02X (expect 0x00=~0x57=0xA8 match)", (uint8_t)ret);
|
||||
"check_exist = 0x%02X (expect 0x00=~0x57=0xA8 match)", (uint8_t)ret);
|
||||
}
|
||||
|
||||
/* ---- P1-02: ch395f_get_version() ----
|
||||
/* ---- ch395f_get_version() ----
|
||||
* 原理:SPI 写入命令 0x27 (CMD_GET_IC_VER),读取芯片版本字节。
|
||||
* 通过:版本值 == 0x4A(CH395F 硬件版本)。
|
||||
* 失败:版本值 ≠ 0x4A(芯片型号不匹配、未正确初始化或损坏)。
|
||||
@@ -111,14 +111,14 @@ static void phase1_run(void) {
|
||||
*/
|
||||
{
|
||||
uint8_t ver = (uint8_t)ch395f_get_version();
|
||||
DBG_INFO(" [P1-02] ch395f_get_version()");
|
||||
DBG_INFO(" ch395f_get_version()");
|
||||
DBG_INFO(" expect: 0x4A");
|
||||
DBG_INFO(" actual: 0x%02X", ver);
|
||||
TEST_CHECK(ver == 0x4A,
|
||||
"P1-02 version = 0x%02X (expect 0x4A)", ver);
|
||||
"version = 0x%02X (expect 0x4A)", ver);
|
||||
}
|
||||
|
||||
/* ---- P1-03: 设置 IP → 回读验证 ----
|
||||
/* ---- 设置 IP → 回读验证 ----
|
||||
* 原理:ch395f_set_ip_addr() 将 IP 写入 CH395F 内部寄存器,
|
||||
* 然后通过 ch395f_get_ip_inf() 回读完整网络信息(IP+GW+MASK)。
|
||||
* 前 4 字节为 IP 地址。
|
||||
@@ -132,15 +132,15 @@ static void phase1_run(void) {
|
||||
ch395f_get_ip_inf(ip_info);
|
||||
int32_t match = (ip_info[0] == 192 && ip_info[1] == 168 &&
|
||||
ip_info[2] == 1 && ip_info[3] == 100);
|
||||
DBG_INFO(" [P1-03] ch395f_set_ip_addr(192.168.1.100)");
|
||||
DBG_INFO(" ch395f_set_ip_addr(192.168.1.100)");
|
||||
DBG_INFO(" expect: IP[0..3] = 192.168.1.100");
|
||||
DBG_INFO(" actual: %d.%d.%d.%d", ip_info[0], ip_info[1], ip_info[2], ip_info[3]);
|
||||
TEST_CHECK(match, "P1-03 IP = %d.%d.%d.%d (expect 192.168.1.100)",
|
||||
TEST_CHECK(match, "IP = %d.%d.%d.%d (expect 192.168.1.100)",
|
||||
ip_info[0], ip_info[1], ip_info[2], ip_info[3]);
|
||||
}
|
||||
|
||||
/* ---- P1-04: 设置网关 → 回读验证 ----
|
||||
* 原理:同 P1-03,通过 ch395f_set_gwip_addr() 写入,ch395f_get_ip_inf()
|
||||
/* ---- 设置网关 → 回读验证 ----
|
||||
* 原理:同「设置 IP → 回读」项,通过 ch395f_set_gwip_addr() 写入,ch395f_get_ip_inf()
|
||||
* 回读的第 5-8 字节为网关地址。
|
||||
* 通过:回读 GW[0..3] == 192.168.1.1。
|
||||
* 失败:任意字节不匹配。
|
||||
@@ -152,15 +152,15 @@ static void phase1_run(void) {
|
||||
ch395f_get_ip_inf(ip_info);
|
||||
int32_t match = (ip_info[4] == 192 && ip_info[5] == 168 &&
|
||||
ip_info[6] == 1 && ip_info[7] == 1);
|
||||
DBG_INFO(" [P1-04] ch395f_set_gwip_addr(192.168.1.1)");
|
||||
DBG_INFO(" ch395f_set_gwip_addr(192.168.1.1)");
|
||||
DBG_INFO(" expect: GW[0..3] = 192.168.1.1");
|
||||
DBG_INFO(" actual: %d.%d.%d.%d", ip_info[4], ip_info[5], ip_info[6], ip_info[7]);
|
||||
TEST_CHECK(match, "P1-04 GW = %d.%d.%d.%d (expect 192.168.1.1)",
|
||||
TEST_CHECK(match, "GW = %d.%d.%d.%d (expect 192.168.1.1)",
|
||||
ip_info[4], ip_info[5], ip_info[6], ip_info[7]);
|
||||
}
|
||||
|
||||
/* ---- P1-05: 设置掩码 → 回读验证 ----
|
||||
* 原理:同 P1-03,ch395f_set_mask_addr() 写入,ch395f_get_ip_inf()
|
||||
/* ---- 设置掩码 → 回读验证 ----
|
||||
* 原理:同「设置 IP → 回读」项,ch395f_set_mask_addr() 写入,ch395f_get_ip_inf()
|
||||
* 回读的第 9-12 字节为子网掩码。
|
||||
* 通过:回读 MASK[0..3] == 255.255.255.0。
|
||||
* 失败:任意字节不匹配。
|
||||
@@ -172,14 +172,14 @@ static void phase1_run(void) {
|
||||
ch395f_get_ip_inf(ip_info);
|
||||
int32_t match = (ip_info[8] == 255 && ip_info[9] == 255 &&
|
||||
ip_info[10] == 255 && ip_info[11] == 0);
|
||||
DBG_INFO(" [P1-05] ch395f_set_mask_addr(255.255.255.0)");
|
||||
DBG_INFO(" ch395f_set_mask_addr(255.255.255.0)");
|
||||
DBG_INFO(" expect: MASK[0..3] = 255.255.255.0");
|
||||
DBG_INFO(" actual: %d.%d.%d.%d", ip_info[8], ip_info[9], ip_info[10], ip_info[11]);
|
||||
TEST_CHECK(match, "P1-05 MASK = %d.%d.%d.%d (expect 255.255.255.0)",
|
||||
TEST_CHECK(match, "MASK = %d.%d.%d.%d (expect 255.255.255.0)",
|
||||
ip_info[8], ip_info[9], ip_info[10], ip_info[11]);
|
||||
}
|
||||
|
||||
/* ---- P1-06: ch395f_get_glob_int_status_all()(16 位版) ----
|
||||
/* ---- ch395f_get_glob_int_status_all()(16 位版) ----
|
||||
* 全库唯一允许 net_poll 之外读全局寄存器的位置——被测对象就是该 API 本身
|
||||
* (硬件层模式独占上下文,无并发消费者)。读即清语义 → 先读一次自清
|
||||
* (吸收 bring_up 锁存的 PHY_CHANGE),短暂延时后第二次读为断言值。
|
||||
@@ -194,14 +194,14 @@ static void phase1_run(void) {
|
||||
(void)ch395f_get_glob_int_status_all(); /* 自清读(被测 API 自身,见上) */
|
||||
HAL_Delay(10);
|
||||
uint16_t gint_all = ch395f_get_glob_int_status_all();
|
||||
DBG_INFO(" [P1-06] ch395f_get_glob_int_status_all()");
|
||||
DBG_INFO(" ch395f_get_glob_int_status_all()");
|
||||
DBG_INFO(" expect: 0x0000");
|
||||
DBG_INFO(" actual: 0x%04X", gint_all);
|
||||
TEST_CHECK(gint_all == 0x0000,
|
||||
"P1-06 glob_int_status_all = 0x%04X (expect 0x0000)", gint_all);
|
||||
"glob_int_status_all = 0x%04X (expect 0x0000)", gint_all);
|
||||
}
|
||||
|
||||
/* ---- P1-07: 打开→关闭 Socket 0 → 验证 CMD_STATUS ----
|
||||
/* ---- 打开→关闭 Socket 0 → 验证 CMD_STATUS ----
|
||||
* 原理:连续执行 open_socket(0) 和 close_socket(0),然后读取
|
||||
* 命令状态寄存器,确认 Socket 状态机正常流转。
|
||||
* 通过:CMD_STATUS == 0x00(CH395F_ERR_SUCCESS),表示两次命令均成功执行。
|
||||
@@ -211,16 +211,16 @@ static void phase1_run(void) {
|
||||
uint8_t open_ret = ch395f_open_socket(0);
|
||||
uint8_t close_ret = ch395f_close_socket(0);
|
||||
uint8_t cmd_st = ch395f_get_cmd_status();
|
||||
DBG_INFO(" [P1-07] ch395f_open_socket(0) -> ch395f_close_socket(0)");
|
||||
DBG_INFO(" ch395f_open_socket(0) -> ch395f_close_socket(0)");
|
||||
DBG_INFO(" expect: CMD_STATUS == 0x00 (CH395F_ERR_SUCCESS)");
|
||||
DBG_INFO(" actual: open=%d, close=%d, CMD_STATUS=0x%02X",
|
||||
open_ret, close_ret, cmd_st);
|
||||
TEST_CHECK(cmd_st == CH395F_ERR_SUCCESS,
|
||||
"P1-07 open=%d close=%d cmd=0x%02X (expect 0x00)",
|
||||
"open=%d close=%d cmd=0x%02X (expect 0x00)",
|
||||
open_ret, close_ret, cmd_st);
|
||||
}
|
||||
|
||||
/* ---- P1-08: 设置 ARP 参数 ----
|
||||
/* ---- 设置 ARP 参数 ----
|
||||
* 原理:ch395f_set_arp(period, retry) 配置 ARP 请求周期和重试次数。
|
||||
* period = 10(×100ms = 1s)、retry = 5(最多 5 次重试)。
|
||||
* 通过:CMD_STATUS == 0x00(参数写入成功)。
|
||||
@@ -229,14 +229,14 @@ static void phase1_run(void) {
|
||||
{
|
||||
ch395f_set_arp(10, 5);
|
||||
uint8_t cmd_st = ch395f_get_cmd_status();
|
||||
DBG_INFO(" [P1-08] ch395f_set_arp(period=10, retry=5)");
|
||||
DBG_INFO(" ch395f_set_arp(period=10, retry=5)");
|
||||
DBG_INFO(" expect: CMD_STATUS == 0x00");
|
||||
DBG_INFO(" actual: CMD_STATUS = 0x%02X", cmd_st);
|
||||
TEST_CHECK(cmd_st == CH395F_ERR_SUCCESS,
|
||||
"P1-08 set_arp CMD_STATUS = 0x%02X (expect 0x00)", cmd_st);
|
||||
"set_arp CMD_STATUS = 0x%02X (expect 0x00)", cmd_st);
|
||||
}
|
||||
|
||||
/* ---- P1-09: 设置 TTL ----
|
||||
/* ---- 设置 TTL ----
|
||||
* 原理:ch395f_set_ttl(sock, ttl) 设置指定 Socket 的 IP 报 TTL 值。
|
||||
* sock = 0(Socket 0)、ttl = 64(默认值)。
|
||||
* 通过:CMD_STATUS == 0x00。
|
||||
@@ -245,11 +245,11 @@ static void phase1_run(void) {
|
||||
{
|
||||
ch395f_set_ttl(0, 64);
|
||||
uint8_t cmd_st = ch395f_get_cmd_status();
|
||||
DBG_INFO(" [P1-09] ch395f_set_ttl(sock=0, ttl=64)");
|
||||
DBG_INFO(" ch395f_set_ttl(sock=0, ttl=64)");
|
||||
DBG_INFO(" expect: CMD_STATUS == 0x00");
|
||||
DBG_INFO(" actual: CMD_STATUS = 0x%02X", cmd_st);
|
||||
TEST_CHECK(cmd_st == CH395F_ERR_SUCCESS,
|
||||
"P1-09 set_ttl CMD_STATUS = 0x%02X (expect 0x00)", cmd_st);
|
||||
"set_ttl CMD_STATUS = 0x%02X (expect 0x00)", cmd_st);
|
||||
}
|
||||
|
||||
TEST_REPORT("Phase 1");
|
||||
@@ -1029,7 +1029,7 @@ static void phase2_run(void)
|
||||
*
|
||||
* 前置条件:PC 运行 udp_client 发包到 192.168.1.100:60000
|
||||
* 会话结构:累计 PHASE3_TOTAL_ROUNDS(60) 个有效数据包后关闭 Socket
|
||||
* 第 1~30 轮 = TC-301(PC 发 64B);第 31~60 轮 = TC-302(1B/64B/200B)
|
||||
* 第 1~30 轮 = TC-NET-301(PC 发 64B);第 31~60 轮 = TC-NET-302(1B/64B/200B)
|
||||
* "HELLO"(5B) 为 PC 就绪探针:照常回显但不计入轮次
|
||||
* 通过:60/60 有效轮回显成功。
|
||||
* 失败:任意轮回显超时或解析错误。
|
||||
@@ -1037,7 +1037,7 @@ static void phase2_run(void)
|
||||
|
||||
#ifdef ENABLE_PHASE3_TESTS
|
||||
|
||||
/* UDP 有效回显轮数:1~30 = TC-301(64B),31~60 = TC-302(变长)。
|
||||
/* UDP 有效回显轮数:1~30 = TC-NET-301(64B),31~60 = TC-NET-302(变长)。
|
||||
* "HELLO" 探针只回显不计数,与 test/ch395f_socket_test.py udp_client 约定 */
|
||||
#ifndef PHASE3_TOTAL_ROUNDS
|
||||
#define PHASE3_TOTAL_ROUNDS 60
|
||||
@@ -1329,7 +1329,7 @@ phase4_end:
|
||||
#define PHASE5_TOTAL_BYTES (256*1024) /* 回传总量 */
|
||||
#endif
|
||||
#ifndef PHASE5_CHUNK_SIZE
|
||||
#define PHASE5_CHUNK_SIZE 4093 /* 单块 = socket 默认发送缓冲,DP-04 边界 */
|
||||
#define PHASE5_CHUNK_SIZE 4093 /* 单块 = socket 默认发送缓冲,DMA 边界安全 */
|
||||
#endif
|
||||
#ifndef PHASE5_CONN_TIMEOUT_MS
|
||||
#define PHASE5_CONN_TIMEOUT_MS 15000
|
||||
@@ -1452,7 +1452,7 @@ static void phase5_run(void) {
|
||||
/* ---- 发送缓冲空闲:生成并写入一块 ---- */
|
||||
phase5_gen_block(tx, (uint32_t)blk_tx); /* 确定性生成第 blk_tx 块模式(TX/RX 可复现) */
|
||||
sum_tx += phase5_sum32(tx, PHASE5_CHUNK_SIZE); /* 先累加发送侧总账(与 RX 侧对账用) */
|
||||
ch395f_write_send_buf(sock, tx, PHASE5_CHUNK_SIZE); /* 4096B 单次写入(= 发送缓冲上限,DP-04 边界) */
|
||||
ch395f_write_send_buf(sock, tx, PHASE5_CHUNK_SIZE); /* 4096B 单次写入(= 发送缓冲上限,DMA 边界安全) */
|
||||
blk_tx++; /* 该块已交出 */
|
||||
can_write = 0; /* 进入等待 SENBUF_FREE 状态 */
|
||||
tx_sw = HAL_GetTick(); /* 记录等待起点(供超时判定) */
|
||||
@@ -1520,7 +1520,7 @@ static void phase5_run(void) {
|
||||
break; /* 缓冲空,跳出排空循环 */
|
||||
}
|
||||
if (rlen > PHASE5_CHUNK_SIZE) {
|
||||
rlen = PHASE5_CHUNK_SIZE; /* 单次读取上限 = 块大小(DP-04 4KB DMA 边界) */
|
||||
rlen = PHASE5_CHUNK_SIZE; /* 单次读取上限 = 块大小(DMA 边界安全,4KB) */
|
||||
}
|
||||
ch395f_read_recv_buf(sock, rx, rlen); /* 一次 SPI 事务读走 rlen 字节 */
|
||||
{
|
||||
|
||||
@@ -822,7 +822,7 @@ static void gd5f_phase11(void)
|
||||
|
||||
blk = gd5f_find_run(1);
|
||||
if (blk >= GD5F_TOTAL_BLOCKS) {
|
||||
GD5F_TEST_CHECK(0, "TC-GD5F-1100 no usable block for repro");
|
||||
GD5F_TEST_CHECK(0, "no usable block for repro");
|
||||
GD5F_TEST_REPORT("GD5F Phase 11");
|
||||
return;
|
||||
}
|
||||
@@ -873,7 +873,7 @@ static void gd5f_phase11(void)
|
||||
round_bad = 1;
|
||||
if (first_bad < 0) {
|
||||
first_bad = round;
|
||||
DBG_INFO("TC-GD5F-1101 r=%d p=%u IMM mismatch head=%02X %02X %02X %02X "
|
||||
DBG_INFO("r=%d p=%u IMM mismatch head=%02X %02X %02X %02X "
|
||||
"tail=%02X %02X %02X %02X",
|
||||
round, (unsigned)s_p11_probe[pi],
|
||||
s_rbuf[0], s_rbuf[1], s_rbuf[2], s_rbuf[3],
|
||||
@@ -913,18 +913,18 @@ static void gd5f_phase11(void)
|
||||
imm_bad++;
|
||||
}
|
||||
if (round == 1 || (round & 3) == 0) {
|
||||
DBG_INFO("TC-GD5F-1101 progress r=%d/%d storm_fail=%d imm_fail=%d ctl_fail=%d",
|
||||
DBG_INFO("progress r=%d/%d storm_fail=%d imm_fail=%d ctl_fail=%d",
|
||||
round, GD5F_P11_ROUNDS, storm_fail, imm_fail, ctl_fail);
|
||||
}
|
||||
}
|
||||
|
||||
GD5F_TEST_CHECK(storm_fail == 0,
|
||||
"TC-GD5F-1100 storm ops: erase/program all OK (fail=%d)", storm_fail);
|
||||
"storm ops: erase/program all OK (fail=%d)", storm_fail);
|
||||
GD5F_TEST_CHECK(imm_bad == 0,
|
||||
"TC-GD5F-1101 immediate read after storm: %d/%d bad rounds (pages=%d first=%d)",
|
||||
"immediate read after storm: %d/%d bad rounds (pages=%d first=%d)",
|
||||
imm_bad, GD5F_P11_ROUNDS, imm_fail, first_bad);
|
||||
GD5F_TEST_CHECK(ctl_fail == 0,
|
||||
"TC-GD5F-1102 delayed(50ms) read: %d/%d bad rounds (pages=%d)",
|
||||
"delayed(50ms) read: %d/%d bad rounds (pages=%d)",
|
||||
ctl_bad, GD5F_P11_ROUNDS, ctl_fail);
|
||||
GD5F_TEST_REPORT("GD5F Phase 11");
|
||||
}
|
||||
|
||||
@@ -447,7 +447,7 @@ void net_latency_phase12_run(void)
|
||||
(void)ch395f_check_exist();
|
||||
break;
|
||||
default:
|
||||
/* 例外(同 P1-06):被测对象就是本 API 的 SPI 时延——硬件层
|
||||
/* 例外(同 Phase 1 全局中断状态用例):被测对象就是本 API 的 SPI 时延——硬件层
|
||||
* 独占上下文、无并发消费者;除此之外测试代码禁读全局寄存器
|
||||
* (读即清,唯一读者 = net_poll,F-NET-7) */
|
||||
(void)ch395f_get_glob_int_status_all();
|
||||
@@ -515,7 +515,7 @@ void net_latency_phase12_run(void)
|
||||
* 段定义(说明文档 §1):
|
||||
* L5 queue_rt_recv / queue_rt_send —— 调用方视角 net_recv/net_send
|
||||
* 全程(入队 + netTask 调度 + 处理 + 通知),静默基线档;
|
||||
* 压力档 = peer --ftp-stress(lftpd 阻塞读占住 netTask → E-02 复现)
|
||||
* 压力档 = peer --ftp-stress(lftpd 阻塞读占住 netTask → 头阻塞复现)
|
||||
* L6 req2first_mcu —— 请求收齐 → 应答发送完成(MCU 侧,含队列+1 chunk)
|
||||
* L7 fullframe_mcu —— 9B LCDMEM 请求 → 3209B 全帧发送完成
|
||||
* (netTask 内 4 次分块停止等待,= 生产路径发送段)
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
|
||||
/*
|
||||
* 缓冲区声明前置于全部 Phase 代码:声明必须早于任何使用点(Phase 6
|
||||
* 即首次使用 s_rx_buf)。P1-9 修复:原声明位于文件后段(Phase 8 注释块
|
||||
* 即首次使用 s_rx_buf)。历史修复:原声明位于文件后段(Phase 8 注释块
|
||||
* 之后),phase6_run 使用先于声明 → ARMCC #20 identifier undefined,
|
||||
* 全部 NET 层测试配置不可编译。声明条件按各 Phase 实际用缓冲精确门控:
|
||||
* s_rx_buf —— Phase 6(Echo)/9(Select) 恒用,
|
||||
|
||||
@@ -329,7 +329,7 @@ static void storage_test_name_validation(void)
|
||||
}
|
||||
|
||||
#ifdef ENABLE_DESTRUCTIVE_TESTS
|
||||
/* TC-STORAGE-06: 打开模式与写回字节数语义(守护 FA_OPEN_APPEND / 短写陷阱)
|
||||
/* 打开模式与写回字节数语义(守护 FA_OPEN_APPEND / 短写陷阱)
|
||||
* 本移植 FA_OPEN_APPEND 不含 FA_WRITE → 不带写位打开 f_write 必返 FR_DENIED;
|
||||
* 追加写必须 FA_WRITE|FA_OPEN_APPEND。另 f_write 簇耗尽返 FR_OK+短写(无错误
|
||||
* 码),判成败必须校验写回字节数。锁定这两条移植专有语义防回归。
|
||||
@@ -339,17 +339,17 @@ static void storage_test_open_modes(void)
|
||||
UINT bw;
|
||||
FRESULT r;
|
||||
|
||||
DBG_INFO("=== Storage Test: TC-STORAGE-06 Open-mode semantics ===");
|
||||
DBG_INFO("=== Storage Test: Open-mode semantics ===");
|
||||
|
||||
if (f_mount(&fs, "", 1) != FR_OK) {
|
||||
STORAGE_TEST_CHECK(0, "TC-STORAGE-06 mount");
|
||||
STORAGE_TEST_CHECK(0, "mount");
|
||||
return;
|
||||
}
|
||||
(void)f_unlink("mode.tmp");
|
||||
|
||||
/* 1) 建一个含初始内容的文件 */
|
||||
r = f_open(&fil, "mode.tmp", FA_CREATE_ALWAYS | FA_WRITE);
|
||||
STORAGE_TEST_CHECK(r == FR_OK, "TC-STORAGE-06 create base file");
|
||||
STORAGE_TEST_CHECK(r == FR_OK, "create base file");
|
||||
if (r == FR_OK) {
|
||||
f_write(&fil, "abc", 3, &bw);
|
||||
f_close(&fil);
|
||||
@@ -357,36 +357,36 @@ static void storage_test_open_modes(void)
|
||||
|
||||
/* 2) FA_OPEN_APPEND(无 FA_WRITE)→ 写必返 FR_DENIED */
|
||||
r = f_open(&fil, "mode.tmp", FA_OPEN_APPEND);
|
||||
STORAGE_TEST_CHECK(r == FR_OK, "TC-STORAGE-06 open append(no write)");
|
||||
STORAGE_TEST_CHECK(r == FR_OK, "open append(no write)");
|
||||
if (r == FR_OK) {
|
||||
FRESULT wr = f_write(&fil, "xyz", 3, &bw);
|
||||
STORAGE_TEST_CHECK(wr == FR_DENIED,
|
||||
"TC-STORAGE-06 append-no-write must DENY (fr=%d)", (int)wr);
|
||||
"append-no-write must DENY (fr=%d)", (int)wr);
|
||||
f_close(&fil);
|
||||
}
|
||||
|
||||
/* 3) FA_WRITE|FA_OPEN_APPEND → 追加成功且字节数正确 */
|
||||
r = f_open(&fil, "mode.tmp", FA_WRITE | FA_OPEN_APPEND);
|
||||
STORAGE_TEST_CHECK(r == FR_OK, "TC-STORAGE-06 open write|append");
|
||||
STORAGE_TEST_CHECK(r == FR_OK, "open write|append");
|
||||
if (r == FR_OK) {
|
||||
(void)f_write(&fil, "xyz", 3, &bw);
|
||||
STORAGE_TEST_CHECK(bw == 3, "TC-STORAGE-06 append byte-count (%u)", bw);
|
||||
STORAGE_TEST_CHECK(bw == 3, "append byte-count (%u)", bw);
|
||||
f_close(&fil);
|
||||
}
|
||||
|
||||
/* 4) 只读打开后写 → 必返 FR_DENIED(读句柄不可写) */
|
||||
r = f_open(&fil, "mode.tmp", FA_READ);
|
||||
STORAGE_TEST_CHECK(r == FR_OK, "TC-STORAGE-06 open read-only");
|
||||
STORAGE_TEST_CHECK(r == FR_OK, "open read-only");
|
||||
if (r == FR_OK) {
|
||||
FRESULT wr = f_write(&fil, "q", 1, &bw);
|
||||
STORAGE_TEST_CHECK(wr == FR_DENIED,
|
||||
"TC-STORAGE-06 read-only write must DENY (fr=%d)", (int)wr);
|
||||
"read-only write must DENY (fr=%d)", (int)wr);
|
||||
f_close(&fil);
|
||||
}
|
||||
|
||||
(void)f_unlink("mode.tmp");
|
||||
}
|
||||
#endif /* ENABLE_DESTRUCTIVE_TESTS: TC-STORAGE-06 */
|
||||
#endif /* ENABLE_DESTRUCTIVE_TESTS: 打开模式语义 */
|
||||
#endif /* !ENABLE_STORAGE_RECOVERY_TESTS: 共享缓冲 + 正常测试函数 */
|
||||
|
||||
#ifdef ENABLE_STORAGE_RECOVERY_TESTS
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* 模块名称:板端测试套件公共断言宏
|
||||
* 模块功能:为 test/board/ 下的各测试套件提供**语义统一**的统计结构体与断言/
|
||||
* 报告宏内核,消除 4 套件(CH395F / STORAGE / GD5F / RTC)之间逐字重复的
|
||||
* 宏定义(2026-10-01 测试架构评审 T-4)。
|
||||
* 宏定义(2026-10-01 测试架构评审)。
|
||||
*
|
||||
* 设计取舍:**统计变量仍按套件独立**(各套件持有自己的 `g_xxx_stats`),
|
||||
* 公共宏只提供"内核",由各套件用一行宏把它绑定到自己的统计变量。
|
||||
|
||||
@@ -47,7 +47,7 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
/* 派生标记:任一套件被选中时置位。**2026-10-04 起有唯一消费点**——`Src/freertos.c`
|
||||
* 的 MX_FREERTOS_Init() 用它门控 testTask 的回收(P2-13):产品构建下 CubeMX 生成区
|
||||
* 的 MX_FREERTOS_Init() 用它门控 testTask 的回收:产品构建下 CubeMX 生成区
|
||||
* 无条件创建 testTask,随后本标记未定义 → 立即 vTaskDelete 回收其 8KB CCM 栈 + TCB,
|
||||
* 避免空转占堆。testTask 的调度见 test/board/test_config.c 的 start_test_task(),
|
||||
* 后者**直接按 TEST_SUITE_RTC 等宏分支**,与本标记无关——故"RTC 构建下 testTask 不被
|
||||
|
||||
Reference in New Issue
Block a user