# RAM 使用情况分析

## 当前 RAM 使用（最新状态）

```
Memory Usage (text + data + bss):
   text    data     bss     dec     hex filename
 175872    3632   31610  211114   338aa build\zephyr\zephyr.elf

RAM 使用: data + bss = 3632 + 31610 = 35242 字节
RAM 剩余: 65536 - 35242 = 30294 字节 (约 29.5 KB)
RAM 使用率: 35242 / 65536 = 53.8%
```

### 优化成果

**优化前**：
- RAM: 64718 字节 (98.75%)
- 剩余: 818 字节

**优化后**：
- RAM: 32932 字节 (50.25%)
- 剩余: 32604 字节 (约 32 KB)
- **节省**: 31786 字节 (约 31 KB) ✅

**主要优化措施**：
1. ✅ 移除日志缓冲区（约 25 KB）
2. ✅ 减少线程栈大小
3. ✅ 优化 BLE 缓冲区配置
4. ✅ 移除不必要的静态缓冲区

## 还需要实现的功能及 RAM 需求估算

### 1. 数据采集模块 (Acquisition) - 约 2-3 KB

**Sink 结构体**：
- `Timestamped<ImuSample>`: ~100 字节
- `Timestamped<AdcVddSample>`: ~20 字节
- `Timestamped<AdcStrainSample>`: ~10 字节
- `PackedStrainCalibrationSet`: ~50 字节
- `PackedZeroCalibrationSet`: ~50 字节
- 其他字段: ~20 字节
- **小计**: ~250 字节

**SMA 缓冲区** (4 个)：
- `degreeC`: SMA_WINDOW * sizeof(float)
- `rpm`: SMA_WINDOW * sizeof(float)
- `torqueNmLeft`: SMA_WINDOW * sizeof(float)
- `torqueNmRight`: SMA_WINDOW * sizeof(float)
- 如果 SMA_WINDOW = 100: 4 * 100 * 4 = **1600 字节**

**其他**：
- `rpmScale` (WindowedScaleCalibration<10>): 10 * 4 = 40 字节
- IMU 对象: ~200 字节
- **小计**: ~240 字节

**总计**: ~2090 字节 ≈ **2.1 KB**

### 2. ESM 数据缓冲区 - 约 2-3 KB

- `esmPacketBuffer`: ESM_QUEUE_SIZE * sizeof(EsmTelemetryPacket)
- 如果 ESM_QUEUE_SIZE = 100，每个包约 25 字节
- **总计**: 100 * 25 = **2500 字节** ≈ **2.5 KB**

### 3. BLE 服务缓冲区 - 约 1-2 KB

每个 BLE 服务需要一些缓冲区：
- BAS (Battery Service): ~100 字节
- CPS (Cycling Power Service): ~200 字节
- FCS (Fitness Control Service): ~300 字节
- ESM (Extended Sensor Measurement): ~200 字节
- ESS (Environmental Sensor Service): ~200 字节
- **总计**: ~1000 字节 ≈ **1 KB**

### 4. ANT 协议缓冲区 - 约 1-2 KB

- ANT+ 数据缓冲区: ~1000-2000 字节
- **总计**: ~**1.5 KB**

### 5. FSM 状态机 - 约 0.5 KB

- 状态数据: ~500 字节
- **总计**: ~**0.5 KB**

### 6. 其他模块 - 约 1 KB

- 文件系统缓冲区: ~500 字节
- 错误处理: ~200 字节
- 其他临时缓冲区: ~300 字节
- **总计**: ~**1 KB**

## 总需求估算

| 模块 | 估算 RAM | 说明 |
|------|---------|------|
| Acquisition | 2.1 KB | SMA 缓冲区是主要占用 |
| ESM Buffer | 2.5 KB | 队列缓冲区 |
| BLE 服务 | 1.0 KB | 5 个服务 |
| ANT 协议 | 1.5 KB | ANT+ 缓冲区 |
| FSM | 0.5 KB | 状态机数据 |
| 其他 | 1.0 KB | 杂项 |
| **总计** | **8.6 KB** | |

