📝 docs(openspec): 新增 DVP-DMA-IR 检查的文档和规范

- 在 openspec/changes/archive/ 下新增 2026-03-13-check-dvp-dma-ir 归档目录
- 新增设计文档 (design.md),包含背景、目标、决策和风险评估
- 新增提案文档 (proposal.md),说明变更原因、内容和影响
- 新增功能规范 (spec.md),定义 DVP 配置验证、DMA 内存传输正确性和诊断输出要求
- 新增任务清单 (tasks.md),列出代码审查、中断处理和诊断验证的具体步骤
- 更新 openspec/config.yaml,添加上下文注释
- 在 openspec/specs/ 下新增 dvp-dma-ir-capture 功能规范

🐛 fix(dvp): 修复 DVP 任务中的竞态条件并增强调试输出

- 在 DVP_Task() 中访问 Line_Ready_Flag 和 Ready_Line_Ptr 前禁用 DVP 中断,操作后重新启用,防止数据竞争
- 增强第0行的调试打印,每秒计算并输出帧率 (fps)
- 新增打印第0行前8个字节的原始数据,用于验证数据有效性
- 使用外部定义的 sys_tick_ms 进行时间计算,确保时间基准一致
This commit is contained in:
2026-03-13 23:25:48 +08:00
parent 621ab220ef
commit 82d672a2d3
8 changed files with 136 additions and 7 deletions
+18 -3
View File
@@ -12,6 +12,7 @@ volatile uint32_t current_line_idx = 0;
static uint32_t frame_count = 0;
extern u8 socket[];
extern volatile uint32_t sys_tick_ms;
void DVP_Init(void)
{
@@ -51,9 +52,11 @@ void DVP_Task(void)
{
if (!Line_Ready_Flag) return;
NVIC_DisableIRQ(DVP_IRQn);
uint8_t *line = (uint8_t *)Ready_Line_Ptr;
uint32_t idx = current_line_idx;
Line_Ready_Flag = 0;
NVIC_EnableIRQ(DVP_IRQn);
/* 仅发送图像行,跳过参数行,且 socket 已连接 */
if (idx < SENSOR_HEIGHT && socket[0] != 0xFF)
@@ -68,9 +71,21 @@ void DVP_Task(void)
len = BYTES_PER_LINE;
WCHNET_SocketSend(socket[0], line, &len);
/* 每帧第0行打印一次,确认帧号和socket状态 */
if (idx == 0)
printf("[DVP] frame=%lu socket=%d\r\n", frame_count, socket[0]);
/* 每帧第0行打印一次,确认帧率、帧号和socket状态与数据 */
if (idx == 0) {
static uint32_t last_fps_tick = 0;
static uint32_t last_frame_count = 0;
uint32_t now = sys_tick_ms;
if (now - last_fps_tick >= 1000) {
uint32_t fps = frame_count - last_frame_count;
printf("[DVP] frame=%lu fps=%lu socket=%d tick=%lu\r\n", frame_count, fps, socket[0], now);
printf(" Row0 Data: %02X %02X %02X %02X %02X %02X %02X %02X\r\n",
line[0], line[1], line[2], line[3], line[4], line[5], line[6], line[7]);
last_fps_tick = now;
last_frame_count = frame_count;
}
}
}
else if (idx == 0 && socket[0] == 0xFF)
{