先说静态编译,因为TFLM每次编译都非常消耗时间,在单片机开发中全量编译也是常见的事情,不如把库先编译成静态,然后放到代码结构里,以后每次都简单一些.
比如为Cortex-M4硬件浮点支持制作静态库的命令.
make -f tensorflow/lite/micro/tools/make/Makefile OPTIMIZED_KERNEL_DIR=cmsis_nn TARGET=cortex_m_generic TARGET_ARCH=cortex-m4+fp microlite
具体参考文档
https://github.com/tensorflow/tflite-micro/tree/main/tensorflow/lite/micro/cortex_m_generic
创建.a文件之后,可以通过链接到工程里用,但是源码还是可以放进去调试的,至于如果不需要源码,也可以只保留头文件.
除了microlite这个目标,还有list_library_sources这个目标也很实用,因为TFLM源码很多,根本不知道那些需要编译哪些不需要,如果不做静态链接,那么就很有必要控制哪些文件加入到项目了.
现在开始说直接拿源码加到工程,先通过list_library_sources找到需要哪些文件编译进去.
右边添加需要编译的文件,左边把依赖库也要放进去,依赖库版本可以看官方的Makefile调用就知道(有强制特定版本)
添加设备宏定义以及CMSIS-NN库.
需要C调用的部分修饰一下.
extern "C" int tflm_main(void) {
tflite::InitializeTarget();
TF_LITE_ENSURE_STATUS(ProfileMemoryAndLatency());
TF_LITE_ENSURE_STATUS(LoadFloatModelAndPerformInference());
TF_LITE_ENSURE_STATUS(LoadQuantModelAndPerformInference());
MicroPrintf("~~~ALL TESTS PASSED~~~\n");
return kTfLiteOk;
}
然后就可以在C语言文件上进行调用了.