FanControl 风扇控制软件完整上手指南:把散热节奏握回自己手里
2026/8/19 2:51:34
裸机驱动的数据准备应贴近实际硬件信号,同时把标注方式、采集条件和观测边界写清楚。
记录波形来源、供电和时钟条件、标签规则以及推理执行周期;不要把单次实验数据写成通用精度。
正常 SPI 波形 (MOSI): ____|ˉˉˉˉ|____|ˉˉˉˉ|____ (干净的 0/1 沿) 故障波形 (电源纹波): ~_~_|ˉ~ˉ|~_~_|ˉ~ˉ|~_~_ (带毛刺与上升沿缓慢)#include <stdint.h> #include <stdbool.h> #include <stdio.h> // 假设硬件 SysTick 寄存器定义 #define SYSTICK_CTRL (*(volatile uint32_t*)0xE000E010) #define SYSTICK_LOAD (*(volatile uint32_t*)0xE000E014) #define SYSTICK_VAL (*(volatile uint32_t*)0xE000E018) typedef struct { uint32_t can_id; uint8_t dlc; uint8_t data[8]; uint32_t bus_error_flags; // 硬件捕获的物理错误标志 } CAN_Frame_Benchmark_t; // 模拟裸机 AI 预测决策模型(基于轻量级决策树/线性回归) bool Predict_CAN_Bus_Anomaly(const CAN_Frame_Benchmark_t* frame) { // 提取物理特征:DLC 异常、CRC 错误标记与错误帧连续性 int32_t score = 0; if (frame->dlc > 8) score += 50; if (frame->bus_error_flags & 0x04) score += 40; // ACK Error if ((frame->can_id & 0x7FF) == 0x00) score += 20; // 广播优先级帧 return score > 60; } void Benchmark_Run_Eval(const CAN_Frame_Benchmark_t* test_set, size_t set_size) { uint32_t total_cycles = 0; uint32_t false_positives = 0; uint32_t true_positives = 0; for (size_t i = 0; i < set_size; i++) { // 重置 SysTick 计数器 SYSTICK_VAL = 0; uint32_t start_cycles = SYSTICK_VAL; bool is_anomaly = Predict_CAN_Bus_Anomaly(&test_set[i]); uint32_t stop_cycles = SYSTICK_VAL; // 计算递减计数器的 Cycle 差值 uint32_t elapsed = (start_cycles >= stop_cycles) ? (start_cycles - stop_cycles) : (SYSTICK_LOAD - stop_cycles + start_cycles); total_cycles += elapsed; // 对比 Ground Truth 评估指标 bool ground_truth = (test_set[i].bus_error_flags != 0); if (is_anomaly && !ground_truth) { false_positives++; } else if (is_anomaly && ground_truth) { true_positives++; } } printf("==== 裸机 AI 驱动基准测试报告 ====\n"); printf("平均执行 Cycle 开销: %u cycles/frame\n", total_cycles / (uint32_t)set_size); printf("假阳性误报率 (FPR): %.4f%%\n", ((float)false_positives / set_size) * 100.0f); printf("物理故障拦截率: %.4f%%\n", ((float)true_positives / set_size) * 100.0f); }$ gcc -O2 -g -I./inc drivers/can_ai_driver.c test/benchmark_host.c -o bench_host $ valgrind --tool=memcheck --leak-check=full ./bench_host ==18923== Memcheck, a memory error detector ==18923== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) $ perf stat -e cycles,instructions,cache-misses ./bench_host Performance counter stats for './bench_host': 1,204,512 cycles 2,890,120 instructions # 2.40 insn per cycle 412 cache-misses 0.001124500 seconds time elapsed