这篇经验分享记录了我在把官方的人脸检测功能迁移并集成到官方屏幕显示项目中时遇到的问题、排查思路与最终解决方案。目标硬件是 CPKCOR-RA8D1B(RA8D1 MCU)核心板 + CPKEXP-EKRA8X1 扩展板(OV7725 摄像头、4.5" MIPI-DSI 屏)。
移植详情 【CPKCOR-RA8D1】AI人脸检测 - 瑞萨单片机论坛 - 电子技术论坛 - 广受欢迎的专业电子论坛!
主要遇到的问题与解决办法(按问题类别)
下面按问题分类列出我遇到的具体错误、定位思路和最终修复方案。
1) 缺少/未解析的宏与类型(编译时报 Symbol/unknown type)
常见错误:
定位与原因:
- 原项目把这些宏放在 common_util.h或 ra_gen 的common_data.h中。
- 新项目没有包含或复制这些头文件。
- 某些文件缺少 <stdint.h>。
修复:
- 创建 src/app_config.h,集中定义所有分辨率、模型尺寸、常量(示例:DET_MODEL_IMG_SIZE_X=192 等)。
- 在需要的源文件顶部 #include "app_config.h"。
- 在公用头(如 graphics.h)里 #include <stdint.h>和#include <stdbool.h>。
2) 第三方库头文件丢失(kissfft)
错误示例:
fatal error: 'third_party/kissfft/_kiss_fft_guts.h' file not found
定位与原因:
- kissfft 是 TFLite Micro 的依赖,face_detect 的 ai_apps/common/third_party/kissfft 目录必须完整复制。
- tools 目录下的 kiss_fftr.c 从相对路径../_kiss_fft_guts.h`读取,但有时源文件写法不对或 include 路径未添加。
修复:
- 在工程 include path 中加入 kissfft 根目录(和 tools 目录)以防仍有路径问题。
3) 重复符号(链接错误:duplicate symbol)
错误示例:
duplicate symbol: handle_error
defined at common_util.c
also defined at mipi_dsi_ep.c
定位与原因:
- 两个不同文件实现了同名全局函数 handle_error(但参数/签名可能不同)。链接器不能接受重复符号。
修复策略:
- 统一保留单一全局实现(放在 common_util.c),并在其他文件中引用它(包含 common_util.h)。
- 对于 mipi_dsi_ep.c 中本地使用的错误处理函数,选择:
- 改名(如 mipi_dsi_handle_error)并设置为 static,或
- 注释/删除 mipi_dsi_ep.c的实现并在调用处使用handle_error(配合适当的参数转换),或
- 将mipi_dsi_ep.c的函数改为static 并确保没有前向非-static 声明(否则会出现 “static follows non-static declaration”)。
4) FreeRTOS 事件组与多线程依赖(g_ai_app_event)
问题:
- 原 face_detect使用g_ai_app_event 事件组做线程同步(AI 与显示线程)。
- 在单线程集成中,这些调用导致找不到符号或不必要的阻塞(expecting event group)。
修复:
- 删除/替换所有 xEventGroupWaitBits/xEventGroupSetBits`调用。
- 用简单的全局 flag 或直接把流程串联在主循环。
- 示例:xEventGroupWaitBits(g_ai_app_event, CAM_DATA_READY, ...)→ 直接在 CEU 回调设置camera_frame_ready = true,主循环轮询或直接通过 ceu_operation()获取帧。
5) 未定义的 AI 符号(链接错误:undefined symbol ai_init / face_detection / image_rgb565_to_int8)
原因分析:
- AI 相关函数多数在 C++ 源文件(.cc、.cpp)中实现。常见原因:
- 源文件没有被加入构建(Eclipse 的 “Exclude from Build” 选项)。
- C++ 编译器或链接器未启用 / 未包含 C++ 文件。
- C/C++ 界面(extern "C") 未正确声明导致名称修饰不匹配。
修复步骤:
- 确认 src/ai_apps/face_detection/MainLoop_obj.cc、src/ai_apps/common/Main.cc 等文件已复制到项目并未被排除在构建之外。
- 确认工程配置包含 C++ 编译器 设置,并在 C++ 编译选项加入 -std=c++11(或更高)。
- 在 C++ 中对需要被 C 文件调用的函数添加 extern "C" 声明(或在 C 文件方声明)。
- 例如在 MainLoop_obj.cc`顶部:
extern "C" {
#include "common_util.h"
}
extern "C" face_det_err_t ai_init(void);
- 确保 ceu_ctl_and_data_processing.c中提供image_rgb565_to_int8(),并没有被意外排除。
6cfb4bf869d312683efbd5155d94b17e
|