- 新增数据存储缓冲区可用性检查,防止缓冲区满时数据丢失 - 新增会话文件夹管理功能,每次上电自动创建新的数据存储文件夹 - 新增监控状态定期保存功能,将系统统计信息写入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中添加数据输出模式选择的详细说明注释 - 更新系统监控统计输出格式,包含新增的数据丢弃统计项
170 lines
3.7 KiB
C
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;
|
|
}
|