_lv_inv_area: Asserted at expression: !disp->rendering_in_progress (Invalidate area is not allowed during rendering.) lv_refr.c:257

Right, I don’t quite understand how lvgl works. I’m still trying to figure that out. A walkthrough explaining not only the “what”, but also the “why” and “how” of the basic workings of lvgl would be really nice, but I haven’t found that so far.

Do you mean the timer handler? I asked about this here, but nobody has responded so far: Lv_timer_handler - What does “lower priority than lv_tick_inc()” mean? - Get started - LVGL Forum

Do you have a link to the thread safety documentation?