本章用于选板、分配资源和移植 BSP。先确认 CPU、编译器 ABI、FreeRTOS 版本、可用内部 RAM/外部 RAM 与 Flash;按这些条件取得匹配的二进制包。
参考工程的链接期占用
2026-10-11,以公开 ESP32-P4 工程、ESP-IDF 5.5.4、SDK 1.0.0 / ABI 8 / package revision 14 的现有构建产物核对:
这是 revision 14 的历史构建样本,当前 r27 的资源须另行测量。道路矢量窗口、异步校验、音频 sink、播放队列、TLS 5006 和独立镜像都会影响占用,启用后须在自己的目标构建重新测量。
表中按 1 KB = 1024 字节换算,保留两位小数。
| 项目 | 完整 P4 工程 | managed-terminal 模板 |
|---|---|---|
应用 .bin |
2,497.47 KB | 589.25 KB |
.dram0.data + .dram0.bss |
69.45 KB | 21.50 KB |
.iram0.text |
95.09 KB | 74.31 KB |
.tcm.text + .tcm.data |
0.10 KB | 0.38 KB |
完整工程包含 1024×600 显示、无线、视频、HUD 等板级实现;模板的 BSP 驱动尚待实现。表中是整个应用的链接期数据,不是 SDK 单独开销或两种等价功能的性能对比。.bin 不含 bootloader、分区表与持久化数据;RAM 项不含运行时堆、任务栈和 PSRAM 峰值。不能据此认定“有 72 KB RAM 就能运行”。
在自己的工程运行 idf.py size 与 idf.py size-components;同时记录实际应用 .bin 的字节数、SDK 包信息、sdkconfig 和启用功能。其他工具链使用对应 map/section 报告;静态库文件大小不能当作固件 Flash 占用。
托管入口的默认资源
| 配置 | 默认值 | 分配与调整 |
|---|---|---|
task_stack |
ESP-IDF:12,288 字节;其他 FreeRTOS:3,072 个 StackType_t |
启动 SDK 任务时分配;先确认端口单位 |
rx_slots |
16;每项最多 512 字节输入 | 创建时分配,范围 1–128,另有队列和对齐开销 |
command_slots |
16 | 创建时分配,范围 1–64 |
event_slots |
8 | 创建时按 sizeof(moto_terminal_event) 分配,范围 2–64 |
bulk_rx_slots |
8 | 开启 bulk 时额外分配,范围 1–128 |
task_priority |
5 | 必须小于目标 configMAX_PRIORITIES |
先用 moto_terminal_config_init,不要把另一平台的栈单位直接搬过来。降低队列会增加背压或关闭会话的概率;降低栈需要通过最忙场景的栈水位验证。生命周期、SDK 回调和应用任务的关系见 线程与数据所有权。
视频需要另算缓冲
视频重组、解码、显示和 UI 不包含在上述托管队列中。以 1024×600 RGB565 为例,单个可见画面为 1024 × 600 × 2 = 1,228,800 字节;双缓冲再乘以 2。解码器对齐、DMA、旋转和 UI 可能需要额外空间。
P4 MJPEG 参考重组参数为每帧上限 512 KiB、4 个槽,仅压缩帧数据容量就是 2 MiB,还需 FEC、索引和实例开销。分辨率、帧率、codec、帧上限与解码驱动共同决定预算;不要把 PSRAM 总量当作可用内部 DMA 内存。
测量运行时峰值
目前没有可用于所有板型的最低 RAM/Flash 或 CPU 占用百分比。量产前在目标板分别记录:启动后、TLS 握手、首次配对、导航投屏稳定运行、通知与视频并发、断连重连时的最小空闲堆、最大连续空闲块、各任务最小剩余栈及 CPU 负载。
ESP-IDF 可使用 heap_caps_get_free_size、heap_caps_get_minimum_free_size、heap_caps_get_largest_free_block,分别观察内部 RAM 与 PSRAM;栈水位和运行时间统计按目标 FreeRTOS 端口单位及配置读取。记录测试时长、屏幕参数与功能组合,再为峰值、碎片和升级增长留出产品预算。尚未测量的 CPU/堆峰值应标记为未测,不能以链接结果代替。
非 ESP32 的移植顺序
- 提供目标 CPU/指令集、编译器及 ABI、FreeRTOS 版本与配置、密码库配置,取得匹配头文件和静态库。
- 实现授权读取、绑定持久化、安全随机数和线程安全的单调毫秒时钟。
- 实现无线 AP、IP/DHCP 和
moto_network_port非阻塞原语。使用 SDK 网络入口时,由 SDK 管理监听、连接和背压;网络状态变化更新 generation。 - 提供本地 PIN 显示,运行单个托管实例和事件消费者,先验证配对、主题、重启重连。
- 按功能分别接车辆、视频、通知等驱动。独立镜像和 Wi-Fi 音频可用 Managed 的启动前配置接口;BLE 辅助、底图及同 owner 的连接接管按 Core 参考工程 接线。
通用 API 与回调契约适用于匹配平台;ESP 的 NVS、NimBLE、LCD 和硬件解码驱动不能直接用于其他芯片。完成基础连接和资源测量后,再扩展功能。
