- 新增数据存储缓冲区可用性检查,防止缓冲区满时数据丢失 - 新增会话文件夹管理功能,每次上电自动创建新的数据存储文件夹 - 新增监控状态定期保存功能,将系统统计信息写入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中添加数据输出模式选择的详细说明注释 - 更新系统监控统计输出格式,包含新增的数据丢弃统计项
91 lines
3.3 KiB
C
91 lines
3.3 KiB
C
#ifndef DATA_STORAGE_H
|
|
#define DATA_STORAGE_H
|
|
|
|
#include "main.h"
|
|
#include "fatfs.h"
|
|
#include "ff.h"
|
|
#include "data_packet.h"
|
|
#include "correction.h"
|
|
#include <stdint.h>
|
|
|
|
// 数据存储配置
|
|
#define DATA_STORAGE_BUFFER_SIZE 32768 // 缓冲区大小(字节)
|
|
#define DATA_STORAGE_FILE_MAX_SIZE (20*1024*1024) // 单个文件最大20MB
|
|
#define DATA_STORAGE_BASE_PATH "0:/DATA" // 数据存储基础路径
|
|
#define DATA_STORAGE_FILE_PREFIX "/ADC_DATA_" // 文件名前缀
|
|
#define DATA_STORAGE_FOLDER_PREFIX "SESSION_" // 文件夹名前缀
|
|
#define DATA_STORAGE_PARAM_FILE "0:/PARAM.TXT" // 记录会话序号的文件
|
|
#define DATA_STORAGE_MAX_PATH_LEN 128 // 最大路径长度
|
|
|
|
// 缓冲区状态
|
|
typedef enum {
|
|
BUFFER_IDLE = 0, // 缓冲区空闲
|
|
BUFFER_WRITING, // 正在写入数据
|
|
BUFFER_READY_TO_FLUSH, // 准备刷新到文件
|
|
BUFFER_FLUSHING // 正在刷新到文件
|
|
} BufferState_t;
|
|
|
|
// 数据存储状态
|
|
typedef enum {
|
|
DATA_STORAGE_IDLE = 0,
|
|
DATA_STORAGE_RECORDING,
|
|
DATA_STORAGE_ERROR,
|
|
DATA_STORAGE_FULL
|
|
} DataStorageState_t;
|
|
|
|
// 数据存储统计信息
|
|
typedef struct {
|
|
uint32_t total_samples;
|
|
uint32_t current_file_size;
|
|
uint32_t file_count;
|
|
uint32_t error_count;
|
|
DataStorageState_t state;
|
|
char current_filename[256];
|
|
} DataStorageStats_t;
|
|
|
|
// 双缓冲区结构
|
|
typedef struct {
|
|
uint8_t data[DATA_STORAGE_BUFFER_SIZE];
|
|
uint16_t index;
|
|
BufferState_t state;
|
|
} DataBuffer_t;
|
|
|
|
// 数据存储句柄
|
|
typedef struct {
|
|
FIL file;
|
|
DataBuffer_t buffers[2]; // 双缓冲区
|
|
uint8_t active_buffer; // 当前活动缓冲区索引 (0 或 1)
|
|
uint8_t flush_buffer; // 待刷新缓冲区索引
|
|
DataStorageStats_t stats;
|
|
uint8_t initialized;
|
|
uint8_t flush_in_progress; // 刷新进行中标志
|
|
char current_session_path[DATA_STORAGE_MAX_PATH_LEN]; // 当前会话文件夹路径
|
|
} DataStorageHandle_t;
|
|
|
|
// 函数声明
|
|
HAL_StatusTypeDef DataStorage_Init(DataStorageHandle_t *handle);
|
|
HAL_StatusTypeDef DataStorage_StartRecording(DataStorageHandle_t *handle);
|
|
HAL_StatusTypeDef DataStorage_StopRecording(DataStorageHandle_t *handle);
|
|
HAL_StatusTypeDef DataStorage_WriteData(DataStorageHandle_t *handle, const DataPacket_t *packet);
|
|
HAL_StatusTypeDef DataStorage_WriteCorrectedData(DataStorageHandle_t *handle, const CorrectedDataPacket_t *result);
|
|
HAL_StatusTypeDef DataStorage_Flush(DataStorageHandle_t *handle);
|
|
void DataStorage_GetStats(DataStorageHandle_t *handle, DataStorageStats_t *stats);
|
|
HAL_StatusTypeDef DataStorage_CreateNewFile(DataStorageHandle_t *handle);
|
|
|
|
// 文件夹管理函数
|
|
HAL_StatusTypeDef DataStorage_CreateSessionFolder(DataStorageHandle_t *handle);
|
|
|
|
// 序号管理函数
|
|
HAL_StatusTypeDef DataStorage_LoadSessionNumber(uint32_t *session_number);
|
|
HAL_StatusTypeDef DataStorage_SaveSessionNumber(uint32_t session_number);
|
|
|
|
// 双缓冲区管理函数
|
|
HAL_StatusTypeDef DataStorage_SwitchBuffer(DataStorageHandle_t *handle);
|
|
HAL_StatusTypeDef DataStorage_FlushBuffer(DataStorageHandle_t *handle, uint8_t buffer_index);
|
|
void DataStorage_ProcessBackgroundTasks(DataStorageHandle_t *handle);
|
|
|
|
// 缓冲区可用性检查函数
|
|
uint8_t DataStorage_IsBufferAvailable(DataStorageHandle_t *handle, uint32_t required_size);
|
|
|
|
#endif // DATA_STORAGE_H
|