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 systemThe 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. So far I have tried to: (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];
}
} and 48150: f8dc 300c ldr.w r3, [ip, #12] CHECK(!chunk_used(h, c)); CHECK(b->next != 0); CHECK(h->avail_buckets & BIT(bidx));.
I attach my prj.conf here:
# 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=4096 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 CONFIG_BMI270=y CONFIG_BMI270_TRIGGER_GLOBAL_THREAD=y CONFIG_BMP388=y CONFIG_BMP388_TRIGGER_GLOBAL_THREAD=y CONFIG_BMP388_ODR_RUNTIME=y CONFIG_BMP388_OSR_RUNTIME=y # ------------------- Edge ML ------------------- CONFIG_CPP=y CONFIG_STD_CPP11=y CONFIG_FP16=n CONFIG_EDGE_IMPULSE=y CONFIG_EDGE_IMPULSE_URI="/Users/gw23523/Downloads/test-cpp-mcu-v5.zip" CONFIG_EI_WRAPPER=y # ------------------- Turn below ON for Optimisation ------------------- # Stack sizes (This needs to be optimised using the thread analyzer below) CONFIG_MAIN_STACK_SIZE=2048 CONFIG_ISR_STACK_SIZE=2048 CONFIG_IDLE_STACK_SIZE=512 CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048 CONFIG_EI_WRAPPER_THREAD_STACK_SIZE=8192 CONFIG_MASS_STORAGE_STACK_SIZE=1024 # 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 # ----------------------------------------------------------------------I am using NCS 3.0.2, nrf5340.
I also observed from this post a very similar precise bus error where frequent data IO is presented: https://devzone.nordicsemi.com/f/nordic-q-a/124449/when-pd-continuously-sends-libosdp-events-w-o-interruption-reader-will-get-bus-fault/550752, in which CPP kconfigs are also enabled. Could this be an issue?