如题,在D13CBS上使用最新Luban-Lite SDK 采用LVGL移植了中文输入法,使用Freetype显示汉字有如下问题:
1、显示同一批汉字时,占用内存没有增加
2、显示不同汉字时,占用内存会一直增加
以上内存状态是通过free指令查询heap sys的值。
也曾开启了FreeType配置选项下使用PSRAM SW的内存,但是依然没有解决这个,
请问这个是不是LVGL的FreeType Cache一直在吃内存,且没有释放?
离线
1. 在LVGL V9中可以在 lv_conf.h中配置字体缓存的个数
2. 在LVGL V8中也可以在 lv_conf.h中配置字体缓存的size
3. 可以通过调整 freetype的缓存配置参数,来调整最大的缓存占用量,目前只能设置缓存的上限,不能自己去释放缓存空间
4. 目前lvgl自身的运行也会从sys heap中申请内存,freetype也会从 sys heap中申请内存,可以调整LVGL用自身的堆管理(预留一块静态数据块),不用sys heap,为 freetype流出更多内存使用,在 LVGL V9中lv_conf.h添加如下配置,示例中是预留了1MB的空间,可以根据实际需要调整
离线
修改为使用LVGL 的内部MEM,可以避免系统的heap内存占用增加。
但是目前遇到一个另外一个问题,当多次显示汉字之后,Freetype会报读取字库。换了字库文件依然存在,错误信息如下:
kernel\rt-thread\components\dfs\filesystems\elmfat\dfs_elm.c dfs_elm_read rc:2
kernel\rt-thread\components\dfs\src\dfs_file.c dfs_file_read rc:-5 name:/lvgl_data/fonts/test.ttf
elm
FT_Stream_EnterFrame: invalid read; expected 120 bytes, got 0
[Error] (34.506, +33) freetype_glyph_create_cb: FT_Load_Glyph error(0x55) lv_freetype_glyph.c:138
[Error] (34.515, +9) freetype_get_glyph_dsc_cb: glyph lookup failed for unicode = 0x4f2f lv_freetype_glyph.c:104
kernel\rt-thread\components\dfs\filesystems\elmfat\dfs_elm.c dfs_elm_read rc:2
kernel\rt-thread\components\dfs\src\dfs_file.c dfs_file_read rc:-5 name:/lvgl_data/fonts/test.ttf
elm
FT_Stream_EnterFrame: invalid read; expected 84 bytes, got 0
[Error] (34.680, +165) freetype_image_create_cb: FT_Load_Glyph error(0x55) lv_freetype_image.c:130
[Error] (34.689, +9) lv_cache_entry_get_data: Asserted at expression: entry != NULL (NULL pointer) lv_cache_entry.c:94
CPU Exception: NO.5
x1: 4013e670 x2: 300762c0 x3: 401f0c78 x4: deadbeef
x5: 4005e2e4 x6: 0000a000 x7: 00018937 x8: 00000000
x9: 3007636c x10: ffffffff x11: 0000000a x12: 00000001
x13: 18710000 x14: 00000000 x15: 00000000 x16: 00000000
x17: 30076164 x18: 0000767d x19: 000000ca x20: 0000ffff
x21: 00000003 x22: 00000003 x23: 0000767d x24: 00000018
x25: 40215ba4 x26: 4023764c x27: 402376a4 x28: fffffffd
x29: 40058568 x30: 00000000 x31: 00000000
mcause : 0x38000005
mtval : 0x00000008
mepc : 0x401500f2
mstatus: 0x80007880
跟踪分析:
看报错信息,是打开FatFS的文件系统读取文件时 dfs_elm_read -> f_read 接口返回2 FR_INT_ERR
字库信息:
目前的字库都是8M以上存在SPI NAND中
我也尝试将LVGL的线程栈空间加到120KB,依然没有改善
这种是不是因为字库文件太大导致还是和内存相关? 麻烦大神帮忙分析下
离线
@skyfy
通过继续分析,最终是在f_lseek这个函数中,这个位置返回
if (clst <= 1 || clst >= fs->n_fatent) ABORT(fs, FR_INT_ERR);
离线
@AICxia
能否帮忙分析下,是什么原因会导致读取文件失败
离线