Missing include path

Hello All,

I am trying to build a project with the edge impulse SDK, namely edge-impulse-ingestion on firmware-eta-compute-ecm3532 and somehow I am getting an error of finding the right include within the Segger project, namely I am missing the path to the #include “eta_bsp.h”

Any ideas how to sort this out?

BR

@mu234 So last I checked the SEGGER IDE cannot build C++ projects properly, so building through CMake / Make as described in https://github.com/edgeimpulse/firmware-eta-compute-ecm3532#building-the-application should do the trick.

Q: Where did you get the SEGGER instructions from? From Eta?

1 Like

Hello guys!

I’m trying to port edge impulse library into my C++ app using nRF52832/FreeRTOS in Segger IDE. I’ve found the same issues about the c++ compiler limitations in SEGGER.

I was wondering if the cmake/ make way of building the edge impulse lib is specific to ETA ecm3532, because this is exactly what I need for my nRF52832.

Basically I need a way to bypass Segger’s compiler and flash my app+edge-impulse through JLink.

Maybe I need to create a custom Makefile and use nrfjprog CLI to flash the device. It would be a combination of my app’s Makefile and the edge-impulse lib’s Makefile, kind of.

Any ideas on how to achieve this? I would really appreciate it!

1 Like

Hi @felipe.carrau, actually nothing special in the CMake/Make builds. For a minimal application with a Makefile that builds an app + library, see https://github.com/edgeimpulse/example-standalone-inferencing should be pretty simple to get this running on a different target. We also ship with a CMakeLists.txt file in the C++ Library export, just including that in the CMakeLists of your application should build in any CMake environment already.

Hello Jan ! Thanks for your response. I finally got it running yesterday for an nRF5 SDK example “ble_app_blinky” adding what was inside the Zephyr example Makefile to ours. It was a bit of a pain as it was the first time I worked with editing Makefiles. The good thing was that the only edit to edge-impulse-sdk I had to make was changing this:

  1. /edge-impulse-sdk/CMSIS/DSP/Include/arm_math.h
    __STATIC_FORCEINLINE macros to:
    static inline attribute((always_inline))
  2. /tflite-model/trained_model_compiled.cpp
    #define EI_CLASSIFIER_ALLOCATION_STATIC
  3. /model-parameters/model_metadata.h
    #define EI_CLASSIFIER_USE_QUANTIZED_DSP_BLOCK 1
  4. /edge-impulse-sdk/tensorflow/lite/micro/compatibility.h
    #define TF_LITE_STATIC_MEMORY
  5. /edge-impulse-sdk/dsp/config.hpp
    #define EIDSP_SIGNAL_C_FN_POINTER 1
    #define EIDSP_USE_CMSIS_DSP 1
    #define EIDSP_LOAD_CMSIS_DSP_SOURCES 1
  6. Ported this Zephyr inference example main.cpp to actually call the inference Edge Impulse library.

I bypassed Segger Embedded Studio using this repo.

Running on a Feather nRF52832. Next steps should be smooth sailing now!

The only scary part (not tested yet) is memory usage while running the inferencing when we add FreeRTOS to the mix. I don’t think we got a lot of room left on RAM when the device is running our app.

Great, 3) should not be necessary though, and you can drop 2) if you want to lower memory usage (it’ll dynamically allocate the tensor arena in that case). What’s the type of model you’re running? The Studio’s estimate of DSP/NN usage should be accurate for this target.

The model is a motion classifier using an IMU. I will try your suggestions, thank you very much!