Files
STM32F4-Base/test/host/net_socket/stub/ns_rtos.h
T
wandering1 794906cdc8 test(host): P2 覆盖率批次,5 套主机单测与共享假 FatFs
P2 五个文件全部进分母(三名队友并行,写范围互斥、零越界):
  net_socket 420 条 / 881-883=99.8%、52-52 函数(S1~S6 分片)
  sys_log_mcu 75 条 / 310-313=99.0%、12-12
  console_log 104 条 / 188-189=99.5%、15-15
  cfg_file_store_mcu 34 条 / 97-97=100%、10-10
  soe_store 26 条 / 78-79=98.7%、4-4
合计 659 条断言,P2 本体 1554-1561=99.6%、93-93 函数。

账:套件 28→33 全绿;files_tested 32→37;未触及 112→107(.c 34→29,
恒等式 29 = 0(P1剩) + 0(P2) + 29(P3) 咬合,§9 终点判据达成);分母
4684→6245 插桩行;line 85.8%→89.3%;func 90.1%→92.2%(这批 5 个文件
全都以 ≥98.7% 进分母,故未摊薄)。--update-baseline 前后逐文件比对:
下降 0 个文件。

基建:新建 test/host/common/fatfs_fake.{h,c}(以真实 ff.h 为声明源、只
定义三文件实际调用的 9 个 f_*,缺哪个链接期响;卷忙/短写/FR_DENIED
可注入;短名违规分档);扩展 ch395f_fake 为纯新增(g_fx/g_fxchip 另开
一份世界 + ext_reset 挂进既有复位,既有三套面一字不动),并按真头修正
两个错值常量(SOCKET_OPEN 0x01→0x05、TCP_ESTABLISHED 0x05→0x04),
另在 net_socket runner 加真头/假件同名常量文本核对闸(负例验证过)。
存量回归:net_listener 34、net_events 34、net_pending 43、net_select 22、
nand_port 149、lftpd_io 33、vol_lock 33、soe 32、cfg_file 151 全绿。

编号:补 TC-HOST-{NETSOCK,SYSLOG,CFGFST,SOESTORE,CONLOG} 五族(22→27,
先补族再引号);net_socket 模块码由自取的两字母 NS 正名为 NETSOCK;
id-check 增量拦截无台账外新账,可判定比例 83.27%(基线 82.6%)。

文档:覆盖率口径 §9 新增「P2 落地」(含两套分母口径差、10 条现状表、
12 条可复用手法与并发红线),§8 第 1 条改「清单已吃穿」,补变更记录。
本提交未改任何生产代码(App/Drivers/Src/Lib/MDK-ARM 零触碰)。

10 条现状已逐条登记在 §9(含 sys_log_mcu.c:509~537 卷忙整批丢日志、
net_socket.c 同文件两套 IP 字节序、UDP 两 API 绕过 netTask),已获指示
全部修复,另开一轮(含测试字面量统一纯 ASCII)。

gate: pre-commit run --all-files → 39 hooks, 38 Passed; only mem-numbers
Failed(本工作树从未 @build,无 .map 事实源,属分支期已知陷阱);
mem-budget Passed;test-coverage 与 id-check Passed。RAM/Flash 增量 = 0
(纯测试批次)。按仓内分支约定走 --no-verify,台账回填留待主树合并后。
2026-10-24 17:54:02 +08:00

