# RTT 日志输出问题排查

## 问题：RTT Viewer 中日志格式混乱、重复或截断

## 可能的原因和解决方案

### 1. RTT 缓冲区太小

**问题**：`CONFIG_LOG_BACKEND_RTT_OUTPUT_BUFFER_SIZE=16` 太小，导致日志被截断。

**解决方案**：增加缓冲区大小：
```kconfig
CONFIG_LOG_BACKEND_RTT_OUTPUT_BUFFER_SIZE=1024
```

### 2. 多个日志后端同时启用

**问题**：同时启用 UART 和 RTT 可能导致日志格式混乱。

**解决方案**：
- 如果只使用 RTT，可以禁用 UART：
  ```kconfig
  CONFIG_LOG_BACKEND_UART=n
  CONFIG_LOG_BACKEND_RTT=y
  ```
- 或者只使用 UART，禁用 RTT：
  ```kconfig
  CONFIG_LOG_BACKEND_UART=y
  CONFIG_LOG_BACKEND_RTT=n
  ```

### 3. RTT 配置优化

**推荐配置**：
```kconfig
CONFIG_LOG_BACKEND_RTT=y
CONFIG_LOG_BACKEND_RTT_OUTPUT_BUFFER_SIZE=1024
CONFIG_LOG_BACKEND_RTT_OUTPUT_DEFAULT=y
CONFIG_LOG_BACKEND_RTT_FORMAT_TIMESTAMP=y
```

### 4. 检查 RTT Viewer 设置

在 J-Link RTT Viewer 中：
1. 确保选择了正确的 RTT 通道（通常是通道 0）
2. 检查缓冲区大小设置
3. 尝试清除缓冲区并重新连接

### 5. 日志格式问题

如果看到类似 `===Bootloader===` 的消息，这可能是：
- Bootloader 的输出（MCUboot 或其他）
- 系统启动时的消息

### 6. 使用 printk 进行测试

如果日志系统有问题，可以暂时使用 `printk()` 直接输出：
```c
printk("Test message\n");
```

### 7. 检查日志级别

确保日志级别设置正确：
```c
LOG_MODULE_REGISTER(main, LOG_LEVEL_DBG);
```

## 推荐的日志配置

### 只使用 RTT（推荐用于调试）
```kconfig
CONFIG_LOG=y
CONFIG_LOG_MODE_IMMEDIATE=y
CONFIG_LOG_DEFAULT_LEVEL=4
CONFIG_LOG_MAX_LEVEL=4

# 只使用 RTT
CONFIG_LOG_BACKEND_RTT=y
CONFIG_LOG_BACKEND_RTT_OUTPUT_BUFFER_SIZE=1024
CONFIG_LOG_BACKEND_RTT_OUTPUT_DEFAULT=y
CONFIG_LOG_BACKEND_RTT_FORMAT_TIMESTAMP=y
CONFIG_LOG_BACKEND_UART=n
```

### 只使用 UART（推荐用于生产）
```kconfig
CONFIG_LOG=y
CONFIG_LOG_MODE_IMMEDIATE=y
CONFIG_LOG_DEFAULT_LEVEL=4
CONFIG_LOG_MAX_LEVEL=4

# 只使用 UART
CONFIG_LOG_BACKEND_UART=y
CONFIG_LOG_BACKEND_UART_OUTPUT_TEXT=y
CONFIG_UART_CONSOLE=y
CONFIG_LOG_BACKEND_RTT=n
```

## 常见问题

### Q: 为什么日志被截断？
A: RTT 缓冲区太小，增加 `CONFIG_LOG_BACKEND_RTT_OUTPUT_BUFFER_SIZE`。

### Q: 为什么看到重复的日志？
A: 可能是多个日志后端同时输出，或者 RTT Viewer 缓冲区问题。

### Q: 为什么只看到 "===Bootloader==="？
A: 这可能是 bootloader 的输出，不是应用程序的日志。检查应用程序是否正常启动。

### Q: 如何清除 RTT 缓冲区？
A: 在 RTT Viewer 中点击 "Clear" 按钮，或重新连接设备。

