打印
[其他ST产品]

freertos和lvgl内存分配问

[复制链接]
374|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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堆中分配栈空间

使用特权

评论回复
5
温室雏菊| | 2025-2-11 04:25 | 只看该作者
LVGL控件对象从20KB内存池中分配

使用特权

评论回复
6
春日负喧| | 2025-2-11 05:39 | 只看该作者
64KB RAM中,FreeRTOSLVGL各占20KB,理论上剩余24KB,但实际剩余可能更少,因为全局变量、栈等也会占用内存

使用特权

评论回复
7
故意相遇| | 2025-2-11 06:36 | 只看该作者
增大FreeRTOS堆内存会增加编译后的RAM消耗,因为FreeRTOS管理的堆内存变大

使用特权

评论回复
8
白马过平川| | 2025-2-11 07:37 | 只看该作者
增大LV_MEM_SIZE不会显著增加编译后的RAM消耗,因为LVGL的内存池在运行时分配,编译时仅预留空间

使用特权

评论回复
9
公羊子丹| | 2025-2-11 08:15 | 只看该作者
你这个问题很关键,LVGL对象默认是用它自己定义的内存池,也就是你配置的 LV_MEM_SIZE 对应的那块内存区域。FreeRTOS的任务栈和堆通常不会直接影响LVGL。

使用特权

评论回复
10
周半梅| | 2025-2-11 08:17 | 只看该作者
你把FreeRTOS的堆设置大一些编译占用增加,可能是因为编译器统计了任务栈的总大小;LVGL的内存管理更像是动态分配,只有运行时才真正用到那块 LV_MEM_SIZE 的内存。

使用特权

评论回复
11
帛灿灿| | 2025-2-11 08:18 | 只看该作者
如果你用的是 lv_mem_alloc 创建控件,那就是用的 LV_MEM_SIZE 分配的内存;FreeRTOS的内存一般是任务堆栈或者队列使用的,与LVGL没有直接关系。

使用特权

评论回复
12
童雨竹| | 2025-2-11 08:19 | 只看该作者
LVGL默认有自己的内存管理器,除非你把 LV_USE_CUSTOM_MEM_ALLOC 打开,让它用FreeRTOS的 pvPortMalloc 等函数,否则它不会直接用FreeRTOS的内存池。

使用特权

评论回复
13
万图| | 2025-2-11 08:20 | 只看该作者
你可以检查一下 lv_conf.h,看看 LV_MEM_CUSTOM 是否被定义为1。如果没有,那就是用的 LV_MEM_SIZE 的内存池。

使用特权

评论回复
14
Wordsworth| | 2025-2-11 08:21 | 只看该作者
你配置的RAM总分配是64K,给FreeRTOS 20K、LVGL 20K,理论上剩下的24K包括中断服务、栈空间以及全局变量等的内存使用,实际上不会完全剩下24K可用。

使用特权

评论回复
15
Bblythe| | 2025-2-11 08:22 | 只看该作者
既然你把FreeRTOS的堆调大后RAM消耗增加,这说明FreeRTOS任务栈和LVGL内存池是分开的,不是共用同一块内存。

使用特权

评论回复
16
Pulitzer| | 2025-2-11 08:24 | 只看该作者
如果你发现LVGL内存不足,可以考虑用FreeRTOS的 pvPortMalloc 替代LVGL的内存分配函数,这样可能更高效一些,但需要在配置里启用 LV_MEM_CUSTOM。

使用特权

评论回复
17
Uriah| | 2025-2-11 08:25 | 只看该作者
你试试 lv_mem_monitor() 看一下当前内存池的使用情况,这个可以帮助你判断LVGL的内存池到底有多少可用。

使用特权

评论回复
18
Clyde011| | 2025-2-11 08:26 | 只看该作者
要注意RAM的编译占用和运行时分配是不一样的,编译阶段统计的内存分配不会直接反映LVGL的动态内存消耗。

使用特权

评论回复
19
捧一束彼岸花| | 2025-2-11 08:29 | 只看该作者
LVGL对象使用的是LV_MEM_SIZE定义的20KB内存池,而不是FreeRTOS的堆内存

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1009

主题

3401

帖子

7

粉丝