Precise data bus error when use Edge Impulse wrapper on nRF5340

Question/Issue:
I am trying to use Edge Impulse ML models on my custom board. I have built my model on EI and downloaded it locally. I followed the sample wrapper code to use my own model but constanly get this error:[00:00:02.771,697] <err> os: ***** BUS FAULT ***** [00:00:02.771,697] <err> os: Precise data bus error [00:00:02.771,697] <err> os: BFAR Address: 0x2002065c [00:00:02.771,728] <err> os: r0/a1: 0x2001fc08 r1/a2: 0x00000149 r2/a3: 0x0000000f [00:00:02.771,759] <err> os: r3/a4: 0x00000013 r12/ip: 0x20020650 r14/lr: 0x00048553 [00:00:02.771,759] <err> os: xpsr: 0x21000200 [00:00:02.771,759] <err> os: s[ 0]: 0xaaaaaaaa s[ 1]: 0x00000149 s[ 2]: 0x00000008 s[ 3]: 0x00000002 [00:00:02.771,789] <err> os: s[ 4]: 0x2001fc08 s[ 5]: 0x2001fc08 s[ 6]: 0x00000000 s[ 7]: 0x0004859f [00:00:02.771,789] <err> os: s[ 8]: 0x00000008 s[ 9]: 0x00000008 s[10]: 0x2001fc08 s[11]: 0x000486c5 [00:00:02.771,850] <err> os: s[12]: 0x00000008 s[13]: 0x2001181c s[14]: 0x20007938 s[15]: 0x00000000 [00:00:02.771,850] <err> os: fpscr: 0x00000000 [00:00:02.771,850] <err> os: Faulting instruction address (r15/pc): 0x00048150 [00:00:02.771,881] <err> os: >>> ZEPHYR FATAL ERROR 25: Unknown error on CPU 0 [00:00:02.771,911] <err> os: Current thread: 0x20007a08 (edge_impulse_thread) [00:00:03.226,226] <err> os: Halting system
The model can be initialised without any issue, only when I call: int err = ei_wrapper_add_data(ei_frame_data, frame_size); this specific function, the system will crash. I suspect it is a stack overflow issue.

Context/Use case:
nrf5340 SoC with edge impulse wrapper

So far, I have tried the following debug processes:
Steps Taken:

  1. Increase edge impulse stack size to 8192 and other threads’ stack size geneously

  2. Use addr2line and arm-none-eabi-objdump -d -S build/Firmware/zephyr/zephyr.elf > disassembly_3.txt to examine the specific memory address. This returns: /opt/nordic/ncs/v3.0.2/zephyr/lib/heap/heap.h:114 which points to this function: `static inline chunkid_t chunk_field(struct z_heap *h, chunkid_t c,
    enum chunk_fields f)
    {
    chunk_unit_t *buf = chunk_buf(h);
    void *cmem = &buf[c];

    if (big_heap(h)) {
    return ((uint32_t *)cmem)[f];
    } else {
    return ((uint16_t *)cmem)[f];
    }
    }`

  3. Depoly the same model and use the same prj.conf on nordic’s demo project

Expected Outcome:
The model can be run on the nordic edge impulse wrapper official sample and with the same prj.conf.

Actual Outcome:
The firmware will crash upon calling ei_wrapper_add_data(ei_frame_data, frame_size) in my own firmware code.

Reproducibility:
Always

Environment:

  • Platform: [nRF5340]
  • Build Environment Details: [NCS/zephyr v3.0.2]
  • OS Version: [MacOS 15.7.1]

