# SystemMonitor 简化说明 ## 简化目标 为了提高系统性能,将SystemMonitor模块从复杂的状态机和多种错误类型简化为只统计两个关键指标: 1. **采样样点数** - 记录总共采集的样本数量 2. **数据溢出次数** - 记录数据来不及处理的次数 ## 简化前后对比 ### 简化前的结构 ```c typedef struct { SystemState_t current_state; // 系统状态 SystemError_t last_error; // 最后错误 uint32_t uptime_seconds; // 运行时间 uint32_t total_samples; // 总样本数 uint32_t error_count; // 错误计数 uint32_t memory_usage; // 内存使用 uint8_t cpu_usage_percent; // CPU使用率 uint8_t temperature_celsius; // 温度 } SystemMonitorStats_t; ``` 包含多个函数: - `SystemMonitor_SetState()` - 设置系统状态 - `SystemMonitor_ReportError()` - 报告各种错误 - `SystemMonitor_Update()` - 定期更新统计 - `SystemMonitor_IsHealthy()` - 健康检查 ### 简化后的结构 ```c typedef struct { uint32_t total_samples; // 总采样样点数 uint32_t data_overflow_count; // 数据来不及处理的次数 } SystemMonitorStats_t; ``` 只保留3个核心函数: - [`SystemMonitor_Init()`](User/system_monitor.h:14) - 初始化 - [`SystemMonitor_IncrementSampleCount()`](User/system_monitor.h:15) - 增加采样计数 - [`SystemMonitor_ReportDataOverflow()`](User/system_monitor.h:16) - 报告数据溢出 - [`SystemMonitor_GetStats()`](User/system_monitor.h:17) - 获取统计信息 ## 使用方式 ### 1. 初始化 在系统启动时调用: ```c #if ENABLE_SYSTEM_MONITOR SystemMonitor_Init(); #endif ``` ### 2. 采样计数 在 [`ProcessAdcData()`](Core/Src/main.c:146) 中,每处理一个样本时调用: ```c #if ENABLE_SYSTEM_MONITOR SystemMonitor_IncrementSampleCount(); #endif ``` ### 3. 数据溢出报告 当检测到数据来不及处理时(缓冲区无可用数据但应该有数据): ```c } else { // 数据来不及处理 #if ENABLE_SYSTEM_MONITOR SystemMonitor_ReportDataOverflow(); #endif } ``` ### 4. 查看统计信息 通过调试输出查看: ```c SystemMonitorStats_t sys_stats; SystemMonitor_GetStats(&sys_stats); snprintf(buffer, sizeof(buffer), "\r\n=== System Stats ===\r\n" "Total Samples: %lu\r\n" "Data Overflow: %lu\r\n", sys_stats.total_samples, sys_stats.data_overflow_count); ``` ## 性能优势 1. **减少函数调用开销** - 从多个状态设置和错误报告函数简化为2个简单的计数器操作 2. **减少内存占用** - 统计结构从8个字段减少到2个字段 3. **消除复杂逻辑** - 移除状态机、健康检查等复杂逻辑 4. **提高实时性** - 减少中断和关键路径中的处理时间 ## 关键指标说明 ### total_samples(总采样样点数) - 每成功处理一个ADC样本时递增 - 用于监控系统采样率和运行状态 - 可以计算实际采样率:`samples / uptime` ### data_overflow_count(数据溢出次数) - 当数据处理速度跟不上采样速度时递增 - 表示数据丢失或处理延迟的情况 - 理想情况下应该为0或非常小的值 ## 调试输出示例 ``` === System Stats === Total Samples: 40000 Data Overflow: 0 ``` 这表示系统已采集40000个样本,没有发生数据溢出,系统运行正常。 如果看到: ``` === System Stats === Total Samples: 40000 Data Overflow: 150 ``` 说明有150次数据来不及处理,需要优化数据处理流程或降低采样率。