# SD卡存储监控功能说明

## 概述

本文档说明系统监控模块中新增的SD卡存储监控功能。该功能用于实时跟踪SD卡的写入操作、错误情况和性能指标。

## 监控指标

### 1. SD卡写入次数 (`sd_write_count`)
- **描述**: 记录成功写入SD卡的次数
- **用途**: 评估SD卡使用频率和系统活跃度
- **更新时机**: 每次成功刷新缓冲区到SD卡后

### 2. SD卡写入错误次数 (`sd_write_error_count`)
- **描述**: 记录SD卡写入失败的次数
- **用途**: 监控SD卡健康状态和可靠性
- **更新时机**: 
  - 缓冲区刷新失败时
  - 文件创建失败时
- **注意**: 该值持续增加可能表示SD卡故障或文件系统问题

### 3. 缓冲区满次数 (`sd_buffer_full_count`)
- **描述**: 记录双缓冲区都处于忙碌状态的次数
- **用途**: 评估数据写入速度是否跟得上数据产生速度
- **更新时机**: 切换缓冲区时发现目标缓冲区仍在刷新中
- **注意**: 该值频繁增加表示需要优化写入性能或增大缓冲区

### 4. SD卡总写入字节数 (`sd_total_bytes_written`)
- **描述**: 累计写入SD卡的总字节数
- **用途**: 
  - 评估SD卡使用量
  - 计算平均写入速度
  - 预估SD卡寿命
- **更新时机**: 每次成功写入后累加

### 5. 创建的文件数量 (`sd_file_count`)
- **描述**: 记录创建的数据文件总数
- **用途**: 跟踪数据分段情况
- **更新时机**: 每次成功创建新文件后

## API函数

### 初始化
```c
void SystemMonitor_Init(void);
```
初始化系统监控模块，清零所有统计信息。

### SD卡监控函数

#### 报告SD卡写入
```c
void SystemMonitor_ReportSDWrite(uint32_t bytes_written);
```
- **参数**: `bytes_written` - 本次写入的字节数
- **功能**: 增加写入次数计数，累加总写入字节数

#### 报告SD卡写入错误
```c
void SystemMonitor_ReportSDWriteError(void);
```
- **功能**: 增加写入错误计数

#### 报告缓冲区满
```c
void SystemMonitor_ReportSDBufferFull(void);
```
- **功能**: 增加缓冲区满计数

#### 报告文件创建
```c
void SystemMonitor_ReportSDFileCreated(void);
```
- **功能**: 增加文件创建计数

### 获取统计信息
```c
void SystemMonitor_GetStats(SystemMonitorStats_t *stats);
```
- **参数**: `stats` - 指向统计信息结构体的指针
- **功能**: 获取当前所有监控统计信息

## 集成说明

### 在data_storage.c中的集成点

1. **文件头部**: 添加 `#include "system_monitor.h"`

2. **DataStorage_FlushBuffer()函数**:
   - 写入成功时调用 `SystemMonitor_ReportSDWrite(bytes_written)`
   - 写入失败时调用 `SystemMonitor_ReportSDWriteError()`

3. **DataStorage_CreateNewFile()函数**:
   - 文件创建成功时调用 `SystemMonitor_ReportSDFileCreated()`
   - 文件创建失败时调用 `SystemMonitor_ReportSDWriteError()`

4. **DataStorage_SwitchBuffer()函数**:
   - 目标缓冲区忙碌时调用 `SystemMonitor_ReportSDBufferFull()`

## 使用示例

```c
// 初始化系统监控
SystemMonitor_Init();

// ... 系统运行 ...

// 获取统计信息
SystemMonitorStats_t stats;
SystemMonitor_GetStats(&stats);

// 打印SD卡监控信息
printf("SD卡写入次数: %lu\n", stats.sd_write_count);
printf("SD卡写入错误: %lu\n", stats.sd_write_error_count);
printf("缓冲区满次数: %lu\n", stats.sd_buffer_full_count);
printf("总写入字节数: %lu\n", stats.sd_total_bytes_written);
printf("创建文件数量: %lu\n", stats.sd_file_count);

// 计算平均写入大小
if (stats.sd_write_count > 0) {
    uint32_t avg_write_size = stats.sd_total_bytes_written / stats.sd_write_count;
    printf("平均写入大小: %lu 字节\n", avg_write_size);
}

// 计算错误率
if (stats.sd_write_count > 0) {
    float error_rate = (float)stats.sd_write_error_count / 
                       (stats.sd_write_count + stats.sd_write_error_count) * 100.0f;
    printf("写入错误率: %.2f%%\n", error_rate);
}
```

## 性能考虑

1. **低开销**: 所有监控函数都是简单的计数器操作，对系统性能影响极小
2. **线程安全**: 当前实现未考虑多线程，如需在中断中使用需添加保护机制
3. **溢出处理**: 使用32位计数器，在高频写入场景下可能溢出，需定期重置或使用64位计数器

## 故障诊断

### 高错误率
- **现象**: `sd_write_error_count` 持续增加
- **可能原因**: 
  - SD卡故障或接触不良
  - 文件系统损坏
  - SD卡写保护
- **建议**: 检查SD卡硬件连接，尝试格式化SD卡

### 频繁缓冲区满
- **现象**: `sd_buffer_full_count` 快速增加
- **可能原因**:
  - 数据产生速度超过SD卡写入速度
  - SD卡性能不足（低速卡）
  - 缓冲区大小不足
- **建议**: 
  - 使用更高速的SD卡（Class 10或UHS-I）
  - 增大缓冲区大小
  - 优化数据采集频率

### 写入速度异常
- **现象**: 平均写入大小异常小或写入频率异常高
- **可能原因**: 缓冲区切换策略不当
- **建议**: 调整缓冲区大小或刷新策略

## 版本历史

- **v1.0** (2026-02-06): 初始版本，添加SD卡存储监控功能
