数据存储模块详细分析
2025-07-07
模块概述
数据存储模块负责OpenEarable 2.0的本地数据存储功能,主要通过SD卡实现传感器数据和音频数据的本地记录。该模块提供高效的数据缓冲、文件管理和存储优化功能。
文件结构
src/SD_Card/
├── SDLogger/ # SD卡数据记录器
│ ├── SDLogger.h/.cpp # 主要日志记录类
│ └── CMakeLists.txt # 构建配置
├── SD_Card_Manager/ # SD卡管理器
│ ├── SD_Card_Manager.h/.cpp # SD卡管理接口
│ └── CMakeLists.txt # 构建配置
├── Benchmark/ # 性能测试
│ ├── Benchmark.h/.cpp # 存储性能测试
│ └── CMakeLists.txt # 构建配置
└── CMakeLists.txt # 模块构建配置
核心组件
1. SDLogger - SD卡日志记录器
SDLogger是数据存储的核心组件,提供高效的传感器数据记录功能。
主要特性
- 缓冲写入: 使用环形缓冲区优化写入性能
- 块对齐: 4KB块对齐确保最佳存储性能
- 文件格式: 自定义二进制格式(.oe)优化存储效率
- 版本管理: 文件头包含版本和时间戳信息
缓冲架构
class SDLogger {
private:
static constexpr size_t SD_BLOCK_SIZE = 4096; // SD卡块大小
static constexpr size_t BUFFER_BLOCK_COUNT = 8; // 缓冲区块数
static constexpr size_t BUFFER_SIZE = SD_BLOCK_SIZE * BUFFER_BLOCK_COUNT; // 32KB缓冲区
// 文件头结构
struct __attribute__((packed)) FileHeader {
uint16_t version; // 文件格式版本
uint64_t timestamp; // 创建时间戳
};
};
2. SD_Card_Manager - SD卡管理器
SD卡管理器提供SD卡的底层操作接口,包括挂载、卸载、文件系统管理等。
主要功能
- SD卡检测: 自动检测SD卡插入和移除
- 文件系统管理: FAT32文件系统支持
- 错误处理: SD卡错误检测和恢复
- 性能监控: 读写性能统计
3. 数据格式
传感器数据格式
// 传感器数据记录格式
struct sensor_log_entry {
uint64_t timestamp; // 时间戳 (微秒)
uint8_t sensor_id; // 传感器ID
uint8_t data_size; // 数据大小
uint8_t data[]; // 传感器数据
} __attribute__((packed));
文件格式结构
.oe文件格式:
+------------------+
| 文件头 (10字节) |
| - 版本 (2字节) |
| - 时间戳 (8字节) |
+------------------+
| 传感器数据记录1 |
+------------------+
| 传感器数据记录2 |
+------------------+
| ... |
+------------------+
性能优化
缓冲写入策略
void SDLogger::write_sensor_data(const sensor_data* data) {
// 1. 数据写入环形缓冲区
ring_buffer_put(&sd_buffer, (uint8_t*)data, sizeof(sensor_data));
// 2. 检查是否达到写入阈值
if (ring_buffer_size_get(&sd_buffer) >= WRITE_THRESHOLD) {
// 触发批量写入
schedule_bulk_write();
}
}
块对齐优化
// 确保写入数据块对齐
static_assert(BUFFER_SIZE % SD_BLOCK_SIZE == 0,
"BUFFER_SIZE must be a multiple of SD_BLOCK_SIZE");
总结
数据存储模块为OpenEarable 2.0提供了高效可靠的本地数据存储功能,支持:
- 高性能写入: 缓冲和块对齐优化
- 可靠存储: 错误检测和恢复机制
- 标准格式: 自定义二进制格式优化存储效率
- 易于解析: Python工具支持数据解析和分析
该模块确保了传感器数据的可靠本地存储,为离线数据分析和研究提供了重要支持。