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

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

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