feat: 添加编译时模块开关配置
通过 sdkconfig.defaults 选择性启用/禁用模块,减少固件体积: 新增模块开关: - CONFIG_MIMI_CHAN_TELEGRAM (默认 n) - CONFIG_MIMI_CHAN_FEISHU (默认 y) - CONFIG_MIMI_TOOL_WEB_SEARCH (默认 y) - CONFIG_MIMI_TOOL_GPIO (默认 n) - CONFIG_MIMI_WS_SERVER (默认 y) - CONFIG_MIMI_WIFI_ONBOARD (默认 y) - CONFIG_MIMI_OTA (默认 n) 技术实现: - CMakeLists.txt 条件编译源文件 - 头文件使用 static inline stub - CLI 命令和工具注册也支持条件编译 消除 Telegram 未配置时的 5 秒轮询警告日志
This commit is contained in:
122
taolun.md
122
taolun.md
@@ -124,3 +124,125 @@ timezone_show # 显示当前时区配置和本地时间
|
||||
### 支持的时区格式
|
||||
- POSIX: `CST-8`, `JST-9`, `EST5EDT,M3.2.0,M11.1.0`, `UTC0`
|
||||
- 城市名: Asia/Shanghai, Asia/Tokyo, America/New_York 等 18 个预设
|
||||
|
||||
---
|
||||
|
||||
## 讨论:编译时模块开关(模块化配置)
|
||||
|
||||
**日期**:2026-04-03
|
||||
**分支**:`feature/module-config`
|
||||
**目标**:通过编译时配置选择性禁用不需要的模块,减少固件体积,消除未配置模块的警告日志
|
||||
|
||||
### 问题背景
|
||||
|
||||
1. **Task Watchdog 超时**:ESP32-S3 运行一天后触发看门狗超时,怀疑是设计问题
|
||||
2. **Telegram 警告日志**:用户使用飞书但未配置 Telegram,控制台每 5 秒打印 "No bot token configured"
|
||||
3. **代码冗余**:Telegram、OpenAI 接口等未使用的模块仍然编译进固件
|
||||
|
||||
### 用户需求
|
||||
|
||||
用户希望:
|
||||
1. 通过编译选项禁用不需要的模块(如 Telegram)
|
||||
2. 从源码层面直接过滤不用的组件,减少代码体积
|
||||
3. 禁用模块后不触发警告日志
|
||||
|
||||
### 实现方案
|
||||
|
||||
#### 方案选择:编译时条件编译(方案 02)
|
||||
|
||||
**优点**:
|
||||
- 直接减少 Flash 占用
|
||||
- 零 RAM 占用,不创建任务
|
||||
- 从源头消除警告日志
|
||||
- 实现简单
|
||||
|
||||
**缺点**:
|
||||
- 切换模块需要重新编译
|
||||
|
||||
#### 技术实现
|
||||
|
||||
##### 1. 配置文件:`sdkconfig.defaults`
|
||||
|
||||
```c
|
||||
// Channel Modules
|
||||
CONFIG_MIMI_CHAN_TELEGRAM=n // 默认禁用
|
||||
CONFIG_MIMI_CHAN_FEISHU=y // 默认启用
|
||||
|
||||
// Tool Modules
|
||||
CONFIG_MIMI_TOOL_WEB_SEARCH=y
|
||||
CONFIG_MIMI_TOOL_GPIO=n
|
||||
|
||||
// Optional Modules
|
||||
CONFIG_MIMI_WS_SERVER=y
|
||||
CONFIG_MIMI_WIFI_ONBOARD=y
|
||||
CONFIG_MIMI_OTA=n
|
||||
```
|
||||
|
||||
##### 2. CMakeLists.txt:条件编译源文件
|
||||
|
||||
```cmake
|
||||
if(CONFIG_MIMI_CHAN_TELEGRAM)
|
||||
list(APPEND srcs "channels/telegram/telegram_bot.c")
|
||||
endif()
|
||||
```
|
||||
|
||||
##### 3. 头文件 stub:调用方无感知
|
||||
|
||||
```c
|
||||
// telegram_bot.h
|
||||
#ifdef CONFIG_MIMI_CHAN_TELEGRAM
|
||||
esp_err_t telegram_bot_init(void);
|
||||
esp_err_t telegram_bot_start(void);
|
||||
#else
|
||||
static inline esp_err_t telegram_bot_init(void) { return ESP_OK; }
|
||||
static inline esp_err_t telegram_bot_start(void) { return ESP_OK; }
|
||||
#endif
|
||||
```
|
||||
|
||||
### 修改文件清单
|
||||
|
||||
| 文件 | 修改内容 |
|
||||
|------|----------|
|
||||
| `sdkconfig.defaults` | 添加模块开关配置 |
|
||||
| `main/CMakeLists.txt` | 条件编译源文件 |
|
||||
| `main/channels/telegram/telegram_bot.h` | 添加 stub |
|
||||
| `main/channels/feishu/feishu_bot.h` | 添加 stub |
|
||||
| `main/gateway/ws_server.h` | 添加 stub |
|
||||
| `main/onboard/wifi_onboard.h` | 添加 stub |
|
||||
| `main/ota/ota_manager.h` | 添加 stub |
|
||||
| `main/tools/tool_web_search.h` | 添加 stub |
|
||||
| `main/tools/tool_gpio.h` | 添加 stub |
|
||||
| `main/tools/tool_registry.c` | 条件注册工具 |
|
||||
| `main/cli/serial_cli.c` | 条件注册 CLI 命令 |
|
||||
| `main/mimi.c` | 条件调用模块 |
|
||||
| `AGENTS.md` | 更新文档 |
|
||||
|
||||
### 模块依赖关系
|
||||
|
||||
- **Channel 模块**(telegram、feishu):
|
||||
- 被 `mimi.c` 调用(init/start)
|
||||
- 被 `outbound_dispatch_task` 调用(send)
|
||||
- CLI 命令也需要条件编译
|
||||
|
||||
- **Tool 模块**(web_search、gpio):
|
||||
- 被 `tool_registry.c` 调用(注册 + 执行)
|
||||
- CLI 命令也需要条件编译
|
||||
|
||||
- **可选模块**(ws_server、wifi_onboard、ota):
|
||||
- 被 `mimi.c` 调用
|
||||
- `wifi_onboard` 禁用时需特殊处理(不能进入 captive portal)
|
||||
|
||||
### 注意事项
|
||||
|
||||
1. **OTA 模块**:目前未初始化,但已编译
|
||||
2. **工具描述中的渠道提示**:cron_add 工具描述中提到 telegram,可保留(只是描述,不影响功能)
|
||||
3. **get_time 工具**:使用 telegram.org 代理获取时间(技术原因,不属于 telegram_bot 模块)
|
||||
|
||||
### 预期效果
|
||||
|
||||
| 禁用项 | 效果 |
|
||||
|--------|------|
|
||||
| Telegram | 不编译 telegram_bot.c,无 5 秒警告,节省约 15KB+ Flash |
|
||||
| GPIO | 不编译 tool_gpio.c,无 gpio_* 工具,节省约 5KB Flash |
|
||||
| WebSocket | 不编译 ws_server.c,节省约 10KB Flash |
|
||||
| WiFi Onboard | 不能进入 captive portal 模式,需其他方式配置 WiFi |
|
||||
|
||||
Reference in New Issue
Block a user