本文將重點解析LuatOS的內存分配機制,說明系統(tǒng)如何為代碼分配內存資源。
一、模組內存總體規(guī)劃
LuatOS將有限的物理內存進行邏輯劃分,就像把房子分成不同功能的房間。在不同的模組中RAM也不一樣,具體的分配情況也不相同。
1.1 內存邏輯劃分示例
我們以擁有8MB RAM的Air780EHM模組為例,根據(jù)實際測試結果:
I/user.mem.lua 4194296 35752 35752 -- Lua 內存:4MB 總,35KB 已用,35KB 峰值 I/user.mem.sys 3211584 102048 112264 -- 系統(tǒng)內存:約 3.06MB 總,102KB 已用,112KB 峰值
其內存分配大致如下圖表所示:

Lua內存: 4MB,占比50%;
系統(tǒng)內存(sys): 3MB,占比37.5%;
保留/隱藏區(qū)域: 1MB,占比12.5%。
這里約1MB的"隱藏"內存, 主要分配給了通信協(xié)議棧緩存、音頻處理緩沖區(qū)、Wi-Fi緩沖區(qū)(如適用)、安全引擎緩存和DMA描述符等系統(tǒng)組件。
這種分配方式體現(xiàn)了LuatOS的設計理念——**優(yōu)先保障系統(tǒng)核心功能的穩(wěn)定運行,**然后將剩余資源分配給Lua虛擬機。
1.2 Air780EHM模組的PSRAM說明
1.2.1 物理內存構成
Air780EHM使用的是EC718HM系列芯片,該系列芯片配備了物理PSRAM。
1.2.2內存區(qū)域映射
sys內存:實際在PSRAM 上,與psram是同一個東西,數(shù)據(jù)完全一樣。
Lua內存:實際在PSRAM 上,獨占一塊內存。
1.2.3 內存分配關系
Air780EHM的8MB全部位于物理PSRAM上,從用戶視角看到的sys/lua/保留區(qū)域,只是邏輯上的劃分,物理上都在PSRAM中。psram內存區(qū)域與sys內存區(qū)域在Air780EHM上是完全相同的,只是不同的命名方式。
二、內存查詢接口
在LuatOS中,rtos.meminfo() 是最核心的內存查詢接口。用于獲取不同類型內存(lua、sys、psram)的使用情況。
rtos.meminfo(type)
函數(shù)功能: 獲取LuatOS內存信息。
參數(shù)說明: type:可選參數(shù),字符串類型。可取值 “l(fā)ua”(查詢Lua虛擬機內存)、“sys”(查詢系統(tǒng)內存)、“psram”(查詢PSRAM內存);默認值為 “l(fā)ua”。
簡要示例:
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.查詢系統(tǒng)內存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
三、內存區(qū)域與物理內存關系
3.1 物理內存和邏輯內存的區(qū)分
3.1.1 物理內存類型用大寫的SRAM/PSRAM代表物理內存。
SRAM:靜態(tài)隨機存取存儲器,訪問速度快但容量較小;一定存在, 但不一定會暴露給客戶使用。
PSRAM:外接偽靜態(tài)隨機存取存儲器,訪問速度較慢但容量較大;不一定存在, 也不一定會啟用給客戶使用。
注意區(qū)分SRAM和PSRAM的差異:單從硬件上說,SRAM更快但小,PSRAM慢但更大。
3.1.2 邏輯內存類型(用戶可見) sys/psram/lua是LuatOS暴露給用戶展示的內存分配布局。
虛擬機內存(“l(fā)ua”):Lua虛擬機使用的內存區(qū)域,包括Lua腳本中的變量、函數(shù)、表、字符串等。
系統(tǒng)內存(“sys”):系統(tǒng)級內存區(qū)域,用于FreeRTOS任務棧、驅動緩沖區(qū)等。
psram內存(“psram”):專門管理的PSRAM區(qū)域,用于大容量數(shù)據(jù)緩存。
3.2 不同平臺的差異
邏輯內存與物理內存的對應關系因平臺而異,不同模組的差異如下:

不同 LuatOS 硬件平臺在內存布局上存在差異,Lua 運行內存、系統(tǒng)內存與 PSRAM 擴展內存的分配方式各有區(qū)別。部分型號將系統(tǒng)與腳本內存統(tǒng)一放在 PSRAM 中,部分則采用 SRAM 運行系統(tǒng)、PSRAM 承載腳本的分離架構,以適配不同功耗與性能需求。
以上就是LuatOS內存分配機制的核心內容,現(xiàn)在再回頭看那位社群朋友的疑問:“AirUI這么流暢,會不會很吃內存?”相信你已經(jīng)有了答案——只要內存分得巧,流暢和省內存,從來不是矛盾。
后續(xù)我們將針對Lua垃圾回收(GC)的內部工作原理,以及Zbuff、UART、MQTT等核心功能的內存使用分析,手把手教你排查內存泄漏。
-
物聯(lián)網(wǎng)
+關注
關注
2950文章
48091瀏覽量
417955 -
嵌入式開發(fā)
+關注
關注
18文章
1167瀏覽量
50209 -
Lua
+關注
關注
0文章
90瀏覽量
11506 -
LuatOS
+關注
關注
0文章
169瀏覽量
2743
發(fā)布評論請先 登錄
cc2530網(wǎng)絡地址分配機制是什么樣的?
Linux內存管理中的Slab分配機制
WCDMA中的鑒權和密鑰分配機制
Snort匹配機制的改進
用戶可靠性的眾包系統(tǒng)任務分配機制
基于IPv6的DiffServ流標簽分配機制
基于分簇的資源分配機制
基于Linux內存管理與Android內存分配機制
一種基于信任的物聯(lián)網(wǎng)頻譜資源分配機制
基于拓撲結構與分配機制的PoW共識機制
jemalloc分配機制的介紹及其優(yōu)化實踐
Linux內核中的頁面分配機制
LuatOS的內存分配機制
評論