NCS USB CDC fault when CONFIG_NO_OPTIMIZATIONS=y

When using USB with CONFIG_NO_OPTIMIZATIONS=y I'm getting a usage fault and Zephyr gives the reason K_ERR_STACK_CHK_FAIL.  The fault looks like it occurs in the unnamed thread created near the bottom of usb_dc_nrfx.c.

If CONFIG_NO_OPTIMIZATIONS=n then I do not see the hard faults.

I previously reported this same issue and changing the stack size to 4096 seemed to resolve it then.  However, even if I increase the stack size to 8192 now I'm still seeing the fault.

CONFIG_NO_OPTIMIZATIONS=y
CONFIG_EXTRA_EXCEPTION_INFO=y
CONFIG_RESET_ON_FATAL_ERROR=n
CONFIG_MAIN_STACK_SIZE=8192
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=8192
CONFIG_USB=y
CONFIG_USB_DEVICE_PRODUCT="Itamar Loop CDC & MSD"
CONFIG_USB_CDC_ACM=y
CONFIG_USB_WORKQUEUE_STACK_SIZE=8192
CONFIG_USB_NRFX_WORK_QUEUE_STACK_SIZE=8192
 
Any ideas on what might be going on here?
    • I modified the CDC ACM sample accordingly:

    diff --git a/samples/subsys/usb/cdc_acm/prj.conf b/samples/subsys/usb/cdc_acm/prj.conf
    index ed11167bd1..56aaad332a 100644
    --- a/samples/subsys/usb/cdc_acm/prj.conf
    +++ b/samples/subsys/usb/cdc_acm/prj.conf
    @@ -1,11 +1,23 @@
    +CONFIG_NO_OPTIMIZATIONS=y
    +CONFIG_LOG=n
    +
    +CONFIG_USB_WORKQUEUE_STACK_SIZE=8192
    +CONFIG_USB_NRFX_WORK_QUEUE_STACK_SIZE=8192
    +CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=8192
    +CONFIG_MAIN_STACK_SIZE=8192
    +
    +CONFIG_RESET_ON_FATAL_ERROR=n
    +CONFIG_THREAD_NAME=y
    +CONFIG_DEBUG_THREAD_INFO=y
    +
     CONFIG_STDOUT_CONSOLE=y
     CONFIG_USB=y
     CONFIG_USB_DEVICE_STACK=y
     CONFIG_USB_DEVICE_PRODUCT="Zephyr CDC ACM sample"
    -CONFIG_LOG=y
    +#CONFIG_LOG=y
     CONFIG_USB_DRIVER_LOG_LEVEL_ERR=y
     CONFIG_USB_CDC_ACM=y
     CONFIG_USB_DEVICE_LOG_LEVEL_ERR=y
     CONFIG_SERIAL=y
     CONFIG_UART_INTERRUPT_DRIVEN=y
    -CONFIG_UART_LINE_CTRL=y
    +CONFIG_UART_LINE_CTRL=y
    \ No newline at end of file
    

    • Then I built it using the board nrf5340dk_nrf5340_cpuapp
    • I opened an Ozone debug session and set a break point in main.c-->main()

    • No faults happened, since it's able to reach the break point

    Can you do the exact same and see if you get the same output?

  • A little more info: I tried this on an Intel Mac and M1 Mac with same results.  I am not using ozone.

  • Ah.. Of course. For some reason I thought it happened during the initialization that runs before main (I've handled many cases lately where this is the case :P. My bad.

  • I added CONFIG_ISR_STACK_SIZE=8192 and it seems to be working again.  My complete prj.conf is now:
    CONFIG_NO_OPTIMIZATIONS=y
    CONFIG_EXTRA_EXCEPTION_INFO=y
    CONFIG_RESET_ON_FATAL_ERROR=n
    CONFIG_MAIN_STACK_SIZE=8192
    CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=8192
    CONFIG_IDLE_STACK_SIZE=8192
    CONFIG_ISR_STACK_SIZE=8192
    CONFIG_DEBUG_THREAD_INFO=y

    CONFIG_LOG=n
    CONFIG_CONSOLE=n
    CONFIG_UART_CONSOLE=n
    CONFIG_PRINTK=n

    CONFIG_SERIAL=y
    CONFIG_UART_ASYNC_API=y
    CONFIG_UART_0_INTERRUPT_DRIVEN=n
    CONFIG_UART_0_ASYNC=y
    CONFIG_UART_0_NRF_HW_ASYNC=y
    CONFIG_UART_0_NRF_HW_ASYNC_TIMER=0
    CONFIG_UART_1_INTERRUPT_DRIVEN=n
    CONFIG_UART_1_ASYNC=y
    CONFIG_UART_1_NRF_HW_ASYNC=y
    CONFIG_UART_1_NRF_HW_ASYNC_TIMER=1
    CONFIG_UART_3_INTERRUPT_DRIVEN=n
    CONFIG_UART_3_ASYNC=y
    CONFIG_UART_3_NRF_HW_ASYNC=y
    CONFIG_UART_3_NRF_HW_ASYNC_TIMER=2

    CONFIG_NEWLIB_LIBC=y

    CONFIG_NFCT_PINS_AS_GPIOS=y

    CONFIG_USB=y
    CONFIG_USB_DEVICE_PRODUCT="Itamar Loop CDC & MSD"
    CONFIG_USB_CDC_ACM=y
    CONFIG_USB_WORKQUEUE_STACK_SIZE=8192
    CONFIG_USB_NRFX_WORK_QUEUE_STACK_SIZE=8192
    CONFIG_USB_MASS_STORAGE=y
    CONFIG_MASS_STORAGE_STACK_SIZE=8192
    CONFIG_MASS_STORAGE_DISK_NAME="NAND"
    CONFIG_DISK_DRIVER_FLASH=y
    CONFIG_FILE_SYSTEM=y
    CONFIG_FAT_FILESYSTEM_ELM=y
    CONFIG_FLASH_MAP=y
    CONFIG_FLASH_PAGE_LAYOUT=y
    CONFIG_DISK_FLASH_START=0x0
    CONFIG_NORDIC_QSPI_NOR_FLASH_LAYOUT_PAGE_SIZE=4096
    CONFIG_DISK_FLASH_DEV_NAME="MT25QU512"
    CONFIG_DISK_VOLUME_SIZE=0x20000
    CONFIG_DISK_FLASH_MAX_RW_SIZE=4096
    CONFIG_DISK_FLASH_ERASE_ALIGNMENT=0x1000
    CONFIG_DISK_ERASE_BLOCK_SIZE=0x1000
    CONFIG_NORDIC_QSPI_NOR=y
    CONFIG_FLASH_JESD216_API=y
Related