Logs/Attachments:
Complete prj.conf: `# Enable GPIO
CONFIG_GPIO=y

Enable I2C

CONFIG_I2C=y

Enable SPI

CONFIG_SPI=y

Enable log and use it via Jlink RTT rather than CDC ACM

CONFIG_LOG=y
CONFIG_USE_SEGGER_RTT=y
CONFIG_LOG_BACKEND_RTT=y
CONFIG_LOG_BACKEND_UART=n
CONFIG_RTT_CONSOLE=n
CONFIG_STDOUT_CONSOLE=n
CONFIG_SEGGER_RTT_BUFFER_SIZE_UP=4096
CONFIG_LOG_BUFFER_SIZE=8192
CONFIG_UART_CONSOLE=n
CONFIG_CONSOLE=n

Enable Bluetooth LE

CONFIG_BT=y
CONFIG_BT_PERIPHERAL=y
CONFIG_BT_DEVICE_NAME=“BORUS”
CONFIG_BT_BROADCASTER=y
CONFIG_BT_OBSERVER=y
CONFIG_BT_FILTER_ACCEPT_LIST=y

Extended BLE

CONFIG_BT_EXT_ADV=y
CONFIG_BT_EXT_ADV_MAX_ADV_SET=2

Enale floating point unit for float point calculation

CONFIG_FPU=y
CONFIG_CBPRINTF_FP_SUPPORT=y
CONFIG_FPU_SHARING=y

Enable debugging

CONFIG_DEBUG_THREAD_INFO=y
CONFIG_DEBUG_OPTIMIZATIONS=y

Enable multithread

CONFIG_MULTITHREADING=y

Enable battery voltage monitoring

CONFIG_SENSOR=y
CONFIG_PWM=n
CONFIG_ADC=y
CONFIG_VOLTAGE_DIVIDER=y
CONFIG_NRFX_SAADC=y

Configure USB device

CONFIG_USB_DEVICE_STACK=y
CONFIG_USB_DEVICE_PRODUCT=“BORUS”
CONFIG_USB_DEVICE_PID=0x0001
CONFIG_USB_DEVICE_VID=0x0001
CONFIG_USB_DRIVER_LOG_LEVEL_ERR=y
CONFIG_USB_DEVICE_LOG_LEVEL_ERR=y
CONFIG_SERIAL=n
CONFIG_USB_CDC_ACM=n
CONFIG_UART_INTERRUPT_DRIVEN=n
CONFIG_UART_LINE_CTRL=n
CONFIG_BOARD_SERIAL_BACKEND_CDC_ACM=n
CONFIG_USB_DEVICE_INITIALIZE_AT_BOOT=n

Configure USB device to appear as DFU class

Configure DFU autoupdate and reset

CONFIG_USB_DFU_CLASS=y
CONFIG_USB_REQUEST_BUFFER_SIZE=128
CONFIG_USB_DFU_ENABLE_UPLOAD=y
CONFIG_USB_DFU_PERMANENT_DOWNLOAD=y
CONFIG_USB_DFU_REBOOT=y
CONFIG_IMG_MANAGER=y
CONFIG_STREAM_FLASH=y
CONFIG_BOOTLOADER_MCUBOOT=y

Configure file system

CONFIG_FLASH_MAP=y
CONFIG_FLASH=y
CONFIG_FILE_SYSTEM=y
CONFIG_FILE_SYSTEM_LITTLEFS=n
CONFIG_FAT_FILESYSTEM_ELM=y
CONFIG_FS_FATFS_LFN=y
CONFIG_FS_FATFS_EXFAT=y
CONFIG_FS_LOG_LEVEL_INF=y
CONFIG_FLASH_PAGE_LAYOUT=y
CONFIG_MPU_ALLOW_FLASH_WRITE=y
CONFIG_NORDIC_QSPI_NOR=y
CONFIG_NORDIC_QSPI_NOR_FLASH_LAYOUT_PAGE_SIZE=4096

Configure SPI RAM buffer size

CONFIG_SPI_NRFX_RAM_BUFFER_SIZE=128

Configure mass storage

CONFIG_USB_MASS_STORAGE=y
CONFIG_DISK_ACCESS=y
CONFIG_USB_MASS_STORAGE_LOG_LEVEL_ERR=y
CONFIG_DISK_LOG_LEVEL_DBG=y
CONFIG_DISK_DRIVERS=y
CONFIG_DISK_DRIVER_SDMMC=y
CONFIG_DISK_DRIVER_FLASH=y
CONFIG_MASS_STORAGE_DISK_NAME=“SD”

Configure BLE encryption

CONFIG_NRF_SECURITY=y
CONFIG_MBEDTLS_PSA_CRYPTO_C=y
CONFIG_PSA_CRYPTO_DRIVER_CC3XX=y
CONFIG_PSA_CRYPTO_DRIVER_OBERON=n
CONFIG_PSA_WANT_KEY_TYPE_AES=y
CONFIG_PSA_WANT_ALG_CTR=y
CONFIG_HEAP_MEM_POOL_SIZE=262144
CONFIG_MBEDTLS_ENABLE_HEAP=y
CONFIG_MBEDTLS_HEAP_SIZE=8192
CONFIG_TEST_RANDOM_GENERATOR=y

Configure Settings subsystem

CONFIG_SETTINGS=y
CONFIG_SETTINGS_RUNTIME=y
CONFIG_NVS=y
CONFIG_SETTINGS_NVS=y
CONFIG_MPU_ALLOW_FLASH_WRITE=y

Configure Watchdog

CONFIG_WATCHDOG=y
CONFIG_WDT_DISABLE_AT_BOOT=n

Enable State Machine Framework

CONFIG_SMF=y

Enable DSP

CONFIG_CMSIS_DSP=y
CONFIG_CMSIS_DSP_FILTERING=y
CONFIG_CMSIS_DSP_TRANSFORM=y
CONFIG_CMSIS_DSP_STATISTICS=y
CONFIG_CMSIS_DSP_FASTMATH=y
CONFIG_REQUIRES_FULL_LIBC=y
CONFIG_RING_BUFFER=y

Power management

CONFIG_PM_DEVICE=y
CONFIG_RAM_POWER_DOWN_LIBRARY=y
CONFIG_POWEROFF=y

Sensor drivers and threads

CONFIG_BMI270=y
CONFIG_BMI270_TRIGGER_OWN_THREAD=y
CONFIG_BMP388=y
CONFIG_BMP388_TRIGGER_OWN_THREAD=y
CONFIG_BMP388_ODR_RUNTIME=y
CONFIG_BMP388_OSR_RUNTIME=y

Enable Edge Impulse dependencies

CONFIG_CPP=y
CONFIG_STD_CPP11=y
CONFIG_FP16=n

Enable Edge Impulse

CONFIG_EDGE_IMPULSE=y
CONFIG_EDGE_IMPULSE_URI=“/Users/gw23523/Downloads/test-cpp-mcu-v9.zip”
CONFIG_EI_WRAPPER=y
CONFIG_EI_WRAPPER_DATA_BUF_SIZE=2500
CONFIG_EI_WRAPPER_THREAD_PRIORITY=8

------------------- Turn below ON for Optimisation -------------------

Stack sizes (This needs to be optimised using the thread analyzer below)

CONFIG_MAIN_STACK_SIZE=4096
CONFIG_ISR_STACK_SIZE=1536
CONFIG_IDLE_STACK_SIZE=512
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048
CONFIG_MASS_STORAGE_STACK_SIZE=1024
CONFIG_LOG_PROCESS_THREAD_STACK_SIZE=2048
CONFIG_EI_WRAPPER_THREAD_STACK_SIZE=4096

Thread analyser for debug purposes

CONFIG_THREAD_ANALYZER=y

CONFIG_THREAD_ANALYZER_USE_LOG=y

CONFIG_THREAD_ANALYZER_AUTO=y

CONFIG_THREAD_ANALYZER_AUTO_INTERVAL=5

CONFIG_THREAD_NAME=y

----------------------------------------------------------------------

CONFIG_STACK_SENTINEL=y`

This issue is solved now by removing power_down_unused_ram()