9231a3c22c
P1-5 方案 a(事件驱动消费,Task #32): - TIM6 1 kHz ISR 除触发 CONVST 外再调 adc_tick_irq_notify(),置位 ADC_WAKE_FLAG;adcTask 循环尾改 osThreadFlagsWait(osWaitForever), 删除 ADC_TASK_BEAT_MS 定时轮询 - adcTask 优先级 Normal(24) -> AboveNormal(32)(Src/freertos.c USER CODE 区) - 补消费者就绪门(规划未预见):TIM6 在 app_main_init 就启动,比调度器 早约 100 ms,未就绪时 ISR 不得 osThreadFlagsSet - 实测 6 次上板:idle 由 1~649 降到 0/20000 拍,frames 1000.0 Hz, seq-frames=7 正是就绪窗口;UI 侧 uip/uiw/uis 无退化 补 STM32F4 ADC 上电自校准(此前项目从未做过): - 核查证实裁剪版 HAL 无 HAL_ADCEx_Calibration_Start、裁剪版 CMSIS 头无 ADC_CR2_CAL -> 按 RM0090 13.3.6 在 Src/adc.c 的 USER CODE 区手写 adc1_calibrate(),MX_ADC1_Init() 末尾调用 - 新增 cubemx-survival 审计项 adc1-calibration-call / -impl(清单 21->23) - 实测校准前后同一拍 STM32 侧 6 路同向偏移 +10~+63 LSB,TPAFE 侧不变 修正两处过期表述(实测反证): - 原文 9 通道全超时最坏 = 18 ms 连占 有误:stm32_scan() 在首个超时处即 Stop+return,单拍上界 = 一次超时约 2~3 ms - adcm 约 2.1 ms 的峰值归因由 ADC 采集改判为每 10 s 一次的心跳日志; 6 次对照 adcp = 122 us(无超时)/ 2209 us(超时 1 次) - 同步修正 adc_task.c 两处过期注释;新发现超时拍 STM32 侧静默沿用 上一拍值的正确性代价,硬化排序记入 4.4 / 10.4(未实施) 验证:@build 0 错 0 警(Code 256728 -> 256868);@test 6/6 PASS; stack_report 7 任务全 PASS(adcTask 832 B / 余 59%);18 钩子全绿
40 lines
1.4 KiB
C
40 lines
1.4 KiB
C
/*
|
||
* 模块名称:ADC Sampling Task
|
||
* 模块功能:TPAFE5160 8 通道同步采样,数据缓存与通知
|
||
* 适用平台:STM32F407ZGTx + TPAFE5160
|
||
* 作者:王建锋
|
||
* 创建日期:2026-07-19
|
||
* 修改记录:
|
||
* v1.0 2026-07-19 王建锋 创建初始版本
|
||
* v1.1 2026-10-10 王建锋 Task #32 P1-5 方案 a:新增 ADC_WAKE_FLAG 与
|
||
* adc_tick_irq_notify()——消费节拍由 osDelayUntil(1ms)
|
||
* 轮询改为 TIM6 ISR 事件驱动唤醒
|
||
*/
|
||
|
||
#ifndef ADC_TASK_H
|
||
#define ADC_TASK_H
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
int adc_task_init(void);
|
||
void adc_task_func(void *arg);
|
||
|
||
/* Task #32 P1-5(方案 a,2026-10-10):事件驱动消费。
|
||
* TIM6 1 kHz 更新中断触发 CONVST 后,用本标志唤醒 adcTask 消费一拍。
|
||
* 线程标志在此是**命令位**(等待即消费),不是状态位 → 用 osFlagsWaitAny,
|
||
* 不加 osFlagsNoClear(AGENTS「就绪屏障位必须 osFlagsNoClear」只约束状态位) */
|
||
#define ADC_WAKE_FLAG 0x0001U
|
||
|
||
/* ISR 入口:由 Src/main.c 的 HAL_TIM_PeriodElapsedCallback(TIM6 分支)调用。
|
||
* 内部自带"消费者就绪"门与句柄判空 → 调度器启动前调用也安全(理由见 .c 注释)。
|
||
* 收在 adc_task.c 而非 main.c 内联:main.c 不碰任何内核句柄,与 task_wd_tick_probe() 同构 */
|
||
void adc_tick_irq_notify(void);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif /* ADC_TASK_H */
|