Table of Contents

hciuart

ASSERTION FAIL lll_peripheral.c:342

rtt:~$ ASSERTION FAIL [0] @ WEST_TOPDIR/zephyr/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_peripheral.c:342
rtt:~$   prepare_cb: Actual EVENT_OVERHEAD_START_US = 3784
rtt:~$ [00:03:07.452,392] <err> os: r0/a1:  0x00000003  r1/a2:  0x00000002  r2/a3:  0x00000001
rtt:~$ [00:03:07.452,392] <err> os: r3/a4:  0x00000003 r12/ip:  0x0000ffda r14/lr:  0x0000f29d
rtt:~$ [00:03:07.452,423] <err> os:  xpsr:  0x01000028
rtt:~$ [00:03:07.452,423] <err> os: Faulting instruction address (r15/pc): 0x0000f2ac
rtt:~$ [00:03:07.452,453] <err> os: >>> ZEPHYR FATAL ERROR 3: Kernel oops on CPU 0
rtt:~$ [00:03:07.452,453] <err> os: Fault during interrupt handling

rtt:~$ [00:03:07.452,484] <err> os: Current thread: 0x20003b68 (idle)
rtt:~$ [00:03:07.921,173] <err> os: Halting system
rtt:~$ 
rtt:~$ *** Booting Zephyr OS build v4.1.0 ***
rtt:~$ [00:00:00.002,166] <inf> bt_hci_raw: Bluetooth enabled in RAW mode
zephyr/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_peripheral.c
#define EVENT_OVERHEAD_PREEMPT_US     0    /* if <= min, then dynamic preempt */
#define EVENT_OVERHEAD_PREEMPT_MIN_US 0
 
#if defined(CONFIG_BT_CTLR_XTAL_ADVANCED) && (EVENT_OVERHEAD_PREEMPT_US <= EVENT_OVERHEAD_PREEMPT_MIN_US)
	uint32_t overhead;
 
	overhead = lll_preempt_calc(ull, (TICKER_ID_CONN_BASE + lll->handle), ticks_at_event);
	/* check if preempt to start has changed */
	if (overhead) {
		LL_ASSERT_OVERHEAD(overhead);
 
		radio_isr_set(lll_isr_abort, lll);
		radio_disable();
 
		return -ECANCELED;
	}
#endif /* CONFIG_BT_CTLR_XTAL_ADVANCED */
zephyr/subsys/bluetooth/controller/hal/debug.h
#if defined(CONFIG_BT_CTLR_ASSERT_OVERHEAD_START)
#define LL_ASSERT_OVERHEAD(overhead) \
	LL_ASSERT_MSG(false, "%s: Actual EVENT_OVERHEAD_START_US = %u", \
		      __func__, HAL_TICKER_TICKS_TO_US(overhead));
#else /* !CONFIG_BT_CTLR_ASSERT_OVERHEAD_START */
#define LL_ASSERT_OVERHEAD(overhead) ARG_UNUSED(overhead)
#endif /* !CONFIG_BT_CTLR_ASSERT_OVERHEAD_START */
zephyr/subsys/bluetooth/controller/Kconfig.ll_sw_split
config BT_CTLR_ASSERT_OVERHEAD_START
	bool "Assert on Prepare Latency"
	default y
	help
	  Assert on increased Radio Event Prepare callback latencies due to
	  CPU usage overheads in the Controller implementation.
 
	  Disabling this option permits the Controller to gracefully skip radio
	  events that are delayed due to CPU usage latencies; as long as the
	  radio event skips are not for every consecutive radio event interval,
	  otherwise leading to remote supervision timeout and possible missing
	  local disconnect events.

Similar reports:

Workaround / fixes:

Out-of-order packet arrived

hci0: Too short H5 packet 
hci0: Out-of-order packet arrived

configuration

Default config from samples:

Additional auto defaults:

In a combined build this value will be set in both the Host and the Controller.
In a Host-only build the Host will read the maximum ACL size supported by the Controller and use the smallest value supported by both the
Host and the Controller.
The Host supports sending of larger L2CAP PDUs than the ACL size and will fragment L2CAP PDUs into ACL data packets.
The Controller will return this value in the HCI LE Read Buffer Size command response. If this size if greater than effective Link
Layer transmission size then the Controller will perform fragmentation before transmitting the packet(s) on air.
If this value is less than the effective Link Layer transmission size then this will restrict the maximum Link Layer transmission size.

CONFIG_BT_HCI_TX_PRIO=7 # CONFIG_BT_RECV_WORKQ_SYS is not set CONFIG_BT_RECV_WORKQ_BT=y CONFIG_BT_RX_STACK_SIZE=768 CONFIG_BT_RX_PRIO=8 # Hidden option for Co-Operative Rx thread priority CONFIG_BT_DRIVER_RX_HIGH_PRIO=6 # Hidden option for Co-Operative HCI driver RX thread priority

CONFIG_BT_CTLR_DTM_HCI_SUPPORT=y CONFIG_BT_CTLR_DTM=y CONFIG_BT_CTLR_DTM_HCI=y CONFIG_BT_CTLR_DTM_HCI_RX_V3=y CONFIG_BT_CTLR_DTM_HCI_TX_V3=y CONFIG_BT_CTLR_DTM_HCI_TX_V4=y

# # Serial Drivers # CONFIG_UART_NRFX=y CONFIG_UART_NRFX_UART=y CONFIG_UART_0_INTERRUPT_DRIVEN=y # CONFIG_UART_0_NRF_PARITY_BIT is not set CONFIG_UART_0_TX_CACHE_SIZE=8 CONFIG_UART_0_RX_CACHE_SIZE=5 CONFIG_UART_0_A2I_RX_SIZE=64 CONFIG_UART_0_A2I_RX_BUF_COUNT=8

Related options:

# Enable if building a Host-only build
default y if !HAS_BT_CTLR && !BT_STM32_IPM && !BT_ESP32  && !BT_STM32WBA
# Enable if building a Controller-only build
default y if BT_HCI_RAW
select POLL

# Bluetooth optimizations to allow larger data packets. CONFIG_BT_RX_STACK_SIZE=2048 CONFIG_BT_L2CAP_TX_MTU=512 CONFIG_BT_BUF_ACL_RX_SIZE=502 CONFIG_BT_BUF_ACL_TX_SIZE=502 CONFIG_BT_CTLR_DATA_LENGTH_MAX=251