From 5a12044c1a2f827c8415c735147bc832c0eca35f Mon Sep 17 00:00:00 2001 From: wangfq Date: Fri, 26 Jun 2026 14:30:51 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20vTaskDelay=2010=E2=86=9250ms=20=E5=AF=B9?= =?UTF-8?q?=E9=BD=90=20DLD154V4B=20=E5=8E=9F=E5=A7=8B=E8=AE=BE=E8=AE=A1,?= =?UTF-8?q?=20=E5=88=9B=E5=BB=BA=20docs/devlog.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit loop_task_function 主循环周期修正: - 原值 10ms 是 FreeRTOS 移植时的疏忽 - 改为 50ms 对齐原始 TMR15 5ms×10 设计 - 基线更新: 100×10ms=1s → 100×50ms=5s (Origin 更稳定) - CPU 占用降低 5× 创建 docs/devlog.md 记录 V2.0~V2.2 全部改动。 --- vd960Loop/docs/devlog.md | 52 +++++++++++++++++++ .../at32f421_freertos_demo/src/TaskLoop.c | 2 +- 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 vd960Loop/docs/devlog.md diff --git a/vd960Loop/docs/devlog.md b/vd960Loop/docs/devlog.md new file mode 100644 index 0000000..509a15a --- /dev/null +++ b/vd960Loop/docs/devlog.md @@ -0,0 +1,52 @@ +# vd960Loop 开发日志 + +> MCU: AT32F421 (Cortex-M4, 120MHz) | 线圈通道: 4路 | 调试口: TTL Tx (3.3V 9600 8N1) + +--- + +## 2026-06-26 — 多项可配置化改造 + +### 1. 上报频率从 raw CAPVD 改为实际线圈频率 + +`uart_report_packet_loop_acs` 和 `CMD_DBN_GET_MCJQ_PARAM` 中,频率字段原来直接上报 `loop_CAPVD`(IIR 累加值),现改为经过公式转换的实际频率: + +```c +freq = (sclk_freq × input_div × LPCNT) / CAPVD +``` + +使用 `uint64_t` 先乘后除避免整数截断,`LPCNT>0 && CAPVD>0` 防除零。 + +### 2. 有限存在时长可配置 (hold_time) + +- `Loop154_Unit` 新增 `uint16_t hold_time` 字段 +- `storage.c` 从 `exist_mode` 计算: `hold_time = exist_mode × 20 × 5`(tick 数,每 tick 50ms) +- `vd1_task_per_channel` 判定有车时: 若 `hold_time > 0` 则 `loop_VD_HOLD = 1`,启用有限存在计时 +- `TMR15_GLOBAL_IRQHandler`: `Hold_CNT > unit->hold_time` 替代固定 `HOLD_TIME` +- 超时后执行通道完整重启(`LC_Reset=1, loop_INI_LOOP=1`),相当于线圈重启重建基线,避免继电器释放后立即重新吸合 +- `exist_mode=0` 时不启用有限存在,兼容无限制存在场景 + +### 3. 离开延时可配置 (relay_delay) + +- `Loop154_Unit` 新增 `uint16_t relay_delay` 字段 +- `storage.c` 从 `delay_time` 计算: `relay_delay = delay_time × 2`(tick 数) +- `TMR15_GLOBAL_IRQHandler`: `OUTCNT > unit->relay_delay` 替代固定 `OUT_DELAY` + +### 4. vTaskDelay 修正: 10ms → 50ms + +`loop_task_function` 的主循环 `vTaskDelay` 从 `10ms` 改为 `50ms`,对齐 DLD154V4B 原始设计(TMR15 5ms×10)。 + +**影响:** +- 基线更新周期: 100×10ms=1s → 100×50ms=5s(对齐原始设计,Origin 更稳定) +- CPU 占用: 主循环轮询频率降低 5×,节省 CPU + +**原因:** TMR3 ISR ~1ms 产出一个 CAP_OK 样本,50ms 内有 ~50 个样本。`vd1_task_per_channel` 每个 tick 只取最新一个做 IIR,10ms 轮询时 CAP_OK 总是 ready,改为 50ms 不影响有效测量速率——采集由 TMR3 ISR 硬件驱动,基线更新速率受 `vd1_task` tick 限制。 + +--- + +## 修订记录 + +| 版本 | 时间 | 说明 | +|------|------|------| +| V2.2 | 2026-06-26 | vTaskDelay 10→50ms 对齐原始设计 | +| V2.1 | 2026-06-26 | hold_time/relay_delay 可配置,有限存在完整重启 | +| V2.0 | 2026-06-26 | 频率上报 CAPVD→实际频率转换 | diff --git a/vd960Loop/utilities/at32f421_freertos_demo/src/TaskLoop.c b/vd960Loop/utilities/at32f421_freertos_demo/src/TaskLoop.c index c0bbf49..d4a32a4 100644 --- a/vd960Loop/utilities/at32f421_freertos_demo/src/TaskLoop.c +++ b/vd960Loop/utilities/at32f421_freertos_demo/src/TaskLoop.c @@ -640,7 +640,7 @@ void loop_task_function(void *pvParameters) } wdt_feed(); - vTaskDelay(10); + vTaskDelay(50); // 50ms tick,对齐 DLD154V4B 原始设计 (TMR15 5ms×10) } }