STM_ATEM/User/system_monitor.c
zhoujie 5419e33397 feat(monitor): 增强系统监控与数据存储功能
- 新增数据存储缓冲区可用性检查,防止缓冲区满时数据丢失
- 新增会话文件夹管理功能,每次上电自动创建新的数据存储文件夹
- 新增监控状态定期保存功能,将系统统计信息写入MONITOR.TXT文件
- 新增数据丢弃统计,记录因缓冲区满而未存储的数据包数量
- 优化数据输出模式配置,支持串口输出和存储到卡的独立控制
- 优化USB连接处理逻辑,增加系统稳定性检查

🐛 fix(interrupt): 调整中断优先级配置

- 提高USART1中断优先级(从6调整为2),确保串口通信及时响应
- 调整DMA2_Stream5中断优先级(从0调整为5),优化数据传输调度
- 修复RS485驱动中的忙标志逻辑,改为阻塞式传输以提高可靠性

♻️ refactor(config): 优化系统配置和存储设置

- 重构宏定义配置,统一系统监控开关,分离数据输出模式控制
- 将SD卡最大扇区大小从512调整为4096,优化大文件存储性能
- 增加堆栈大小配置(从0x800调整为0x1000),提高系统稳定性
- 优化USB存储读写超时设置,使用最大超时值确保操作完成

📝 docs(comments): 更新代码注释和文档

- 更新数据存储模块的注释,说明新的会话文件夹管理机制
- 在main.c中添加数据输出模式选择的详细说明注释
- 更新系统监控统计输出格式,包含新增的数据丢弃统计项
2026-02-07 13:02:59 +08:00

170 lines
3.7 KiB
C

#include "system_monitor.h"
#include "fatfs.h"
#include "ff.h"
#include <string.h>
#include <stdio.h>
// 静态变量
static SystemMonitorStats_t g_system_stats = {0};
/**
* @brief 初始化系统监控模块
* @param None
* @retval None
*/
void SystemMonitor_Init(void)
{
memset(&g_system_stats, 0, sizeof(SystemMonitorStats_t));
}
/**
* @brief 增加采样样点计数
* @param None
* @retval None
*/
void SystemMonitor_IncrementSampleCount(void)
{
g_system_stats.total_samples++;
}
/**
* @brief 报告数据处理溢出(数据来不及处理)
* @param None
* @retval None
*/
void SystemMonitor_ReportDataOverflow(void)
{
g_system_stats.data_overflow_count++;
}
/**
* @brief 获取系统统计信息
* @param stats: 统计信息结构体指针
* @retval None
*/
void SystemMonitor_GetStats(SystemMonitorStats_t *stats)
{
if (stats != NULL) {
memcpy(stats, &g_system_stats, sizeof(SystemMonitorStats_t));
}
}
/**
* @brief 报告SD卡写入操作
* @param bytes_written: 写入的字节数
* @retval None
*/
void SystemMonitor_ReportSDWrite(uint32_t bytes_written)
{
g_system_stats.sd_write_count++;
g_system_stats.sd_total_bytes_written += bytes_written;
}
/**
* @brief 报告SD卡写入错误
* @param None
* @retval None
*/
void SystemMonitor_ReportSDWriteError(void)
{
g_system_stats.sd_write_error_count++;
}
/**
* @brief 报告SD卡缓冲区满
* @param None
* @retval None
*/
void SystemMonitor_ReportSDBufferFull(void)
{
g_system_stats.sd_buffer_full_count++;
}
/**
* @brief 报告SD卡文件创建
* @param None
* @retval None
*/
void SystemMonitor_ReportSDFileCreated(void)
{
g_system_stats.sd_file_count++;
}
/**
* @brief 报告数据丢弃(缓冲区满时未存储)
* @param None
* @retval None
*/
void SystemMonitor_ReportDataDropped(void)
{
g_system_stats.sd_data_dropped_count++;
}
/**
* @brief 保存监控状态到文件
* @param None
* @retval HAL_StatusTypeDef
*/
HAL_StatusTypeDef SystemMonitor_SaveStatus(void)
{
FIL file;
FRESULT res;
UINT bytes_written;
char buffer[512];
// 创建或覆盖MONITOR.TXT文件
res = f_open(&file, MONITOR_STATUS_FILE, FA_CREATE_ALWAYS | FA_WRITE);
if (res != FR_OK) {
return HAL_ERROR;
}
// 格式化监控数据为文本
int len = snprintf(buffer, sizeof(buffer),
"=== System Monitor Status ===\r\n"
"Total Samples: %lu\r\n"
"Data Overflow: %lu\r\n"
"\r\n"
"=== SD Card Stats ===\r\n"
"SD Write Count: %lu\r\n"
"SD Write Errors: %lu\r\n"
"SD Buffer Full: %lu\r\n"
"SD Total Bytes: %lu\r\n"
"SD File Count: %lu\r\n"
"SD Data Dropped: %lu\r\n",
g_system_stats.total_samples,
g_system_stats.data_overflow_count,
g_system_stats.sd_write_count,
g_system_stats.sd_write_error_count,
g_system_stats.sd_buffer_full_count,
g_system_stats.sd_total_bytes_written,
g_system_stats.sd_file_count,
g_system_stats.sd_data_dropped_count
);
// 写入监控数据
res = f_write(&file, buffer, len, &bytes_written);
if (res != FR_OK || bytes_written != (UINT)len) {
f_close(&file);
return HAL_ERROR;
}
// 关闭文件
f_close(&file);
return HAL_OK;
}
/**
* @brief 从文件加载监控状态
* @param None
* @retval HAL_StatusTypeDef
* @note 当前实现仅用于记录,不恢复状态(避免累积错误)
*/
HAL_StatusTypeDef SystemMonitor_LoadStatus(void)
{
// 当前实现:不从文件恢复状态
// 每次上电重新开始统计,避免累积错误
// MONITOR.TXT仅用于记录上次运行的状态
return HAL_OK;
}