问题现象

在 ESP32-S3 上使用 LVGL 9.5.0 的 Lottie 控件播放动画。动画对象能够创建成功,也能正常显示前几帧,但随后系统崩溃:

Guru Meditation Error: Core 1 panic'ed (LoadProhibited).
Exception was unhandled.

PC      : 0x4206032c
EXCCAUSE: 0x0000001c
EXCVADDR: 0x00000008

Backtrace:
0x42060329:0x3fccb0a0
0x42061d95:0x3fccf780
0x4205ed51:0x3fccf890
0x420636d5:0x3fccf8e0
0x42063705:0x3fccf920
0x420ac305:0x3fccf940
0x42007458:0x3fccf970

根因

根因是 ThorVG 异步工作线程的 pthread 栈过小

Lottie 动画播放到需要更新复杂描边的帧时,ThorVG 工作线程进入 rleRender()。该函数在栈上分配约 16 KB 的渲染池,而sdkconfig中默认pthread线程总栈空间只有 3 KB,导致线程栈越界并破坏相邻内存。

解决方法

1.修改sdkconfig

通过 idf.py menuconfig 修改:

Component config
  -> PThreads
    -> Default task stack size

设置为:

CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=32768

这种方式会影响所有使用默认属性创建的 pthread,而且默认栈通常从内部 RAM 分配。两个 ThorVG 工作线程就会消耗约 64 KB 内部 RAM,因此资源受限时更推荐代码修改,指定外部psram。

2.通过代码增加栈空间

lv_init() 之前,将后续创建的 pthread 栈提高到至少 32 KB。

#include "esp_heap_caps.h"
#include "esp_pthread.h"

static esp_err_t configure_thorvg_pthread(void)
{
    esp_pthread_cfg_t cfg = esp_pthread_get_default_config();
    cfg.stack_size = 32 * 1024;
    cfg.stack_alloc_caps = MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT;

    return esp_pthread_set_cfg(&cfg);
}

更多推荐