LuatOS 内存分配:流畅运行靠的是巧秒规划#lua内存读写 ypxx.net

很多刚接触 LuatOS 的朋友都会好奇,AirUI 界面流畅、应用又多,运行起来是不是特别占内存?其实答案很简单,比起把代码写得天花乱坠,把内存 “分好房间” 才是关键。

一、模组内存总体规划

LuatOS将有限的物理内存进行逻辑划分,就像把房子分成不同功能的房间。在不同的模组中 RAM也不一样,具体的分配情况也不相同。

1.1 内存逻辑划分示例

我们以拥有8MB RAM的Air780EHM模组为例,根据实际测试结果:

其内存分配大致如下图表所示:

  • 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”。

简要示例:

三、内存区域与物理内存关系

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 虚拟机、系统内存还是保留区域,各司其职又互不打扰,设备自然能流畅又省内存。下次再担心内存不够用,不妨先看看是不是 “房间” 没分对。

今天的内容就先分享到这里