ESP32-S3 使用 LVGL 播放 Lottie 数帧后崩溃
·
问题现象
在 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);
}
更多推荐


所有评论(0)