- 新增配置管理器模块,支持从SD卡加载运行时配置 - 将数据输出模式从编译时宏改为运行时配置,提高灵活性 - 新增配置文件 `CONFIG.TXT`,支持串口输出和存储功能的动态开关 - 集成配置管理器到主程序,在系统启动时自动加载配置 - 更新数据存储模块,使用配置管理器管理会话序号 🐛 fix(usart): 修复USART3中断配置并优化波特率 - 添加USART3中断处理函数声明和实现 - 将USART3波特率从921600提升至2000000以提高通信速率 - 调整USART1中断优先级从2改为11,优化中断响应 - 在USART3 MSP初始化和反初始化中添加中断配置 📝 docs(user): 新增功能说明文档 - 新增《配置管理功能说明》文档,详细说明运行时配置的使用方法 - 新增《串口发送监控功能说明》文档,说明新增的串口统计功能 - 文档包含配置项说明、文件格式、使用示例和注意事项 ✨ feat(monitor): 增强系统监控功能 - 在系统监控统计中添加串口发送监控字段(发送次数、字节数、错误数) - 新增串口发送统计报告函数,集成到RS485驱动中 - 优化监控状态保存格式,采用精简格式减少文件写入阻塞时间 - 监控数据现在包含串口统计信息,便于性能分析和故障排查 ♻️ refactor(main): 重构主程序配置处理逻辑 - 移除编译时宏 `DATA_OUTPUT_MODE_UART` 和 `DATA_OUTPUT_MODE_STORAGE` - 使用 `Config_IsUartOutputEnabled()` 和 `Config_IsStorageEnabled()` 函数替代 - 优化数据存储启动逻辑,仅在存储功能启用时开始记录 - 添加配置加载成功/失败的调试输出信息
186 lines
4.1 KiB
C
186 lines
4.1 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 bytes_sent: 发送的字节数
|
|
* @retval None
|
|
*/
|
|
void SystemMonitor_ReportUARTTx(uint32_t bytes_sent)
|
|
{
|
|
g_system_stats.uart_tx_count++;
|
|
g_system_stats.uart_tx_bytes += bytes_sent;
|
|
}
|
|
|
|
/**
|
|
* @brief 报告串口发送错误
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
void SystemMonitor_ReportUARTTxError(void)
|
|
{
|
|
g_system_stats.uart_tx_error_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),
|
|
"Samples:%lu Ovf:%lu\r\n"
|
|
"SD:Wr=%lu Err=%lu Full=%lu Bytes=%lu Files=%lu Drop=%lu\r\n"
|
|
"UART:Tx=%lu Bytes=%lu Err=%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,
|
|
g_system_stats.uart_tx_count,
|
|
g_system_stats.uart_tx_bytes,
|
|
g_system_stats.uart_tx_error_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;
|
|
}
|