I'm getting the following intermittent MPU fault when reading data over BLE.
Both the BLE transmitter and receiver are using an nrf52840, though the receiver is a Laird MG100.
Fullscreen
1
2
3
4
5
6
7
8
9
10
[01:39:56.263,153] <err> os: mem_manage_fault: ***** MPU FAULT *****
[01:39:56.270,446] <err> os: mem_manage_fault: Data Access Violation
[01:39:56.277,923] <err> os: mem_manage_fault: MMFAR Address: 0x0
[01:39:56.285,156] <err> os: esf_dump: r0/a1: 0x00000000 r1/a2: 0x00000000 r2/a3: 0x00000040
[01:39:56.295,074] <err> os: esf_dump: r3/a4: 0x20000b14 r12/ip: 0x200010a0 r14/lr: 0x00061195
[01:39:56.304,992] <err> os: esf_dump: xpsr: 0x610f0000
[01:39:56.311,401] <err> os: esf_dump: Faulting instruction address (r15/pc): 0x00015924
[01:39:56.320,495] <err> os: z_fatal_error: >>> ZEPHYR FATAL ERROR 0: CPU exception on CPU 0
[01:39:56.329,925] <err> os: z_fatal_error: Current thread: 0x20003cd0 (main)
[01:39:56.338,073] <err> fatal_error: k_sys_fatal_error_handler: Resetting system
I'm using Zephyr OS build v3.2.99-ncs2.
I've traced r14/lr to `/nordic/v2.3.0/zephyr/kernel/sched.c:884`:
Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct k_thread *z_unpend_first_thread(_wait_q_t *wait_q)
{
struct k_thread *thread = NULL;
LOCKED(&sched_spinlock) {
thread = _priq_wait_best(&wait_q->waitq);
if (thread != NULL) { <---------- THIS IS THE OFFENDING LINE
unpend_thread_no_timeout(thread);
(void)z_abort_thread_timeout(thread);
}
}
return thread;
}
I've traced the faulting instruction address (r15/pc) to `/nordic\toolchains\v2.3.0\opt\zephyr-sdk\arm-zephyr-eabi\arm-zephyr-eabi\sys-include\ssp/string.h:86`:
Fullscreen
1
2
3
...
__ssp_bos_icheck3(memset, void *, int)
...
I'm unsure how to further debug this, as this appears to pertain to code working at a much lower level than I'm really used to.
Can anyone provide guidance?