|
CH585M TFLite Micro sin Demo TensorFlow Lite Micro 移植到 WCH CH585M 跑 sin 函数拟合 demo。
想象一下:一个几块钱的 MCU,不需要网络、不需要 Linux、不需要 MPU,就能本地运行神经网络——关键词唤醒、手势识别、振动异常检测、传感器数据拟合。设备端推理意味着零延迟、离线可用、数据不出设备、功耗低到可以用电池跑几年。
这就是 TensorFlow Lite Micro(TFLM)要做的事。它是 TensorFlow Lite 的微控制器分支,目标是在只有几十 KB RAM、几百 KB Flash 的芯片上跑 AI 推理。它把底层依赖压缩到了极致:无操作系统、无动态内存、无文件系统,纯静态 arena 分配。
WCH CH585M 是一颗只要几块钱的 RISC-V 芯片——448KB Flash、128KB RAM,带 BLE。如果能在它上面跑 TFLM,就意味着一大批低成本 RISC-V 设备都有了边缘 AI 的可能性。
硬件| 项目 | 说明 | | MCU | WCH CH585M(RISC-V RV32IMC,448KB Flash,128KB RAM) | | 串口 | UART0 — PA14 (TX) / PA15 (RX) @ 115200 | | 工具链 | MRS2 IDE + RISC-V GCC 12.2.0 |
串口接线- USB-TTL CH585M
- ------- ------
- RX ← PA14 (TX)
- TX → PA15 (RX)
- GND — GND
复制代码
工程结构- CH585M_TFLite_sin/
- ├── src/main.cc # demo 主程序
- ├── model_data.h # sin 模型 (2.3KB, 嵌入为 C 数组)
- ├── tflite_port/ # 平台抽象层(3 个文件)
- │ ├── debug_log.cc # DebugLog 输出
- │ ├── system_setup.cc # 初始化(空,在 main 完成)
- │ └── micro_time.cc # 计时器
- ├── tensorflow/ # TFLite Micro 核心(create_tflm_tree.py 生成)
- ├── third_party/ # 第三方头文件(create_tflm_tree.py 生成)
- ├── Startup/ # 启动代码
- ├── StdPeriphDriver/ # CH58x HAL 驱动
- ├── RVMSIS/ # RISC-V CMSIS 头文件
- ├── Ld/Link.ld # 链接脚本
- └── Makefile # 命令行构建(可选)
复制代码tensorflow/ 和 third_party/ 由 TFLite Micro 官方脚本 create_tflm_tree.py 在 Linux/Codespace 上生成,无需手动复制文件。
模型信息| 属性 | 值 | | 输入 | 1× float32 (x) | | 输出 | 1× float32 (sin(x)) | | 算子 | FullyConnected → Tanh → Reshape | | 大小 | 2,380 bytes |
内存占用- text data bss dec hex
- 71916 844 8240 81000 13c68
复制代码| 区域 | 大小 | 使用率 | | Flash (448KB) | ~72KB | 16% | | RAM (128KB) | ~9KB | 7% |
8KB bss 中主要包含 tensor_arena 静态内存池。--gc-sections 自动丢弃了 120+ 个未用算子的代码。
构建
MRS IDE(推荐)- 打开 MRS2 → 刷新工程
- 点击 Build
- 烧录到 CH585M
命令行- $env:Path='C:\MounRiver\MounRiver_Studio2\resources\app\resources\win32\components\WCH\Toolchain\RISC-V Embedded GCC12\bin;C:\mingw64\bin;' + $env:Path
- mingw32-make -j8 all
复制代码
移植要点TFLite Micro 移植只需实现 3 个平台抽象函数 + 配置编译选项:
| 函数 | 文件 | 说明 | | DebugLog() | tflite_port/debug_log.cc | printf 已重定向到 UART | | InitializeTarget() | tflite_port/system_setup.cc | 空实现,时钟在 main 初始化 | | GetCurrentTimeTicks() | tflite_port/micro_time.cc | profiling 使用 |
编译选项要点: - -std=gnu++17
- -fno-exceptions -fno-rtti -fno-threadsafe-statics
- -DTF_LITE_STATIC_MEMORY # 禁用动态内存
- -DTF_LITE_USE_GLOBAL_CMATH_FUNCTIONS # 嵌入式 C++ math
- -DDEBUG=0 # printf → UART0
复制代码
输出
项目下载
CH585M_TFLite_sin-master.zip
(1.15 MB, 下载次数: 0)
github.com/createskyblue/CH585M_TFLite_sin |