【问题标题】:Building Tensorflow lite micro with C code使用 C 代码构建 Tensorflow lite micro
【发布时间】:2019-12-10 22:55:34
【问题描述】:

我想在我的 tensorflow lite 项目中使用一些 C 代码,但是 tensorflow lite 存储库中提供的所有示例项目都是 C++ 示例。

特别是,我正在使用 AmbiqSDK 存储库,它为 apollo3 平台提供示例,所有示例都用 C 语言编写,我现在想将其与 tensorflow lite 示例之一合并。

相关的makefile部分在这里:

MICRO_SPEECH_SRCS := \
tensorflow/lite/experimental/micro/examples/micro_speech/main.cc \
...
tensorflow/lite/experimental/micro/examples/micro_speech/command_responder.cc \
new_c_file_here.c \ ---->> HERE I LINK MY ADDITIONAL C CODE
$(MICRO_FEATURES_GENERATOR_SRCS)
...
# Builds a standalone speech command recognizer binary.
$(eval $(call microlite_test,micro_speech,\
$(MICRO_SPEECH_SRCS),$(MICRO_SPEECH_HDRS)))
...
# For normal manually-created TensorFlow C++ source files.
$(OBJDIR)%.o: %.cc third_party_downloads
    @mkdir -p $(dir $@)
    $(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@
...
# For normal manually-created TensorFlow C source files.
$(OBJDIR)%.o: %.c third_party_downloads
    @mkdir -p $(dir $@)
    $(CC) $(CCFLAGS) $(INCLUDES) -c $< -o $@

在我的 new_c_file_here.c 文件中,我将所有内容都包装在 extern "C"{} 中。

但我仍然遇到链接器错误,在使用各自的编译器编译 C++ tensorflow lite 示例项目或 C apollo3 示例项目时,我没有遇到这些错误:

....

tensorflow/lite/experimental/micro/tools/make/gen/sparkfun_edge_cortex-m4/obj//Users/macuser/Desktop/tf115/tensorflow/lite/experimental/micro/tools/make/downloads/AmbiqSuite-Rel2。 0.0/third_party/exactle/sw/hci/ambiq/apollo3/hci_drv_apollo3.o: 在函数HciDrvHandler': /Users/macuser/Desktop/tf115/tensorflow/lite/experimental/micro/tools/make/downloads/AmbiqSuite-Rel2.0.0/third_party/exactle/sw/hci/ambiq/apollo3/hci_drv_apollo3.c:1099: undefined reference toDmDevReset' tensorflow/lite/experimental/micro/tools/make/gen/sparkfun_edge_cortex-m4/obj//Users/macuser/Desktop/tf115/tensorflow/lite/experimental/micro/tools/make/downloads/AmbiqSuite-Rel2.0.0/third_party /exactle/sw/profiles/hrps/hrps_main.o: 在函数hrpsFindNextToSend': /Users/macuser/Desktop/tf115/tensorflow/lite/experimental/micro/tools/make/downloads/AmbiqSuite-Rel2.0.0/third_party/exactle/sw/profiles/hrps/hrps_main.c:125: undefined reference toAttsCccEnabled' tensorflow/lite/experimental/micro/tools/make/gen/sparkfun_edge_cortex-m4/obj//Users/macuser/Desktop/tf115/tensorflow/lite/experimental/micro/tools/make/downloads/AmbiqSuite-Rel2.0.0/third_party /exactle/sw/profiles/hrps/hrps_main.o: 在函数hrpsSendHrmNtf': /Users/macuser/Desktop/tf115/tensorflow/lite/experimental/micro/tools/make/downloads/AmbiqSuite-Rel2.0.0/third_party/exactle/sw/profiles/hrps/hrps_main.c:204: undefined reference toAttsHandleValueNtf'

....

如何正确编译我的 tensorflow lite C++ 项目中的 C 代码?

我使用的是 TensorFlow 1.15.0。

【问题讨论】:

  • 你能找到AttsCccEnabledAttsHandleValueNtf定义的文件吗?

标签: c++ c tensorflow gnu-make


【解决方案1】:

我也在使用 TFlite 制作一个使用 AmbiqSDK 的项目,我将向您解释我是如何制作界面的: 但首先你要知道TF是用C++写的,最好这样编译。

例如在 PDM .h/.c 中

PDM_mein.c -> write your code exactly in C

        void pdm_data_get(void)
{
    am_hal_pdm_transfer_t sTransfer;
    sTransfer.ui32TargetAddr = (uint32_t )  g_ui32PDMDataBuffer;
    
    sTransfer.ui32TotalCount = PDM_FFT_BYTES;
    am_hal_pdm_enable(PDMHandle);
    am_hal_sysctrl_sleep(AM_HAL_SYSCTRL_SLEEP_DEEP);
    am_hal_pdm_fifo_flush(PDMHandle);
    am_hal_pdm_dma_start(PDMHandle, &sTransfer);
}
////////////////////////////////////
PDM_mein.h

#ifdef __cplusplus
extern "C"
{
#endif

void pdm_data_get(void);

#ifdef __cplusplus
}
#endif

当你这样写时,你可以在 C++ 程序中使用 C 函数 并且不要忘记在 Makefile.inc 中添加 .c 和 .h 文件

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多