本文将重点解析LuatOS的内存分配机制,说明系统如何为代码分配内存资源。
一、模组内存总体规划
LuatOS将有限的物理内存进行逻辑划分,就像把房子分成不同功能的房间。在不同的模组中RAM也不一样,具体的分配情况也不相同。
1.1 内存逻辑划分示例
我们以拥有8MB RAM的Air780EHM模组为例,根据实际测试结果:
I/user.mem.lua 4194296 35752 35752 -- Lua 内存:4MB 总,35KB 已用,35KB 峰值 I/user.mem.sys 3211584 102048 112264 -- 系统内存:约 3.06MB 总,102KB 已用,112KB 峰值
其内存分配大致如下图表所示:

Lua内存: 4MB,占比50%;
系统内存(sys): 3MB,占比37.5%;
保留/隐藏区域: 1MB,占比12.5%。
这里约1MB的"隐藏"内存, 主要分配给了通信协议栈缓存、音频处理缓冲区、Wi-Fi缓冲区(如适用)、安全引擎缓存和DMA描述符等系统组件。
这种分配方式体现了LuatOS的设计理念——**优先保障系统核心功能的稳定运行,**然后将剩余资源分配给Lua虚拟机。
1.2 Air780EHM模组的PSRAM说明
1.2.1 物理内存构成
Air780EHM使用的是EC718HM系列芯片,该系列芯片配备了物理PSRAM。
1.2.2内存区域映射
sys内存:实际在PSRAM 上,与psram是同一个东西,数据完全一样。
Lua内存:实际在PSRAM 上,独占一块内存。
1.2.3 内存分配关系
Air780EHM的8MB全部位于物理PSRAM上,从用户视角看到的sys/lua/保留区域,只是逻辑上的划分,物理上都在PSRAM中。psram内存区域与sys内存区域在Air780EHM上是完全相同的,只是不同的命名方式。
二、内存查询接口
在LuatOS中,rtos.meminfo() 是最核心的内存查询接口。用于获取不同类型内存(lua、sys、psram)的使用情况。
rtos.meminfo(type)
函数功能: 获取LuatOS内存信息。
参数说明: type:可选参数,字符串类型。可取值 “lua”(查询Lua虚拟机内存)、“sys”(查询系统内存)、“psram”(查询PSRAM内存);默认值为 “lua”。
简要示例:
1--rtos.meminfo()接口使用示例 2 3--查询 Lua 虚拟机内存(默认)3-- 4 local total_lua, used_lua, max_used_lua = rtos.meminfo("lua") 5 log.info("Lua Memory:" 6 "Total:",total_lua / 1024, 7 "Used:", used_lua / 1024, "KB" 8 "Peak:",max_used_lua / 1024, "KB") 9 -- 2.查询系统内存10 11 local total_sys, used_sys, max_used_sys = rtos.meminfo("sys") 12 log.info ("System Memory:" 13 "Total:",total_sys / 1024,"KB" 14 "Used:", used_sys / 1024, "KB" 15 "Peak:", max_used_sys / 1024, "KB") 16 17--3.查询PSRAM 内存(如果支持) 18 local total_psram, used_psram, max_used_psram= rtos.meminfo("psram") 19 if total_psram and total_psram > 0 then 20 log. info ("PSRAM Memory:" 21"Total:", total_psram / 1024, "KB", 22 "Used:", used_psram / 1024, "KB" 23 "Peak:", max_used_psram / 1024, "KB") 24 end
三、内存区域与物理内存关系
3.1 物理内存和逻辑内存的区分
3.1.1 物理内存类型用大写的SRAM/PSRAM代表物理内存。
SRAM:静态随机存取存储器,访问速度快但容量较小;一定存在, 但不一定会暴露给客户使用。
PSRAM:外接伪静态随机存取存储器,访问速度较慢但容量较大;不一定存在, 也不一定会启用给客户使用。
注意区分SRAM和PSRAM的差异:单从硬件上说,SRAM更快但小,PSRAM慢但更大。
3.1.2 逻辑内存类型(用户可见) sys/psram/lua是LuatOS暴露给用户展示的内存分配布局。
虚拟机内存(“lua”):Lua虚拟机使用的内存区域,包括Lua脚本中的变量、函数、表、字符串等。
系统内存(“sys”):系统级内存区域,用于FreeRTOS任务栈、驱动缓冲区等。
psram内存(“psram”):专门管理的PSRAM区域,用于大容量数据缓存。
3.2 不同平台的差异
逻辑内存与物理内存的对应关系因平台而异,不同模组的差异如下:

不同 LuatOS 硬件平台在内存布局上存在差异,Lua 运行内存、系统内存与 PSRAM 扩展内存的分配方式各有区别。部分型号将系统与脚本内存统一放在 PSRAM 中,部分则采用 SRAM 运行系统、PSRAM 承载脚本的分离架构,以适配不同功耗与性能需求。
以上就是LuatOS内存分配机制的核心内容,现在再回头看那位社群朋友的疑问:“AirUI这么流畅,会不会很吃内存?”相信你已经有了答案——只要内存分得巧,流畅和省内存,从来不是矛盾。
后续我们将针对Lua垃圾回收(GC)的内部工作原理,以及Zbuff、UART、MQTT等核心功能的内存使用分析,手把手教你排查内存泄漏。
-
物联网
+关注
关注
2950文章
48101浏览量
418102 -
嵌入式开发
+关注
关注
18文章
1167浏览量
50212 -
Lua
+关注
关注
0文章
90浏览量
11507 -
LuatOS
+关注
关注
0文章
169浏览量
2745
发布评论请先 登录
cc2530网络地址分配机制是什么样的?
Linux内存管理中的Slab分配机制
WCDMA中的鉴权和密钥分配机制
Snort匹配机制的改进
用户可靠性的众包系统任务分配机制
基于IPv6的DiffServ流标签分配机制
基于分簇的资源分配机制
基于Linux内存管理与Android内存分配机制
一种基于信任的物联网频谱资源分配机制
基于拓扑结构与分配机制的PoW共识机制
jemalloc分配机制的介绍及其优化实践
Linux内核中的页面分配机制
LuatOS的内存分配机制
评论