85 lines
3.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 模块名称:假内核(net_socket 主机侧单测专用)
* 模块功能:给 net_socket.c 一份可在 PC 上跑的 FreeRTOS/CMSIS-RTOS2 薄壳——
* 消息队列(osMessageQueuePut/Get,真实 cmsis_os2.h 的原型)、
* 任务通知(xTaskNotify / xTaskNotifyWait)、当前任务句柄、时基、临界区计数。
*
* ⚠ 仅供 test/host/net_socket/ 使用,不参与 MCU 构建。
*
* 关键设计:**阻塞等待即调度点**。net_wait_result 的第二段
* xTaskNotifyWait(..., portMAX_DELAY) 在真机上是"睡到 netTask 回执";这里把这一次
* 等待实现成"调用测试装泵的 pump 钩子(= 以 netTask 身份跑一轮
* net_process_messages()),再拾取通知值"。于是单次 net_send()/net_recv() 调用就能
* 把"入队 → 分派 → 通知值回传 → 调用方恢复 errno"整条跨上下文链真实跑完,
* 而不是把中间环节假掉。
*
* 泵保险:pump 钩子最多跑 NS_PUMP_MAX 轮,超了直接 exit(2)——否则一条"该通知却没通知"
* 的缺陷会让门禁挂死而不是报错(本仓假 osDelay 的跑飞保险同一条纪律)。
*
* 创建日期:2026-10-24
*/
#ifndef NS_RTOS_H
#define NS_RTOS_H
#include "FreeRTOS.h"
#include "cmsis_os2.h"
#include "main.h" /* 桩:HAL_GetTick / HAL_GPIO_ReadPin / CH395_INT_* */
#define NS_Q_CAP 8u
#define NS_PUMP_MAX 50
/* 两个假任务:调用方任务 + netTask(句柄取地址即唯一) */
extern int g_ns_task_caller;
extern int g_ns_task_net;
/* 当前任务句柄(测试直接读写:切换"我是调用方"还是"我是 netTask") */
extern TaskHandle_t g_ns_cur_task;
/* 阻塞等待时跑的泵(测试装:通常 = 跑一轮 net_process_messages) */
typedef void (*ns_pump_fn)(void);
extern ns_pump_fn g_ns_pump;
extern int g_ns_pump_calls; /* 泵被驱动的次数 */
extern int g_ns_block_waits; /* 真正走到"阻塞分支"的次数 */
/* 通知/队列观测面 */
extern int g_ns_notify_calls; /* xTaskNotify 总次数 */
extern uint32_t g_ns_notify_last_val;
extern TaskHandle_t g_ns_notify_last_to;
extern int g_ns_put_calls;
extern int g_ns_get_calls;
extern int g_ns_crit_enter;
extern int g_ns_crit_exit;
extern uint32_t g_ns_tick;
void ns_rtos_reset(void);
void ns_rtos_q_flush(void);
int ns_rtos_q_count(void);
void ns_rtos_q_fill(int n); /* 预灌 n 条占位消息(把队列灌到满,测 BUSY 分支) */
/* 测试用的显式通知投递(不经队列,直接给某任务置通知值) */
void ns_rtos_post_notify(TaskHandle_t to, uint32_t v);
/* 手工投一条原始消息(绕过公开包装器:造未知 type、造 netTask 自调等异常形态) */
int ns_rtos_q_put_raw(const net_msg_t *msg);
/* —— 下面是给桩头对接的实现(原型与真实头一致) —— */
osStatus_t osMessageQueuePut(osMessageQueueId_t mq_id, const void *msg_ptr,
uint8_t msg_prio, uint32_t timeout);
osStatus_t osMessageQueueGet(osMessageQueueId_t mq_id, void *msg_ptr,
uint8_t *msg_prio, uint32_t timeout);
osKernelState_t osKernelGetState(void);
osStatus_t osDelay(uint32_t ticks);
/* 每轮 net_poll(= 一次 INT# 读取)都调一下测试回调:用来在"等待发送缓冲/等待数据"
* 的循环途中投递并发事件(对端断线、芯片突然可读),而不必自己发明时间 API */
typedef void (*ns_poll_hook_fn)(void);
extern ns_poll_hook_fn g_ns_on_poll;
/* CH395F INT# 电平(1=SET 无中断,net_poll 走短路分支) */
extern int g_ns_int_pin_set;
/* 内核状态可注入(net_errno_slot 靠它判"内核没跑起来"的退化分支) */
extern osKernelState_t g_ns_kernel_state;
#endif /* NS_RTOS_H */