[其他ST产品] freertos和lvgl内存分配问

[复制链接]
 楼主| elephant00 发表于 2025-1-10 12:22 | 显示全部楼层 |阅读模式
大佬们,再问个问题,freertos申请了一块内存,用于创建任务,其中有一个任务是lvgl的显示任务,在这个lvgl显示任务中,我创建了一些控件对象,这个用的是哪里的内存呢?是用的freertos申请的内存,还是lvgl自己申请的内存 #define LV_MEM_SIZE (20U * 1024U)。单片机总共64k的RAM,我给freertos分配20k,lvgl也分配20k,剩余是不是24k?创建lvgl对象是,用的是这剩作的24k内存,还是用的分配给lvgl的20k内存?还是说用的freertos的20k内存?我试了一下,把freertos的内存设大一些,编译后RAM消耗就会增加,但是把lvgl的内存设置大一些,编译后内存消耗没变化。所以想着lvgl用的是不是freertos申请的内存空间。
失物招領 发表于 2025-2-11 01:14 | 显示全部楼层
FreeRTOS通过pvPortMalloc申请内存,用于任务栈、队列等。你提到的20KB内存是FreeRTOS管理的堆内存

她已醉 发表于 2025-2-11 02:35 | 显示全部楼层
LVGL通过LV_MEM_SIZE定义的内存池(20KB)分配内存,用于控件、样式等对象。如果未定义LV_MEM_CUSTOMLVGL会使用自己的内存池

将爱藏于深海 发表于 2025-2-11 03:34 | 显示全部楼层
FreeRTOS任务栈,创建任务时,FreeRTOS20KB堆中分配栈空间

温室雏菊 发表于 2025-2-11 04:25 | 显示全部楼层
LVGL控件对象从20KB内存池中分配

春日负喧 发表于 2025-2-11 05:39 | 显示全部楼层
64KB RAM中,FreeRTOSLVGL各占20KB,理论上剩余24KB,但实际剩余可能更少,因为全局变量、栈等也会占用内存

故意相遇 发表于 2025-2-11 06:36 | 显示全部楼层
增大FreeRTOS堆内存会增加编译后的RAM消耗,因为FreeRTOS管理的堆内存变大

白马过平川 发表于 2025-2-11 07:37 | 显示全部楼层
增大LV_MEM_SIZE不会显著增加编译后的RAM消耗,因为LVGL的内存池在运行时分配,编译时仅预留空间

公羊子丹 发表于 2025-2-11 08:15 | 显示全部楼层
你这个问题很关键,LVGL对象默认是用它自己定义的内存池,也就是你配置的 LV_MEM_SIZE 对应的那块内存区域。FreeRTOS的任务栈和堆通常不会直接影响LVGL。
周半梅 发表于 2025-2-11 08:17 | 显示全部楼层
你把FreeRTOS的堆设置大一些编译占用增加,可能是因为编译器统计了任务栈的总大小;LVGL的内存管理更像是动态分配,只有运行时才真正用到那块 LV_MEM_SIZE 的内存。
帛灿灿 发表于 2025-2-11 08:18 | 显示全部楼层
如果你用的是 lv_mem_alloc 创建控件,那就是用的 LV_MEM_SIZE 分配的内存;FreeRTOS的内存一般是任务堆栈或者队列使用的,与LVGL没有直接关系。
童雨竹 发表于 2025-2-11 08:19 | 显示全部楼层
LVGL默认有自己的内存管理器,除非你把 LV_USE_CUSTOM_MEM_ALLOC 打开,让它用FreeRTOS的 pvPortMalloc 等函数,否则它不会直接用FreeRTOS的内存池。
万图 发表于 2025-2-11 08:20 | 显示全部楼层
你可以检查一下 lv_conf.h,看看 LV_MEM_CUSTOM 是否被定义为1。如果没有,那就是用的 LV_MEM_SIZE 的内存池。
Wordsworth 发表于 2025-2-11 08:21 | 显示全部楼层
你配置的RAM总分配是64K,给FreeRTOS 20K、LVGL 20K,理论上剩下的24K包括中断服务、栈空间以及全局变量等的内存使用,实际上不会完全剩下24K可用。
Bblythe 发表于 2025-2-11 08:22 | 显示全部楼层
既然你把FreeRTOS的堆调大后RAM消耗增加,这说明FreeRTOS任务栈和LVGL内存池是分开的,不是共用同一块内存。
Pulitzer 发表于 2025-2-11 08:24 | 显示全部楼层
如果你发现LVGL内存不足,可以考虑用FreeRTOS的 pvPortMalloc 替代LVGL的内存分配函数,这样可能更高效一些,但需要在配置里启用 LV_MEM_CUSTOM。
Uriah 发表于 2025-2-11 08:25 | 显示全部楼层
你试试 lv_mem_monitor() 看一下当前内存池的使用情况,这个可以帮助你判断LVGL的内存池到底有多少可用。
Clyde011 发表于 2025-2-11 08:26 | 显示全部楼层
要注意RAM的编译占用和运行时分配是不一样的,编译阶段统计的内存分配不会直接反映LVGL的动态内存消耗。
捧一束彼岸花 发表于 2025-2-11 08:29 | 显示全部楼层
LVGL对象使用的是LV_MEM_SIZE定义的20KB内存池,而不是FreeRTOS的堆内存

西洲 发表于 2025-2-11 09:25 | 显示全部楼层
FreeRTOS内存:用于任务栈、队列等。LVGL内存:用于控件、样式等对象。剩余内存:理论上24KB,但实际可能更少

您需要登录后才可以回帖 登录 | 注册

本版积分规则

1030

主题

3864

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部