2026-03-14 08:12:17 +08:00

2.5 KiB

Context

目前的系统已经具备了以太网 TCP Socket 基础和 DVP+DMA 红外数据矩阵的采集能力。然而主程序目前仅仅是将 DVP 采集到的流进行无差别循环上报,没有执行复杂的预处理逻辑。 根据给定的架构设计文档 (CH32二维运行结构概览.md函数调用指南.md),我们需要:

  1. 导入由第三方或算法工程师提供的闭源/封装好的预处理算法库 (Preprocess_) 和底层 TCP 控制流协议封装 (TcpLogic_)。
  2. 废弃当前无差别的整帧暴力上传阻塞逻辑。
  3. 利用 TcpTxBuffer 的带有 offset 缓冲池机制实现零拷贝的网络流装配上传。
  4. 提供上位机参数回调和错误处理功能(如通过 TcpLogic_RegisterConfigCallback 和 NG 控制逻辑)。

Goals / Non-Goals

Goals:

  • main.cdvp.c 中成功注册、初始化并接入 Preprocess_xxxTcpLogic_xxx 的 API 生命周期。
  • 实现一个不产生内存额外拷贝 (Zero-Copy) 的缓冲区数据流,由预处理根据特定感兴趣区域截取有效温度点后,送入 TCP 模块利用预留位添加封包帧头发出。
  • 加入上位机动态热更新配置和外部气缸硬件IO回调处理。

Non-Goals:

  • 具体的红外滑窗滤波或 TCP 报文组装的底层逻辑编写(这部分属于已封装库,只做 API 调用层面的业务整合)。

Decisions

  • API 包装策略: 为了避免 DVP 中断卡死主线程流,将 DVP 完成一帧(软触发)的逻辑校验放到业务主循环 main 之内。DVP 中断仅仅传递 Line_Ready_Flag 或全局的缓冲区双指针结束标志给主循环去执行高耗时的 Preprocess_CheckInternalTrigger2D 操作。
  • 内存池预分配模型: 在全局申请两个支持偏移量设定的发送大缓存 (TcpTxBuffer_t) 并常驻内存,确保网络封装只需向 Buffer 首部写入 TLV 标头而无需搬运大块图像数据。
  • 配置与剔除反馈同步: 所有与上位机的异步通信指令解析都由 TcpLogic 完成,主程序在此阶段只需挂载好 callback 并使用 volatile 配置影寄存器或标志位与主循环交互即可。

Risks / Trade-offs

  • [Risk] 零拷贝模型的数组越界风险 → 确保 Preprocess 的目标裁断 Buffer 的尺寸 > (Target Width*Height*2 + HeadOffset) 且首字节地址分配精确。
  • [Risk] DMA 和 主循环取图并发导致冲突 (Tearing) → 要求 DVP 在更新下一帧时利用乒乓机制避免同址同时写读,主逻辑处理时需进行资源锁屏。