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:
-
Increase edge impulse stack size to 8192 and other threads’ stack size geneously
-
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];
}
}` -
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`