LED Strip - SPI failures at ~250 LEDs?

Hi all.

I have made myself a board which has a module with the nRF52833 chip embedded onto it. It's effectively a board with a set of switching regulators on it to drive multiple strings of LEDs. I have been testing the board with relatively small strings of SK6812 RGBW LEDs - up to 120 or so - and all has been working fine. Today I have received a longer strip of LEDs and I'm apparently having issues driving it.

The code is relatively simple, I am generating pixels and sending them towards the strip using the ws2812_spi driver:

ret = led_strip_update_rgb(strips[i]->device, strips[i]->buffer, offset); // Update physical


An example of my config (there's one for each of the four SPI buses):

&spi2 {
    compatible="nordic,nrf-spim";
    status = "okay";

    pinctrl-0 = <&spi2_default>;
    pinctrl-1 = <&spi2_sleep>;
    pinctrl-names = "default", "sleep";

    led_strip2: ws2812@2 {
        compatible = "worldsemi,ws2812-spi";

        /* SPI */
        reg = <2>; /* ignored, but necessary for SPI bindings */
        spi-max-frequency = <SPI_FREQ>;

        /* WS2812 */
        chain-length = <300>; /* arbitrary; change at will */
        color-mapping = <LED_COLOR_ID_GREEN
                 LED_COLOR_ID_RED
                 LED_COLOR_ID_BLUE
                 LED_COLOR_ID_WHITE
                 >;
        spi-one-frame = <ONE_FRAME>;
        spi-zero-frame = <ZERO_FRAME>;
    };
};
The issue is that when I try and update a longer strip - up to around 240 pixels works fine but somewhere around 250 it fails - something is locking on a mutex or otherwise dying. Note that the LED strip physically is correctly updated to the # of pixels I requested, including my maximum string length of 300... but the board/OS is then locked up.
If I debug the code, wait for it to fail, and breakpoint - no fatal error happens "naturally" - then the main thread call-stack is stuck here:

arch_swap(unsigned int key) (c:\ncs\v2.6.0\zephyr\arch\arm\core\cortex_m\swap.c:48)
spi_context_wait_for_completion(struct spi_context * ctx) (c:\ncs\v2.6.0\zephyr\drivers\spi\spi_context.h:169)
transceive(const struct device * dev, const struct spi_config * spi_cfg, const struct spi_buf_set * tx_bufs, const struct spi_buf_set * rx_bufs, _Bool asynchronous, spi_callback_t cb, void * userdata) (c:\ncs\v2.6.0\zephyr\drivers\spi\spi_nrfx_spim.c:446)
spi_nrfx_transceive(const struct device * dev, const struct spi_config * spi_cfg, const struct spi_buf_set * tx_bufs, const struct spi_buf_set * rx_bufs) (c:\ncs\v2.6.0\zephyr\drivers\spi\spi_nrfx_spim.c:485)
spi_transceive(const struct spi_buf_set * rx_bufs, const struct spi_buf_set * tx_bufs, const struct spi_config * config, const struct device * dev) (c:\V\led_board_testing\build\zephyr\include\generated\syscalls\spi.h:38)
spi_write(const struct spi_buf_set * tx_bufs, const struct spi_config * config, const struct device * dev) (c:\ncs\v2.6.0\zephyr\include\zephyr\drivers\spi.h:837)
spi_write_dt(const struct spi_dt_spec * spec, const struct spi_buf_set * tx_bufs) (c:\ncs\v2.6.0\zephyr\include\zephyr\drivers\spi.h:855)
ws2812_strip_update_rgb(const struct device * dev, struct led_rgb * pixels, size_t num_pixels) (c:\ncs\v2.6.0\zephyr\drivers\led_strip\ws2812_spi.c:152)
led_strip_update_rgb(size_t num_pixels, struct led_rgb * pixels, const struct device * dev) (c:\ncs\v2.6.0\zephyr\include\zephyr\drivers\led_strip.h:105)
For clarity, the exact line it's gone away on is:
if (k_sem_take(&ctx->sync, timeout)) {

And I'm getting an exception only when I breakpoint, on the logging thread (which seems arbitrary, as if I entirely remove logging, I get the exception instead on the gpio_handler thread):
k_sys_fatal_error_handler(unsigned int reason, const z_arch_esf_t * esf) (c:\ncs\v2.6.0\zephyr\kernel\fatal.c:41)
<signal handler called> (Unknown Source:0)
<signal handler called> (Unknown Source:0)
mpsc_pbuf_free(struct mpsc_pbuf_buffer * buffer, const union mpsc_pbuf_generic * item) (c:\ncs\v2.6.0\zephyr\lib\os\mpsc_pbuf.c:577)
msg_free(struct mpsc_pbuf_buffer * buffer, const union log_msg_generic * msg) (c:\ncs\v2.6.0\zephyr\subsys\logging\log_core.c:739)
log_process() (c:\V\led_board_testing\build\zephyr\include\generated\syscalls\log_ctrl.h:57)
log_process_thread_func(void * dummy1, void * dummy2, void * dummy3) (c:\ncs\v2.6.0\zephyr\subsys\logging\log_core.c:908)

Also note that I have trivially modified a few SPI files to add logging, and the ws2812_spi.c driver to override the buffer length based on num_pixels instead the length preconfigured in the config (i.e.buf.len = cfg->num_colors * 8 * num_pixels; ), so line references in the call stacks may not line up.
Any hints for debugging/diagnosing or potential hardware limitations I'm hitting are welcome (I don't believe this to be a power issue as all the LEDs are correctly updated and lit despite SPI not returning, and power draw is ~1 amp with the regulator rated at 5 and my PSU rated at 10).
Versions:
NCS 2.6.0; custom dts based on this:
#include <nordic/nrf52833_qiaa.dtsi>
#include <zephyr/dt-bindings/led/led.h>
Thanks for reading.
Parents
  • Hi,

    Since you are getting your app freezing, let's start by looking at that.

    And I'm getting an exception only when I breakpoint

    Are you able to use breakpoints when using a working app (120 LEDs)?

    Regards,
    Sigurd Hellesvik

  • Hi Sigurd.

    Yes. Up to 240 LEDS - i.e. 7680 bytes towards the SPI transmit - everything works as expected. I have a main loop which cycles updating the pixels, with code in it to flash one of the onboard LEDs with gpio_pin_toggle_dt.

    I can debug, breakpoint, etc, wherever I like, no issue at all, and the LED is flashing.

    I've spent a bit more time now trying to debug to find the issue aiming to update 242. I have placed breakpoints in the spi_nrfx_spim.c file on both of these two lines in transceive (7744 bytes now):

    error = spi_context_wait_for_completion(&dev_data->ctx);
    ...
    spi_context_release(&dev_data->ctx, error);
    ... and as long as I breakpoint at least one of those lines, I can step over and back and cycle as long as I want with no issues, with 242 pixels being updated:
    00> [00:00:00.009,155] <err> spi_nrfx_spim: SPI0 transceive 1952 bytes
    00> [00:00:12.620,117] <err> spi_nrfx_spim: Timeout SPI0 is 4769 (ticks) 6554 (ms)
    00> [00:00:14.520,690] <err> spi_nrfx_spim: SPI1 transceive 2904 bytes
    00> [00:00:21.905,578] <err> spi_nrfx_spim: Timeout SPI1 is 4769 (ticks) 6554 (ms)
    00> [00:00:23.422,271] <err> spi_nrfx_spim: SPI2 transceive 7744 bytes
    00> [00:00:26.420,623] <err> spi_nrfx_spim: Timeout SPI2 is 4769 (ticks) 6554 (ms)
    00> [00:00:27.968,322] <err> spi_nrfx_spim: SPI3 transceive 32 bytes
    00> [00:00:30.108,489] <err> spi_nrfx_spim: Timeout SPI3 is 4769 (ticks) 6554 (ms)
    00> [00:00:31.515,625] <err> spi_nrfx_spim: SPI0 transceive 1952 bytes
    00> [00:00:44.426,055] <err> spi_nrfx_spim: Timeout SPI0 is 4769 (ticks) 6554 (ms)
    00> [00:00:45.980,163] <err> spi_nrfx_spim: SPI1 transceive 2904 bytes
    00> [00:00:47.594,238] <err> spi_nrfx_spim: Timeout SPI1 is 4769 (ticks) 6554 (ms)
    00> [00:00:48.918,243] <err> spi_nrfx_spim: SPI2 transceive 7744 bytes
    00> [00:00:50.944,458] <err> spi_nrfx_spim: Timeout SPI2 is 4769 (ticks) 6554 (ms)
    00> [00:00:52.266,479] <err> spi_nrfx_spim: SPI3 transceive 32 bytes
    00> [00:00:54.535,034] <err> spi_nrfx_spim: Timeout SPI3 is 4769 (ticks) 6554 (ms)
    00> [00:00:55.929,840] <err> spi_nrfx_spim: SPI0 transceive 1952 bytes
    00> [00:00:57.861,816] <err> spi_nrfx_spim: Timeout SPI0 is 4769 (ticks) 6554 (ms)
    00> [00:00:59.096,984] <err> spi_nrfx_spim: SPI1 transceive 2904 bytes
    00> [00:01:01.470,123] <err> spi_nrfx_spim: Timeout SPI1 is 4769 (ticks) 6554 (ms)
    00> [00:01:03.403,228] <err> spi_nrfx_spim: SPI2 transceive 7744 bytes
    00> [00:01:04.987,091] <err> spi_nrfx_spim: Timeout SPI2 is 4769 (ticks) 6554 (ms)
    00> [00:01:06.532,379] <err> spi_nrfx_spim: SPI3 transceive 32 bytes
    00> [00:01:07.963,012] <err> spi_nrfx_spim: Timeout SPI3 is 4769 (ticks) 6554 (ms)


    As soon as I remove the breakpoints... it previously would have failed but now it still works ... and so the fun starts... if I remove the logging I added post timeout calculation then we're back to failing:

               // LOG_ERR("Timeout SPI%d is %d (ticks) %d (ms)", ctx->owner->slave, timeout.ticks, timeout_ms);
    And everything drops dead before the logging of SPI3 hits:

    00> [00:00:00.009,948] <err> spi_nrfx_spim: SPI0 transceive 1952 bytes
    00> [00:00:00.014,892] <err> spi_nrfx_spim: SPI1 transceive 2904 bytes
    [end]
    ... and it does nothing until I breakpoint, at which point I get the callstacks from the original post.

    This has to be a race condition of some sort, but I'm clueless as to how to diagnose further.
    (Note also it seems odd that the timeouts are the same given I'm transferring different amounts of data?)
    Many thanks.
  • I suggest that you start by giving our thread viewer a go. Maybe that can give you some insight into what is happening.

    Let me know what you find

  • Hello again.

    Screenshot of it while "dead" (242 pixels):

    Screenshot of the same thing as soon as I manually hit pause (f6); reason is 20:

    Screenshot of 240 pixel version - no code change except single char 2 to 0 to make 242 to 240 in the config on in view - working fine:

    And of 240 version once I hit pause (working fine):

    Adding the logging back in "unfortunately" no longer fixes the 242 pixel version (not that it was a viable fix anyway of course).

  • Ok, I enabled immediate logging and that's given me more log information. Here is boot to the point it crashes, with 250 LEDs configured:

    [00:00:00.000,427] <dbg> os:[00:00:00.000,793] <dbg> clock_control: clkstarted_handle: hfclk: Clock started
    setup_thread_stack: stack 0x2000be80 for thread 0x200009e0: obj_size=1088 buf_start=0x2000bec0 buf_size 1024 stack_ptr=0x2000c2c0
    [00:00:00.002,349] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.002,929] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.003,479] <dbg> mpu: region_init: [2] 0x2000be80 0x150b000a
    [00:00:00.004,089] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.004,608] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.005,157] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    *** Booting nRF Connect SDK v3.5.99-ncs1 ***
    [00:00:00.006,225] <inf> BATTERY: Found device "vbatt", getting sensor data

    [00:00:00.006,774] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.007,293] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.007,843] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.008,483] <dbg> voltage: get: 863 of 4095, 758mV, voltage:12128mV
    [00:00:00.009,094] <inf> BATTERY: Battery setup: 0 12.128000
    [00:00:00.009,674] <dbg> os: z_impl_k_mutex_lock: 0x200008c0 took mutex 0x200065c0, count: 1, orig prio: 0
    [00:00:00.010,375] <dbg> os: z_impl_k_mutex_unlock: mutex 0x200065c0 lock_count: 1
    [00:00:00.010,955] <dbg> os: z_impl_k_mutex_unlock: new owner of mutex 0x200065c0: (nil) (prio: -1000)
    [00:00:00.011,688] <inf> THERMISTOR: Found thermistor device "ntc-0", getting sensor data

    [00:00:00.012,237] <inf> THERMISTOR: Found thermistor device "ntc-1", getting sensor data

    [00:00:00.012,786] <inf> THERMISTOR: Found thermistor device "ntc-2", getting sensor data

    [00:00:00.013,366] <dbg> os: setup_thread_stack: stack 0x2000a840 for thread 0x20000720: obj_size=1088 buf_start=0x2000a880 buf_size 1024 stack_ptr=0x2000ac80
    [00:00:00.014,495] <dbg> os: k_sched_unlock: scheduler unlocked (0x200008c0:0)
    [00:00:00.015,045] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.015,594] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.016,143] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.016,723] <inf> BT_LED_Main: Bluetooth LED peripheral booting... cdebyte_e73_2g4m08s1ex

    [00:00:00.017,364] <inf> BT_LED_Main: Build time: May 16 2024 19:37:58

    [00:00:00.018,035] <dbg> os: z_impl_k_mutex_lock: 0x200008c0 took mutex 0x200065a8, count: 1, orig prio: 0
    [00:00:00.018,798] <dbg> os: z_impl_k_mutex_unlock: mutex 0x200065a8 lock_count: 1
    [00:00:00.019,378] <dbg> os: z_impl_k_mutex_unlock: new owner of mutex 0x200065a8: (nil) (prio: -1000)
    [00:00:00.020,019] <inf> BT_LED_Main: 5v boost power enabled.

    [00:00:00.020,477] <dbg> os: z_impl_k_mutex_lock: 0x200008c0 took mutex 0x20006590, count: 1, orig prio: 0
    [00:00:00.021,209] <dbg> os: z_impl_k_mutex_unlock: mutex 0x20006590 lock_count: 1
    [00:00:00.021,789] <dbg> os: z_impl_k_mutex_unlock: new owner of mutex 0x20006590: (nil) (prio: -1000)
    [00:00:00.022,430] <inf> BT_LED_Main: Level-shifter power enabled.

    [00:00:00.022,918] <dbg> os: z_impl_k_mutex_lock: 0x200008c0 took mutex 0x20006578, count: 1, orig prio: 0
    [00:00:00.023,620] <dbg> os: z_impl_k_mutex_unlock: mutex 0x20006578 lock_count: 1
    [00:00:00.024,200] <dbg> os: z_impl_k_mutex_unlock: new owner of mutex 0x20006578: (nil) (prio: -1000)
    [00:00:00.024,902] <inf> BT_LED_Main: LDO output 1 enabled.

    [00:00:00.025,543] <dbg> os: z_impl_k_mutex_lock: 0x200008c0 took mutex 0x20006560, count: 1, orig prio: 0
    [00:00:00.026,428] <dbg> os: z_impl_k_mutex_unlock: mutex 0x20006560 lock_count: 1
    [00:00:00.027,191] <dbg> os: z_impl_k_mutex_unlock: new owner of mutex 0x20006560: (nil) (prio: -1000)
    [00:00:00.027,832] <inf> BT_LED_Main: LDO output 2 enabled.

    [00:00:00.028,289] <dbg> os: z_impl_k_mutex_lock: 0x200008c0 took mutex 0x20006548, count: 1, orig prio: 0
    [00:00:00.028,991] <dbg> os: z_impl_k_mutex_unlock: mutex 0x20006548 lock_count: 1
    [00:00:00.029,571] <dbg> os: z_impl_k_mutex_unlock: new owner of mutex 0x20006548: (nil) (prio: -1000)
    [00:00:00.030,273] <inf> BT_LED_Main: LDO output 3 enabled.

    [00:00:00.030,792] <inf> BT_LED_Main: Twinkle config on strip 0 with a width 30 ptr (nil)
    [00:00:00.031,555] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.032,165] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.032,8[00:00:00.033,081] <dbg> clock_control: z_nrf_clock_calibration_done_handler: Calibration done.
    97] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.034,240] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.034,820] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.035,430] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.036,193] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.036,773] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.037,322] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.037,902] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.038,421] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.038,970] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.039,611] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.040,191] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.040,740] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.041,320] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.041,870] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.042,419] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.043,029] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.043,609] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.044,158] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.044,738] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.045,257] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.045,806] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.046,417] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.047,027] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.047,546] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.048,126] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.048,675] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.049,224] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.049,835] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.050,445] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.050,964] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.051,544] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.052,093] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.052,642] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.053,253] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.053,863] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.054,382] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.054,962] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.055,511] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.056,060] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.056,671] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.057,250] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.057,800] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.058,380] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.058,929] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.059,478] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.060,089] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.060,668] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.061,218] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.061,798] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.062,316] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.062,866] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.063,507] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.064,086] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.064,636] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.065,216] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.065,734] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.066,284] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.066,925] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.067,504] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.068,054] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.068,634] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.069,152] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.069,702] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.070,312] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.070,922] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.071,472] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.072,052] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.072,570] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.073,120] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.073,730] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.074,340] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.074,859] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.075,439] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.075,988] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.076,538] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.077,148] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.077,758] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.078,277] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.078,857] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.079,406] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.079,956] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.080,566] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.081,176] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.081,726] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.082,275] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.082,824] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.083,374] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.083,984] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.084,594] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.085,144] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.085,693] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.086,242] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.086,791] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.087,402] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.088,012] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.088,531] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.089,111] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.089,660] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.090,209] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    ...
    [00:00:00.140,045] <err> spi_nrfx_spim: SPI0 transceive 1952 bytes
    [00:00:00.140,563] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.141,265] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x20005548/1952, rx buf/len (nil)/0
    [00:00:00.142,272] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.142,791] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.143,341] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.143,951] <dbg> os: z_impl_k_mutex_lock: 0x20000720 took mutex 0x20006608, count: 1, orig prio: 7
    [00:00:00.144,683] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.145,233] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.145,782] <dbg> mpu: [00:00:00.146,087] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.146,606] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.147,491] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.148,040] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.148,590] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.149,139] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.149,719] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.150,299] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.150,848] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.151,428] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.151,977] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.152,526] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.153,900] <err> spi_nrfx_spim: SPI1 transceive 2904 bytes
    [00:00:00.154,418] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.155,120] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x20004948/2904, rx buf/len (nil)/0
    [00:00:00.156,127] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.156,646] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.157,196] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.157,775] <dbg> os: z_impl_k_mutex_unlock: mutex 0x20006608 lock_count: 1
    [00:00:00.158,355] <dbg> os: z_impl_k_mutex_unlock: new owner of mutex 0x20006608: (nil) (prio: -1000)
    [00:00:00.159,027] <inf> THERMISTOR: Thermistor value 0: 24.908000
    [00:00:00.159,545] <dbg> os: z_impl_k_mutex_lock: 0x20000720 took mutex 0x200065f0, count: 1, orig prio: 7
    [00:00:00.160,278] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.160,827] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.161,376] <dbg> mpu: region_init: [2] 0x[00:00:00.161,804] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.162,353] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    2000b4c0 0x150b000a
    [00:00:00.163,116] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.163,635] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.164,184] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.164,764] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.165,344] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.165,924] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.166,473] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.167,053] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.167,602] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.168,151] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.170,837] <err> spi_nrfx_spim: SPI2 transceive 8000 bytes
    [00:00:00.171,356] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.172,058] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x200023a8/8000, rx buf/len (nil)/0
    [00:00:00.173,065] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.173,614] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.174,163] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.174,743] <dbg> os: z_impl_k_mutex_unlock: mutex 0x200065f0 lock_count: 1
    [00:00:00.175,323] <dbg> os: z_impl_k_mutex_unlock: new owner of mutex 0x200065f0: (nil) (prio: -1000)
    [00:00:00.175,964] <inf> THERMISTOR: Thermistor value 1: 26.367000
    [00:00:00.176,513] <dbg> os: z_impl_k_mutex_lock: 0x20000720 took mutex 0x200065d8, count: 1, orig prio: 7
    [00:00:00.177,246] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.177,795] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.178,344] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.178,924] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.179,473] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.180,023] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.180,572] <dbg> os: z_impl_k_mutex_unlock: mutex 0x200065d8 lock_count: 1
    [00:00:00.181,182] <dbg> os: z_impl_k_mutex_unlock: new owner of mutex 0x200065d8: (nil) (prio: -1000)
    [00:00:00.181,823] <inf> THERMISTOR: Thermistor value 2: 27.740000
    [00:00:00.182,342] <dbg> os: z_tick_sleep: thread 0x20000720 for 32768 ticks
    [00:00:00.182,952] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.183,471] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.184,020] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.188,812] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.189,361] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.189,941] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.190,490] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.191,040] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.191,619] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.192,199] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.192,779] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.193,328] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.193,908] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.194,458] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.195,007] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.195,587] <err> spi_nrfx_spim: SPI3 transceive 32 bytes
    [00:00:00.196,105] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.196,807] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x200013a8/32, rx buf/len (nil)/0
    [00:00:00.197,814] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.198,364] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.198,913] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.199,462] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.200,012] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.200,592] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.201,110] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.201,660] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.202,239] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.202,819] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.203,399] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.203,948] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.204,528] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.205,078] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.205,627] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.206,207] <dbg> os: z_tick_sleep: thread 0x200008c0 for 525 ticks
    [00:00:00.206,787] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.207,336] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.207,885] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.222,839] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.223,388] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.223,937] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.225,036] <err> spi_nrfx_spim: SPI0 transceive 1952 bytes
    [00:00:00.225,524] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.226,226] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x20005548/1952, rx buf/len (nil)/0
    [00:00:00.227,233] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.227,783] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.228,332] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.231,048] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.231,597] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.232,177] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.232,727] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.233,276] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.233,856] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.234,405] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.234,985] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.235,534] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.236,083] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.236,633] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.237,182] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.238,525] <err> spi_nrfx_spim: SPI1 transceive 2904 bytes
    [00:00:00.239,013] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.239,715] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x20004948/2904, rx buf/len (nil)/0
    [00:00:00.240,692] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.241,241] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.241,790] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.246,398] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.246,948] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.247,528] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.248,077] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.248,626] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.249,206] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.249,755] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.250,335] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.250,885] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.251,464] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.252,014] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.252,563] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.255,279] <err> spi_nrfx_spim: SPI2 transceive 8000 bytes
    [00:00:00.255,767] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.256,469] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x200023a8/8000, rx buf/len (nil)/0
    [00:00:00.257,476] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.258,026] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.258,575] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.273,223] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.273,773] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.274,353] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.274,902] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.275,451] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.276,031] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.276,611] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.277,160] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.277,740] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.278,289] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.278,839] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.279,388] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.279,998] <err> spi_nrfx_spim: SPI3 transceive 32 bytes
    [00:00:00.280,487] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.281,188] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x200013a8/32, rx buf/len (nil)/0
    [00:00:00.282,196] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.282,745] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.283,294] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.283,843] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.284,393] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.284,973] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.285,522] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.286,071] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.286,651] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.287,200] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.287,780] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.288,330] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.288,909] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.289,459] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.290,008] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.290,588] <dbg> os: z_tick_sleep: thread 0x200008c0 for 525 ticks
    [00:00:00.291,168] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.291,717] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.292,266] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.307,220] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.307,769] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.308,319] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.309,417] <err> spi_nrfx_spim: SPI0 transceive 1952 bytes
    [00:00:00.309,906] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.310,607] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x20005548/1952, rx buf/len (nil)/0
    [00:00:00.311,614] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.312,164] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.312,713] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.315,429] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.315,979] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.316,558] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.317,108] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.317,657] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.318,237] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.318,817] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.319,396] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.319,946] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.320,526] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.321,044] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.321,594] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.322,967] <err> spi_nrfx_spim: SPI1 transceive 2904 bytes
    [00:00:00.323,486] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.324,157] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x20004948/2904, rx buf/len (nil)/0
    [00:00:00.325,164] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.325,714] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.326,263] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.330,871] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.331,420] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.332,000] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.332,550] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.333,099] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.333,648] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.334,228] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.334,808] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.335,357] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.335,937] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.336,486] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.337,036] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.339,721] <err> spi_nrfx_spim: SPI2 transceive 8000 bytes
    [00:00:00.340,240] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.340,942] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x200023a8/8000, rx buf/len (nil)/0
    [00:00:00.341,949] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.342,498] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.343,048] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.357,696] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.358,215] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.358,825] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.359,344] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.359,893] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.360,473] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.361,053] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.361,633] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.362,182] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.362,762] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.363,311] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.363,861] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.364,440] <err> spi_nrfx_spim: SPI3 transceive 32 bytes
    [00:00:00.364,929] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.365,631] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x200013a8/32, rx buf/len (nil)/0
    [00:00:00.366,638] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.367,187] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.367,767] <dbg> mpu: mpu[00:00:00.368,072] <err> os: ***** BUS FAULT *****
    [00:00:00.368,469] <err> os: Precise data bus error
    [00:00:00.368,865] <err> os: BFAR Address: 0xff000008
    [00:00:00.369,354] <err> os: r0/a1: 0x20001394 r1/a2: 0x20001240 r2/a3: 0x00000000
    [00:00:00.369,995] <err> os: r3/a4: 0x0000fb61 r12/ip: 0x000001c0 r14/lr: 0x0000fb7d
    [00:00:00.370,605] <err> os: xpsr: 0xa1000016
    [00:00:00.371,032] <err> os: Faulting instruction address (r15/pc): 0x0000fa9e
    [00:00:00.371,582] <err> os: >>> ZEPHYR FATAL ERROR 25: Unknown error on CPU 0
    [00:00:00.372,100] <err> os: Fault during interrupt handling

    [00:00:00.372,558] <err> os: Current thread: 0x20000800 (idle)
    [00:00:00.373,046] <err> os: ***** HARD FAULT *****
    [00:00:00.373,443] <err> os: Debug event
    [00:00:00.373,840] <err> os: r0/a1: 0x00000019 r1/a2: 0x2000b114 r2/a3: 0x00000000
    [00:00:00.374,450] <err> os: r3/a4: 0x0000f199 r12/ip: 0x00000000 r14/lr: 0x0000a91d
    [00:00:00.375,030] <err> os: xpsr: 0x01000005
    [00:00:00.375,488] <err> os: Faulting instruction address (r15/pc): 0x0000a87c
    [00:00:00.376,007] <err> os: >>> ZEPHYR FATAL ERROR 0: CPU exception on CPU 0
    [00:00:00.376,525] <err> os: Fault during interrupt handling

    [00:00:00.376,983] <err> os: Current thread: 0x20000800 (idle)

    addr2line says:

    x@y:/mnt/c/v/led_board_testing/build/zephyr$ addr2line -e zephyr.elf 0xfa9e
    C:\V\led_board_testing\build/C:/ncs/v2.6.0/zephyr/include/zephyr/sys/slist.h:213

    Here's the first second or so of 240 LEDs configured:

    [00:00:00.000,488] <dbg> clock_control: clkstarted_handle: hfclk: Clock started
    [0m<dbg> os: setup_thread_stack: stack 0x2000be80 for thread 0x200009e0: obj_size=1088 buf_start=0x2000bec0 buf_size 1024 stack_ptr=0x2000c2c0
    [00:00:00.002,410] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.002,960] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.003,570] <dbg> mpu: region_init: [2] 0x2000be80 0x150b000a
    [00:00:00.004,302] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.004,913] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.005,493] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    *** Booting nRF Connect SDK v3.5.99-ncs1 ***
    [00:00:00.006,561] <inf> BATTERY: Found device "vbatt", getting sensor data

    [00:00:00.007,110] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.007,873] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.008,422] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.009,094] <dbg> voltage: get: 854 of 4095, 750mV, voltage:12000mV
    [00:00:00.009,735] <inf> BATTERY: Battery setup: 0 12.0
    [00:00:00.010,192] <dbg> os: z_impl_k_mutex_lock: 0x200008c0 took mutex 0x200065c0, count: 1, orig prio: 0
    [00:00:00.010,955] <dbg> os: z_impl_k_mutex_unlock: mutex 0x200065c0 lock_count: 1
    [00:00:00.011,566] <dbg> os: z_impl_k_mutex_unlock: new owner of mutex 0x200065c0: (nil) (prio: -1000)
    [00:00:00.012,237] <inf> THERMISTOR: Found thermistor device "ntc-0", getting sensor data

    [00:00:00.012,786] <inf> THERMISTOR: Found thermistor device "ntc-1", getting sensor data

    [00:00:00.013,336] <inf> THERMISTOR: Found thermistor device "ntc-2", getting sensor data

    [00:00:00.013,946] <dbg> os: setup_thread_stack: stack 0x2000a840 for thread 0x20000720: obj_size=1088 buf_start=0x2000a880 buf_size 1024 stack_ptr=0x2000ac80
    [00:00:00.015,075] <dbg> os: k_sched_unlock: scheduler unlocked (0x200008c0:0)
    [00:00:00.015,655] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.016,204] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.016,784] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.017,364] <inf> BT_LED_Main: Bluetooth LED peripheral booting... cdebyte_e73_2g4m08s1ex

    [00:00:00.017,974] <inf> BT_LED_Main: Build time: May 16 2024 19:45:56

    [00:00:00.018,676] <dbg> os: z_impl_k_mutex_lock: 0x200008c0 took mutex 0x200065a8, count: 1, orig prio: 0
    [00:00:00.019,439] <dbg> os: z_impl_k_mutex_unlock: mutex 0x200065a8 lock_count: 1
    [00:00:00.020,080] <dbg> os: z_impl_k_mutex_unlock: new owner of mutex 0x200065a8: (nil) (prio: -1000)
    [00:00:00.020,751] <inf> BT_LED_Main: 5v boost power enabled.

    [00:00:00.021,179] <dbg> os: z_impl_k_mutex_lock: 0x200008c0 took mutex 0x20006590, count: 1, orig prio: 0
    [00:00:00.022,003] <dbg> os: z_impl_k_mutex_unlock: mutex 0x20006590 lock_count: 1
    [00:00:00.022,735] <dbg> os: z_impl_k_mutex_unlock: new owner of mutex 0x20006590: (nil) (prio: -1000)
    [00:00:00.023,468] <inf> BT_LED_Main: Level-shifter power enabled.

    [00:00:00.023,925] <dbg> os: z_impl_k_mutex_lock: 0x200008c0 took mutex 0x20006578, count: 1, orig prio: 0
    [00:00:00.024,688] <dbg> os: z_impl_k_mutex_unlock: mutex 0x20006578 lock_count: 1
    [00:00:00.025,299] <dbg> os: z_impl_k_mutex_unlock: new owner of mutex 0x20006578: (nil) (prio: -1000)
    [00:00:00.025,939] <inf> BT_LED_Main: LDO output 1 enabled.

    [00:00:00.026,397] <dbg> os: z_impl_k_mutex_lock: 0x200008c0 took mutex 0x20006560, count: 1, orig prio: 0
    [00:00:00.027,099] <dbg> os: z_impl_k_mutex_unlock: mutex 0x20006560 lock_count: 1
    [00:00:00.027,679] <dbg> os: z_impl_k_mutex_unlock: new owner of mutex 0x20006560: (nil) (prio: -1000)
    [00:00:00.028,350] <inf> BT_LED_Main: LDO output 2 enabled.

    [00:00:00.028,778] <dbg> os: z_impl_k_mutex_lock: 0x200008c0 took mutex 0x20006548, count: 1, orig prio: 0
    [00:00:00.029,510] <dbg> os: z_impl_k_mutex_unlock: mutex 0x20006548 lock_count: 1
    [00:00:00.030,090] <dbg> os: z_impl_k_mutex_unlock: new owner of mutex 0x20006548: (nil) (prio: -1000)
    [00:00:00.030,731] <inf> BT_LED_Main: LDO output 3 enabled.

    [00:00:00.031,188] <inf> BT_LED_Main: Twinkle config on strip 0 with a width 30 ptr (nil)
    [00:00:00.031,829] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.032,409] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.033,081] <dbg> clock_control: z_nrf_clock_calibration_done_handler: Calibration done.
    [00:00:00.033,721] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.034,423] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.035,125] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.035,736] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.036,346] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.036,956] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.037,506] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.038,055] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.038,604] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.039,154] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.039,764] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.040,374] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.040,893] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.041,473] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.042,022] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.042,572] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.043,182] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.043,792] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.044,311] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.044,891] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.045,440] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.045,989] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.046,600] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.047,180] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.047,729] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.048,309] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.048,858] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.049,407] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.050,018] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.050,598] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.051,147] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.051,727] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.052,276] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.052,795] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.053,436] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.054,016] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.054,565] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.055,145] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.055,694] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.056,213] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.056,854] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.057,434] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.057,983] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.058,563] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.059,112] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.059,631] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.060,241] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.060,852] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.061,401] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.061,950] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.062,500] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.063,049] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.063,659] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.064,270] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.064,819] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.065,368] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.065,917] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.066,467] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.067,077] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.067,687] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.068,206] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.068,786] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.069,335] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.069,885] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.070,495] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.071,075] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.071,624] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.072,204] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.072,753] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.073,303] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.073,913] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.074,493] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.075,042] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.075,622] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.076,141] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.076,690] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.077,331] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.077,911] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.078,460] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.079,040] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.079,559] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.080,108] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.080,749] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.081,329] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.081,878] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.082,458] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.082,977] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.083,526] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.084,167] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.084,747] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.085,296] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.085,876] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.086,425] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.086,944] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.087,554] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.088,165] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.088,714] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.089,294] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.089,813] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.090,362] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    ...
    [00:00:00.121,002] <err> spi_nrfx_spim: SPI0 transceive 1952 bytes
    [00:00:00.121,520] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.122,222] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x20005548/1952, rx buf/len (nil)/0
    [00:00:00.123,199] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.123,748] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.124,267] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.124,847] <dbg> os: z_impl_k_mutex_lock: 0x20000720 took mutex 0x20006608, count: 1, orig prio: 7
    [00:00:00.125,579] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.126,129] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.126,678] <dbg> mpu: region_init: [[00:00:00.127,014] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.127,532] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    2] 0x2000b4c0 0x150b000a
    [00:00:00.128,356] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.128,875] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.129,425] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.130,004] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.130,554] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.131,134] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.131,683] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.132,232] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.132,781] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.133,331] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.134,674] <err> spi_nrfx_spim: SPI1 transceive 2904 bytes
    [00:00:00.135,192] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.135,894] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x20004948/2904, rx buf/len (nil)/0
    [00:00:00.136,871] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.137,390] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.137,939] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.138,519] <dbg> os: z_impl_k_mutex_unlock: mutex 0x20006608 lock_count: 1
    [00:00:00.139,099] <dbg> os: z_impl_k_mutex_unlock: new owner of mutex 0x20006608: (nil) (prio: -1000)
    [00:00:00.139,770] <inf> THERMISTOR: Thermistor value 0: 25.510000
    [00:00:00.140,289] <dbg> os: z_impl_k_mutex_lock: 0x20000720 took mutex 0x200065f0, count: 1, orig prio: 7
    [00:00:00.141,021] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.141,571] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.142,120] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.143,829] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.144,378] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.144,927] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.145,507] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.146,087] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.146,667] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.147,186] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.147,766] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.148,315] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.148,864] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.151,489] <err> spi_nrfx_spim: SPI2 transceive 7680 bytes
    [00:00:00.152,008] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.152,709] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x200023a8/7680, rx buf/len (nil)/0
    [00:00:00.153,717] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.154,235] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.154,785] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.155,364] <dbg> os: z_impl_k_mutex_unlock: mutex 0x200065f0 lock_count: 1
    [00:00:00.155,944] <dbg> os: z_impl_k_mutex_unlock: new owner of mutex 0x200065f0: (nil) (prio: -1000)
    [00:00:00.156,616] <inf> THERMISTOR: Thermistor value 1: 27.471000
    [00:00:00.157,135] <dbg> os: z_impl_k_mutex_lock: 0x20000720 took mutex 0x200065d8, count: 1, orig prio: 7
    [00:00:00.157,867] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.158,447] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.158,996] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.159,576] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.160,095] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.160,644] <dbg> mpu: region_init: [2] 0x2000a840 0x150b000a
    [00:00:00.161,224] <dbg> os: z_impl_k_mutex_unlock: mutex 0x200065d8 lock_count: 1
    [00:00:00.161,804] <dbg> os: z_impl_k_mutex_unlock: new owner of mutex 0x200065d8: (nil) (prio: -1000)
    [00:00:00.162,475] <inf> THERMISTOR: Thermistor value 2: 29.438000
    [00:00:00.162,994] <dbg> os: z_tick_sleep: thread 0x20000720 for 32768 ticks
    [00:00:00.163,574] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.164,123] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.164,672] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.168,823] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.169,372] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.169,952] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.170,501] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.171,051] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.171,630] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.172,210] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.172,790] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.173,339] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.173,919] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.174,438] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.174,987] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.175,598] <err> spi_nrfx_spim: SPI3 transceive 32 bytes
    [00:00:00.176,116] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.176,788] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x200013a8/32, rx buf/len (nil)/0
    [00:00:00.177,825] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.178,344] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.178,924] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.179,473] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.180,023] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.180,572] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.181,121] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.181,671] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.182,250] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.182,830] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.183,410] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.183,959] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.184,539] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.185,089] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.185,638] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.186,187] <dbg> os: z_tick_sleep: thread 0x200008c0 for 525 ticks
    [00:00:00.186,798] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.187,316] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.187,866] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.202,850] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.203,399] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.203,948] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.205,047] <err> spi_nrfx_spim: SPI0 transceive 1952 bytes
    [00:00:00.205,535] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.206,237] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x20005548/1952, rx buf/len (nil)/0
    [00:00:00.207,244] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.207,794] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.208,343] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.211,059] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.211,608] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.212,188] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.212,738] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.213,287] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.213,867] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.214,416] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.214,996] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.215,545] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.216,125] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.216,674] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.217,224] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.218,597] <err> spi_nrfx_spim: SPI1 transceive 2904 bytes
    [00:00:00.219,085] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.219,787] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x20004948/2904, rx buf/len (nil)/0
    [00:00:00.220,794] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.221,343] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.221,862] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.226,470] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.227,020] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.227,600] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.228,149] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.228,698] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.229,278] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.229,858] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.230,438] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.230,957] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.231,536] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.232,086] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.232,635] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.235,260] <err> spi_nrfx_spim: SPI2 transceive 7680 bytes
    [00:00:00.235,778] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.236,450] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x200023a8/7680, rx buf/len (nil)/0
    [00:00:00.237,518] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.238,159] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.238,800] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.252,624] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.253,173] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.253,814] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.254,364] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.254,882] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.255,462] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.256,042] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.256,622] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.257,171] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.257,812] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.258,361] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.258,911] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.259,521] <err> spi_nrfx_spim: SPI3 transceive 32 bytes
    [00:00:00.260,101] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.260,833] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x200013a8/32, rx buf/len (nil)/0
    [00:00:00.261,840] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.262,390] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.263,092] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.263,824] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.264,434] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.265,014] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.265,533] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.266,082] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.266,662] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.267,242] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.267,822] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.268,371] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.269,042] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.269,561] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.270,111] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.270,690] <dbg> os: z_tick_sleep: thread 0x200008c0 for 525 ticks
    [00:00:00.271,392] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.272,033] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.272,705] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.287,475] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.288,024] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.288,574] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    ...
    [00:00:00.335,174] <err> spi_nrfx_spim: SPI0 transceive 1952 bytes
    [00:00:00.335,662] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.336,364] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x20005548/1952, rx buf/len (nil)/0
    [00:00:00.337,371] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.337,921] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.338,470] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.341,186] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.341,735] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.342,315] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.342,864] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.343,414] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.343,994] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.344,573] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.345,153] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.345,703] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.346,282] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.346,801] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.347,351] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.348,724] <err> spi_nrfx_spim: SPI1 transceive 2904 bytes
    [00:00:00.349,243] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.349,945] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x20004948/2904, rx buf/len (nil)/0
    [00:00:00.350,921] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.351,470] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.352,020] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.356,628] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.357,177] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.357,757] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.358,306] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.358,856] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.359,436] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.360,015] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.360,565] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.361,114] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.361,694] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.362,243] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.362,792] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.365,417] <err> spi_nrfx_spim: SPI2 transceive 7680 bytes
    [00:00:00.365,936] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.366,607] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x200023a8/7680, rx buf/len (nil)/0
    [00:00:00.367,614] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.368,164] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.368,713] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.382,751] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.383,270] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.383,880] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.384,429] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.384,979] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.385,528] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.386,108] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.386,688] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.387,237] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.387,817] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.388,366] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.388,916] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.389,495] <err> spi_nrfx_spim: SPI3 transceive 32 bytes
    [00:00:00.390,014] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.390,686] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x200013a8/32, rx buf/len (nil)/0
    [00:00:00.391,723] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.392,242] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.392,822] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.393,341] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.393,890] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.394,470] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.395,019] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.395,538] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.396,118] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.396,697] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.397,247] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.397,796] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.398,376] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.398,895] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.399,444] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.400,024] <dbg> os: z_tick_sleep: thread 0x200008c0 for 525 ticks
    [00:00:00.400,604] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.401,123] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.401,672] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.416,656] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.417,205] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.417,755] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.418,853] <err> spi_nrfx_spim: SPI0 transceive 1952 bytes
    [00:00:00.419,342] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.420,043] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x20005548/1952, rx buf/len (nil)/0
    [00:00:00.421,051] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.421,600] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.422,149] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.424,865] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.425,415] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.425,994] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.426,544] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.427,093] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.427,673] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.428,253] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.428,833] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.429,382] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.429,962] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.430,480] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.431,030] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.432,403] <err> spi_nrfx_spim: SPI1 transceive 2904 bytes
    [00:00:00.432,891] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.433,593] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x20004948/2904, rx buf/len (nil)/0
    [00:00:00.434,600] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.435,150] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.435,699] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.440,307] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.440,826] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.441,436] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.441,955] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.442,535] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.443,084] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.443,664] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.444,244] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.444,793] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.445,373] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.445,922] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.446,472] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.449,096] <err> spi_nrfx_spim: SPI2 transceive 7680 bytes
    [00:00:00.449,584] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.450,286] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x200023a8/7680, rx buf/len (nil)/0
    [00:00:00.451,293] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.451,843] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.452,392] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.466,430] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.466,949] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.467,559] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.468,109] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.468,658] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.469,238] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.469,787] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.470,367] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.470,916] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.471,496] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.472,045] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.472,595] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.473,175] <err> spi_nrfx_spim: SPI3 transceive 32 bytes
    [00:00:00.473,693] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.474,395] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x200013a8/32, rx buf/len (nil)/0
    [00:00:00.475,402] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.475,952] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.476,501] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.477,050] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.477,600] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.478,179] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.478,698] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.479,248] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.479,827] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.480,407] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.480,987] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.481,536] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.482,116] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.482,666] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.483,215] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.483,795] <dbg> os: z_tick_sleep: thread 0x200008c0 for 525 ticks
    [00:00:00.484,375] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.484,924] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.485,473] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.500,427] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.500,976] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.501,525] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.502,624] <err> spi_nrfx_spim: SPI0 transceive 1952 bytes
    [00:00:00.503,112] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.503,814] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x20005548/1952, rx buf/len (nil)/0
    [00:00:00.504,821] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.505,371] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.505,920] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.508,636] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.509,185] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.509,765] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.510,314] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.510,864] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.511,444] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.512,023] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.512,603] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.513,153] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.513,732] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.514,251] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.514,801] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.516,174] <err> spi_nrfx_spim: SPI1 transceive 2904 bytes
    [00:00:00.516,693] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.517,364] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x20004948/2904, rx buf/len (nil)/0
    [00:00:00.518,371] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.518,920] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.519,470] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.524,078] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.524,627] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.525,207] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.525,756] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.526,306] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.526,885] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.527,465] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.528,015] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.528,564] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.529,144] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.529,693] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.530,242] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.532,867] <err> spi_nrfx_spim: SPI2 transceive 7680 bytes
    [00:00:00.533,386] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.534,088] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x200023a8/7680, rx buf/len (nil)/0
    [00:00:00.535,064] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.535,614] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.536,163] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.550,201] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.550,750] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.551,330] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.551,879] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.552,429] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.553,009] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.553,558] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.554,138] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.554,687] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.555,267] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.555,816] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.556,365] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.556,976] <err> spi_nrfx_spim: SPI3 transceive 32 bytes
    [00:00:00.557,464] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.558,166] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x200013a8/32, rx buf/len (nil)/0
    [00:00:00.559,173] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.559,722] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.560,272] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.560,821] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.561,370] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.561,950] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.562,500] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.563,049] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.563,629] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.564,178] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.564,758] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.565,307] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.565,887] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.566,436] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.566,986] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.567,565] <dbg> os: z_tick_sleep: thread 0x200008c0 for 525 ticks
    [00:00:00.568,145] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.568,695] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.569,244] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.584,197] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.584,747] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.585,296] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.586,395] <err> spi_nrfx_spim: SPI0 transceive 1952 bytes
    [00:00:00.586,883] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.587,585] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x20005548/1952, rx buf/len (nil)/0
    [00:00:00.588,592] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.589,141] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.589,691] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.592,407] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.592,956] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.593,566] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.594,085] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.594,635] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.595,214] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.595,794] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.596,374] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.596,923] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.597,503] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.598,052] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.598,602] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.599,945] <err> spi_nrfx_spim: SPI1 transceive 2904 bytes
    [00:00:00.600,463] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.601,165] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x20004948/2904, rx buf/len (nil)/0
    [00:00:00.602,142] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.602,691] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.603,240] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.607,849] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.608,398] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.608,978] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.609,527] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.610,076] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.610,656] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.611,236] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.611,816] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.612,365] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.612,945] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.613,494] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.614,044] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.616,638] <err> spi_nrfx_spim: SPI2 transceive 7680 bytes
    [00:00:00.617,156] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.617,858] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x200023a8/7680, rx buf/len (nil)/0
    [00:00:00.618,865] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.619,384] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.619,934] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.633,972] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.634,521] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.635,101] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.635,650] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.636,199] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.636,779] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.637,359] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.637,939] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.638,488] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.639,068] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.639,617] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.640,167] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.640,747] <err> spi_nrfx_spim: SPI3 transceive 32 bytes
    [00:00:00.641,235] <dbg> spi_nrfx_spim: spi_context_buffers_setup: tx_bufs 0x2000ba10 - rx_bufs (nil) - 1
    [00:00:00.641,937] <dbg> spi_nrfx_spim: spi_context_buffers_setup: current_tx 0x2000ba18 (1), current_rx (nil) (0), tx buf/len 0x200013a8/32, rx buf/len (nil)/0
    [00:00:00.642,944] <dbg> spi_nrfx_spim: spi_context_update_tx: tx buf/len (nil)/0
    [00:00:00.643,493] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0
    [00:00:00.644,042] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.644,592] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.645,141] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.645,721] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.646,270] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.646,820] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.647,399] <dbg> os: z_tick_sleep: thread 0x200008c0 for 1 ticks
    [00:00:00.647,979] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.648,559] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.649,108] <dbg> mpu: region_init: [2] 0x2000b4c0 0x150b000a
    [00:00:00.649,688] <dbg> mpu: mpu_configure_region: Configure MPU region at index 0x2
    [00:00:00.650,207] <dbg> mpu: region_allocate_and_init: Program MPU region at index 0x2
    [00:00:00.650,756] <dbg> mpu: region_init: [2] 0x2000b640 0x150b000a
    [00:00:00.651,336] <dbg> os: z_tick_sleep: thread 0x200008c0 for 525 ticks

    ...etc. With only 240 LEDs it works.

  • Apologies, I know I'm spamming a bit, but I'm getting further, perhaps, and I'm not sure when I'll give up for the night, nor when anybody else will look, so... 

    The call stack for the fail is currently this (I still have to hit pause to retrieve it, even with the BUS FAULT already sitting in the RTT logging):

    k_sys_fatal_error_handler(unsigned int reason, const z_arch_esf_t * esf) (c:\ncs\v2.6.0\zephyr\kernel\fatal.c:41)
    <signal handler called> (Unknown Source:0)
    sys_slist_peek_next_no_check(sys_snode_t * node) (c:\ncs\v2.6.0\zephyr\include\zephyr\sys\slist.h:281)
    sys_slist_peek_next(sys_snode_t * node) (c:\ncs\v2.6.0\zephyr\include\zephyr\sys\slist.h:292)
    gpio_fire_callbacks(sys_slist_t * list, const struct device * port, uint32_t pins) (c:\ncs\v2.6.0\zephyr\include\zephyr\drivers\gpio\gpio_utils.h:91)
    nrfx_gpio_handler(nrfx_gpiote_pin_t abs_pin, nrfx_gpiote_trigger_t trigger, void * context) (c:\ncs\v2.6.0\zephyr\drivers\gpio\gpio_nrfx.c:384)
    call_handler(gpiote_control_block_t * p_cb, nrfx_gpiote_pin_t pin, nrfx_gpiote_trigger_t trigger) (c:\ncs\v2.6.0\modules\hal\nordic\nrfx\drivers\src\nrfx_gpiote.c:1414)
    next_sense_cond_call_handler(gpiote_control_block_t * p_cb, nrfx_gpiote_pin_t pin, nrfx_gpiote_trigger_t trigger, nrf_gpio_pin_sense_t sense) (c:\ncs\v2.6.0\modules\hal\nordic\nrfx\drivers\src\nrfx_gpiote.c:1451)
    port_event_handle(NRF_GPIOTE_Type * p_gpiote, gpiote_control_block_t * p_cb) (c:\ncs\v2.6.0\modules\hal\nordic\nrfx\drivers\src\nrfx_gpiote.c:1501)
    irq_handler(NRF_GPIOTE_Type * p_gpiote, gpiote_control_block_t * p_cb) (c:\ncs\v2.6.0\modules\hal\nordic\nrfx\drivers\src\nrfx_gpiote.c:1666)
    nrfx_gpiote_0_irq_handler() (c:\ncs\v2.6.0\modules\hal\nordic\nrfx\drivers\src\nrfx_gpiote.c:1674)
    nrfx_isr(const void * irq_handler) (c:\ncs\v2.6.0\zephyr\modules\hal_nordic\nrfx\nrfx_glue.c:13)
    _isr_wrapper() (c:\ncs\v2.6.0\zephyr\arch\arm\core\cortex_m\isr_wrapper.S:128)
    <signal handler called> (Unknown Source:0)
    data_out_block_mode(uint8_t * data, size_t length, void * ctx) (c:\ncs\v2.6.0\zephyr\subsys\logging\backends\log_backend_rtt.c:204)

    All crashes so far (at least tonight) are in this function used within some flavour of gpiote irq handler:

    static inline sys_snode_t *z_snode_next_peek(sys_snode_t *node)
    {
        return node->next;
    }
    For the call stack above, main()'s call stack:
    arch_swap(unsigned int key) (c:\ncs\v2.6.0\zephyr\arch\arm\core\cortex_m\swap.c:48)
    ws2812_reset_delay(uint16_t delay) (c:\ncs\v2.6.0\zephyr\drivers\led_strip\ws2812_spi.c:89)
    ws2812_strip_update_rgb(const struct device * dev, struct led_rgb * pixels, size_t num_pixels) (c:\ncs\v2.6.0\zephyr\drivers\led_strip\ws2812_spi.c:155)
    led_strip_update_rgb(size_t num_pixels, struct led_rgb * pixels, const struct device * dev) (c:\ncs\v2.6.0\zephyr\include\zephyr\drivers\led_strip.h:105)
    main() (c:\V\led_board_testing\src\main.c:1314)
    I tried turning logging off and it still all crashes. I cannot debug to that line in slist.h because putting a breakpoint there fails to even start debug. I can still add breakpoints and single-step through n cycles of SPI/LED strip updates with no crash.
  • If I run 250 LEDs, it fails.
    If I comment my code that initialises IRQs for my buttons, everything works, 240 or 250 LEDs.

    If I run 240 LEDs, everything, including my buttons, work.
    With 250 LEDs it works if I hold the button down upon boot, but dies as soon as a button IRQ arrives (edge to inactive).

    I'm so confused.

    In the hope that I've got something really stupid wrong and I'm looking past it - as opposed to memory corruption or other fun - my button initialisation is as follows (copied from the sample almost verbatim but replicated over three buttons):

    static const struct gpio_dt_spec switch_driver = GPIO_DT_SPEC_GET(DT_NODELABEL(buttondrvdoor), gpios);
    static const struct gpio_dt_spec switch_passenger = GPIO_DT_SPEC_GET(DT_NODELABEL(buttonpassdoor), gpios);
    static const struct gpio_dt_spec switch_boot = GPIO_DT_SPEC_GET(DT_NODELABEL(buttonbootlid), gpios);

    static struct gpio_callback button_drvdoor_cb_data;
    static struct gpio_callback button_passdoor_cb_data;
    static struct gpio_callback button_bootlid_cb_data;
    static inline int initialise_buttons(void) {

        if (!gpio_is_ready_dt(&switch_driver)) {
            LOG_ERR("Error: button device %s is not ready\n",
                    switch_driver.port->name);
            return -1;
        }

        if (!gpio_is_ready_dt(&switch_passenger)) {
            LOG_ERR("Error: button device %s is not ready\n",
                    switch_passenger.port->name);
            return -1;
        }

        if (!gpio_is_ready_dt(&switch_boot)) {
            LOG_ERR("Error: button device %s is not ready\n",
                    switch_boot.port->name);
            return -1;
        }

        return 0;
    }
    static void flag_status(const struct gpio_dt_spec* switch_, uint32_t identifier) {

        struct switch_event event = {.action = gpio_pin_get_dt(switch_) ? SWITCH_STATE_OPENED : SWITCH_STATE_CLOSED, .identifier = identifier};
        int qr = k_msgq_put(&switch_event_q, &event, K_NO_WAIT);
    }


    #define BUTTON_IRQ(switch_name, callback_data, fn) \
        LOG_WRN(">>>>>>>>>>>>>>>>>>> Configuring %s to %s to %s", #switch_name, #callback_data, #fn); \
        ret = gpio_pin_configure_dt(&switch_name, GPIO_INPUT);\
        if (ret != 0) {\
            LOG_ERR("Error %d: failed to configure %s pin %d\n",\
                   ret, switch_name.port->name, switch_name.pin);\
            return -1;\
        }\
        \
        ret = gpio_pin_interrupt_configure_dt(&switch_name, \
                                               GPIO_INT_EDGE_BOTH); \
        if (ret != 0) { \
                LOG_ERR("Error %d: failed to configure interrupt on %s pin %d\n", \
                        ret, switch_name.port->name, switch_name.pin); \
                return -1; \
        } \
        \
        gpio_init_callback(&callback_data, fn, BIT(switch_name.pin)); \
        gpio_add_callback(switch_name.port, &callback_data); \
        LOG_INF("Set up button at %s pin %d\n", switch_name.port->name, switch_name.pin);

    void button_drvdoor_pressed(const struct device *dev, struct gpio_callback *cb,
                        uint32_t pins)
    {
        flag_status(&switch_driver, SWITCH_ID_DRIVERSDOOR);
    }

    void button_passdoor_pressed(const struct device *dev, struct gpio_callback *cb,
                        uint32_t pins)
    {
        flag_status(&switch_passenger, SWITCH_ID_PASSENGERSDOOR);
    }

    void button_bootlid_pressed(const struct device *dev, struct gpio_callback *cb,
                        uint32_t pins)
    {
        flag_status(&switch_boot, SWITCH_ID_BOOTLID);
    }

    static inline int initialise_button_irqs(void) {
        int ret;
    // COMMENT THESE THREE NEXT LINES AND EVERYTHING WORKS IN ALL SCENARIOS:
        BUTTON_IRQ(switch_driver, button_drvdoor_cb_data, button_drvdoor_pressed)
        BUTTON_IRQ(switch_passenger, button_passdoor_cb_data, button_passdoor_pressed)
        BUTTON_IRQ(switch_boot, button_bootlid_cb_data, button_bootlid_pressed)

        return ret;
    }

    int main(void)
    {
        int ret;
       
        LOG_INF("Bluetooth LED peripheral booting... %s\n", CONFIG_BOARD);
        LOG_INF("Build time: " __DATE__ " " __TIME__ "\n");

        ret = initialise_buttons();
        ret = initialise_button_irqs();
    ... rest of LED code etc.

    Breakpoints in button_*_pressed are never hit but once I saw a call stack with button_bootlid_pressed in it.

    Giving up for the night, thanks for reading.
Reply
  • If I run 250 LEDs, it fails.
    If I comment my code that initialises IRQs for my buttons, everything works, 240 or 250 LEDs.

    If I run 240 LEDs, everything, including my buttons, work.
    With 250 LEDs it works if I hold the button down upon boot, but dies as soon as a button IRQ arrives (edge to inactive).

    I'm so confused.

    In the hope that I've got something really stupid wrong and I'm looking past it - as opposed to memory corruption or other fun - my button initialisation is as follows (copied from the sample almost verbatim but replicated over three buttons):

    static const struct gpio_dt_spec switch_driver = GPIO_DT_SPEC_GET(DT_NODELABEL(buttondrvdoor), gpios);
    static const struct gpio_dt_spec switch_passenger = GPIO_DT_SPEC_GET(DT_NODELABEL(buttonpassdoor), gpios);
    static const struct gpio_dt_spec switch_boot = GPIO_DT_SPEC_GET(DT_NODELABEL(buttonbootlid), gpios);

    static struct gpio_callback button_drvdoor_cb_data;
    static struct gpio_callback button_passdoor_cb_data;
    static struct gpio_callback button_bootlid_cb_data;
    static inline int initialise_buttons(void) {

        if (!gpio_is_ready_dt(&switch_driver)) {
            LOG_ERR("Error: button device %s is not ready\n",
                    switch_driver.port->name);
            return -1;
        }

        if (!gpio_is_ready_dt(&switch_passenger)) {
            LOG_ERR("Error: button device %s is not ready\n",
                    switch_passenger.port->name);
            return -1;
        }

        if (!gpio_is_ready_dt(&switch_boot)) {
            LOG_ERR("Error: button device %s is not ready\n",
                    switch_boot.port->name);
            return -1;
        }

        return 0;
    }
    static void flag_status(const struct gpio_dt_spec* switch_, uint32_t identifier) {

        struct switch_event event = {.action = gpio_pin_get_dt(switch_) ? SWITCH_STATE_OPENED : SWITCH_STATE_CLOSED, .identifier = identifier};
        int qr = k_msgq_put(&switch_event_q, &event, K_NO_WAIT);
    }


    #define BUTTON_IRQ(switch_name, callback_data, fn) \
        LOG_WRN(">>>>>>>>>>>>>>>>>>> Configuring %s to %s to %s", #switch_name, #callback_data, #fn); \
        ret = gpio_pin_configure_dt(&switch_name, GPIO_INPUT);\
        if (ret != 0) {\
            LOG_ERR("Error %d: failed to configure %s pin %d\n",\
                   ret, switch_name.port->name, switch_name.pin);\
            return -1;\
        }\
        \
        ret = gpio_pin_interrupt_configure_dt(&switch_name, \
                                               GPIO_INT_EDGE_BOTH); \
        if (ret != 0) { \
                LOG_ERR("Error %d: failed to configure interrupt on %s pin %d\n", \
                        ret, switch_name.port->name, switch_name.pin); \
                return -1; \
        } \
        \
        gpio_init_callback(&callback_data, fn, BIT(switch_name.pin)); \
        gpio_add_callback(switch_name.port, &callback_data); \
        LOG_INF("Set up button at %s pin %d\n", switch_name.port->name, switch_name.pin);

    void button_drvdoor_pressed(const struct device *dev, struct gpio_callback *cb,
                        uint32_t pins)
    {
        flag_status(&switch_driver, SWITCH_ID_DRIVERSDOOR);
    }

    void button_passdoor_pressed(const struct device *dev, struct gpio_callback *cb,
                        uint32_t pins)
    {
        flag_status(&switch_passenger, SWITCH_ID_PASSENGERSDOOR);
    }

    void button_bootlid_pressed(const struct device *dev, struct gpio_callback *cb,
                        uint32_t pins)
    {
        flag_status(&switch_boot, SWITCH_ID_BOOTLID);
    }

    static inline int initialise_button_irqs(void) {
        int ret;
    // COMMENT THESE THREE NEXT LINES AND EVERYTHING WORKS IN ALL SCENARIOS:
        BUTTON_IRQ(switch_driver, button_drvdoor_cb_data, button_drvdoor_pressed)
        BUTTON_IRQ(switch_passenger, button_passdoor_cb_data, button_passdoor_pressed)
        BUTTON_IRQ(switch_boot, button_bootlid_cb_data, button_bootlid_pressed)

        return ret;
    }

    int main(void)
    {
        int ret;
       
        LOG_INF("Bluetooth LED peripheral booting... %s\n", CONFIG_BOARD);
        LOG_INF("Build time: " __DATE__ " " __TIME__ "\n");

        ret = initialise_buttons();
        ret = initialise_button_irqs();
    ... rest of LED code etc.

    Breakpoints in button_*_pressed are never hit but once I saw a call stack with button_bootlid_pressed in it.

    Giving up for the night, thanks for reading.
Children
  • One more time with feeling.

    This now seems to be a problem 100% with the IRQ handling: I can reproduce a HARD FAULT merely by having buttons hooked to an IRQ.


    I have trimmed my main() code to this:

    int main(void)
    {
        int ret;
       
        LOG_INF("Bluetooth LED peripheral booting... %s\n", CONFIG_BOARD);
        LOG_INF("Build time: " __DATE__ " " __TIME__ "\n");

        ret = initialise_buttons();
        LOG_INF("Button init %d", ret);
        ret = initialise_button_irqs();
        LOG_INF("Button IRQ %d", ret);

        if (!gpio_is_ready_dt(&led_diag)) {
            LOG_ERR("Diagnostic LED failed.\n");
            return 0;
        }

        while(true) {
            ret = gpio_pin_toggle_dt(&led_diag);
            k_msleep(1000);
        }

        return 0;
    }

    With the other code previously given (IRQ handlers are currently empty).
    My device config for these buttons:

        buttons {
            compatible = "gpio-keys";
            buttondrvdoor: button_drvdoor {
                gpios = < &gpio1 4 GPIO_ACTIVE_HIGH >;
                label = "Driver Door";
                status = "okay";
            };
            buttonpassdoor: button_passdoor {
                gpios = < &gpio1 2 GPIO_ACTIVE_HIGH >;
                label = "Passenger Door";
                status = "okay";
            };  
            buttonbootlid: button_bootlid {
                gpios = < &gpio1 0 GPIO_ACTIVE_HIGH >;
                label = "Boot Lid";
                status = "okay";
            };
    }
    The code runs fine and I can hit the buttons on drvdoor and passdoor and all is fine. As soon as I release bootlid I get a HARD FAULT with the fault line being the closing } of the empty handler:

    k_sys_fatal_error_handler(unsigned int reason, const z_arch_esf_t * esf) (c:\ncs\v2.6.0\zephyr\kernel\fatal.c:41)
    <signal handler called> (Unknown Source:0)
    button_bootlid_pressed(const struct device * dev, struct gpio_callback * cb, uint32_t pins) (c:\V\led_board_testing\src\main.c:560)
    gpio_fire_callbacks(sys_slist_t * list, const struct device * port, uint32_t pins) (c:\ncs\v2.6.0\zephyr\include\zephyr\drivers\gpio\gpio_utils.h:94)
    nrfx_gpio_handler(nrfx_gpiote_pin_t abs_pin, nrfx_gpiote_trigger_t trigger, void * context) (c:\ncs\v2.6.0\zephyr\drivers\gpio\gpio_nrfx.c:384)
    call_handler(gpiote_control_block_t * p_cb, nrfx_gpiote_pin_t pin, nrfx_gpiote_trigger_t trigger) (c:\ncs\v2.6.0\modules\hal\nordic\nrfx\drivers\src\nrfx_gpiote.c:1414)
    gpiote_evt_handle(NRF_GPIOTE_Type * p_gpiote, gpiote_control_block_t * p_cb, uint32_t mask) (c:\ncs\v2.6.0\modules\hal\nordic\nrfx\drivers\src\nrfx_gpiote.c:1650)
    irq_handler(NRF_GPIOTE_Type * p_gpiote, gpiote_control_block_t * p_cb) (c:\ncs\v2.6.0\modules\hal\nordic\nrfx\drivers\src\nrfx_gpiote.c:1671)
    nrfx_gpiote_0_irq_handler() (c:\ncs\v2.6.0\modules\hal\nordic\nrfx\drivers\src\nrfx_gpiote.c:1674)
    nrfx_isr(const void * irq_handler) (c:\ncs\v2.6.0\zephyr\modules\hal_nordic\nrfx\nrfx_glue.c:13)
    _isr_wrapper() (c:\ncs\v2.6.0\zephyr\arch\arm\core\cortex_m\isr_wrapper.S:128)
    <signal handler called> (Unknown Source:0)
    idle(void * unused1, void * unused2, void * unused3) (c:\ncs\v2.6.0\zephyr\kernel\idle.c:89)
    Is there something special about pin 0 on port 1? Have I missed setup somewhere? The code is identical for all three buttons, and two work (GPIO1:2 and GPIO1:4) and one fails (GPIO1:0).
  • I now cannot reproduce it with the exact same code as above. The IRQ handlers all work now. If I revert the code back to as it was before, I'm back to fine at 240 LEDs, dead at 250 though. It's still going AWOL in the gpio IRQ handler stack when it crashes. I'll try and pull it apart bit by bit and find if it works if I pull some other code...

  • Good news on a Friday night: I have found a buffer overrun in my own (LED pixel generation) code and early indications are that this fixes my core issue.

    What I cannot understand is why the minimal code with only the button/GPIO/IRQ handler broke, because that same code now works fine, and the broken code never ran there. Is it possible that I trashed something in memory and it survived a debug restart? I wasn't turning the device off and on, just modify code, build, debug... I'm concerned there's still something wrong and it's going to bite me randomly.

  • pilux said:
    Good news on a Friday night: I have found a buffer overrun in my own (LED pixel generation) code and early indications are that this fixes my core issue.

    Great job!

    pilux said:
    Is it possible that I trashed something in memory and it survived a debug restart

    Yes, see Reset behavior. Soft resets do not reset RAM.

    pilux said:
    I'm concerned there's still something wrong and it's going to bite me randomly.

    Ah the joy of programming, to never know 100% for sure if that will happen.

    Consider adding a watchdog that will reset your device if it fails, that will usually catch the worst of issues and reset your device

    pilux said:
    I wasn't turning the device off and on, just modify code, build, debug

    It just goes to show that the age old advice " have you tried turning it off and on again" is not yet stale

Related