## 结论

### ✅ **当前剩余 RAM 充足**

- **当前剩余**: 30294 字节 (约 29.5 KB)
- **需要**: 约 8.6 KB
- **余量**: 约 20.9 KB ✅

### 优化建议

#### 1. **减少 SMA 窗口大小** (节省最多)
- 当前假设: SMA_WINDOW = 100
- 优化: 减少到 50 或更小
- **节省**: 约 800 字节 (4 * 50 * 4)

#### 2. **减少 ESM 队列大小** (节省较多)
- 当前假设: ESM_QUEUE_SIZE = 100
- 优化: 减少到 50 或更小
- **节省**: 约 1.25 KB

#### 3. **优化 BLE 缓冲区** (已优化)
- 当前配置已经较优化
- 可进一步减少 `CONFIG_BT_BUF_*` 配置

#### 4. **减少线程栈大小** (已优化)
- 当前配置已经较优化
- 可进一步减少到 256-384 字节

#### 5. **使用动态分配** (不推荐)
- 在嵌入式系统中不推荐
- 可能导致碎片化

### 推荐方案

1. **立即优化**：
   - 减少 SMA_WINDOW 到 50: 节省 ~800 字节
   - 减少 ESM_QUEUE_SIZE 到 50: 节省 ~1.25 KB
   - **总计节省**: ~2 KB

2. **进一步优化**：
   - 减少线程栈: 节省 ~1-2 KB
   - 优化 BLE 缓冲区: 节省 ~0.5 KB
   - **总计节省**: ~1.5-2.5 KB

3. **最终状态**：
   - 剩余: 818 字节
   - 优化后节省: ~3.5-4.5 KB
   - **可用空间**: ~4.3-5.3 KB
   - **仍不足**: 还需要约 3-4 KB

### ✅ **建议**

**当前 RAM 空间充足，可以完整实现所有功能！**

### 当前状态（最新）

- **RAM 使用**: 35242 字节 (53.8%)
- **RAM 剩余**: 30294 字节 (约 29.5 KB)
- **Flash 使用**: 175872 字节 (34.2%)

### 功能实现计划

1. **可以完整实现所有功能**：
   - ✅ Acquisition 模块（约 2.1 KB）
   - ✅ ESM 缓冲区（约 2.5 KB）
   - ✅ 所有 BLE 服务（约 1.0 KB）
   - ✅ ANT 协议（约 1.5 KB）
   - ✅ FSM 状态机（约 0.5 KB）
   - ✅ 其他模块（约 1.0 KB）
   - **总计需求**: 约 8.6 KB
   - **可用空间**: 约 29.5 KB
   - **余量充足**: 约 20.9 KB ✅

2. **可以适当增加缓冲区大小**：
   - SMA_WINDOW: 可以使用 100 或更大（如果需要）
   - ESM_QUEUE_SIZE: 可以使用 100 或更大
   - 提高数据精度和稳定性

3. **实现建议**：
   - ✅ 可以按原计划完整实现所有功能
   - ✅ 不需要大幅减少缓冲区大小
   - ✅ 有足够的余量应对未来扩展
   - ⚠️ 建议在实现每个模块后检查 RAM 使用

4. **RAM 使用监控**：
   - 当前使用率: **53.8%** ✅
   - 目标使用率: **不超过 80-85%**（留出安全余量）
   - 预计最终使用率: 53.8% + 13.1% = **约 67%** ✅
   - **仍有约 13% 的安全余量**

### 结论

**✅ RAM 空间充足，可以完整实现所有功能！**

- 当前剩余 29.5 KB，足够实现所有计划的功能（约 8.6 KB）
- 还有约 20.9 KB 的余量，可以应对未来扩展
- 建议在实现每个模块后检查 RAM 使用情况

