ESP32-S3 N16R8 的開發板搭載有 16MB 的 flash 和 8MB 的 psram, 不過如果你使用 MicroPython 網站上的 bin 檔, 會得到以下的結果:
>>> import esp
>>> esp.flash_size()
8388608
>>> import micropython
>>> micropython.mem_info()
stack: 736 out of 15360
GC: total: 64000, used: 16096, free: 47904, max new split: 188416
No. of 1-blocks: 346, 2-blocks: 41, max blk sz: 32, max free sz: 2982
>>> import gc
>>> gc.mem_alloc() + gc.mem_free()
252416
>>>
flash 只有 8MB, 而載入系統後記憶體看起來只有 252KB, 那我的 psram 跑哪裡去了?
解放 psram
這是因為韌體檔有分兩個版本:
如果改用支援 8 線 SPI ram 版本的韌體, 得到的結果如下:
>>> import esp
>>> esp.flash_size()
8388608
>>> import micropython
>>> micropython.mem_info()
stack: 736 out of 15360
GC: total: 64000, used: 15440, free: 48560, max new split: 8257536
No. of 1-blocks: 340, 2-blocks: 40, max blk sz: 32, max free sz: 3023
>>> import gc
>>> gc.mem_alloc() + gc.mem_free()
8321536
可以看到雖然 flash 還是只有 8MB, 但是可用的記憶體已經暴增到接近 8MB 了, 這表示 psram 已經啟用了。
解放 flash
最後要再找回來的就是少掉的 8MB flash, 這主要是因為原本的韌體就是被編譯成 8MB 的空間, 必須要把韌體重新延伸為 16MB, 還好, 已經有善心人心幫我們使用 Python 做好了工具--mp-image-tool-esp32, 安裝方式如下:
-
從 github 上複製專案:
git clone https://github.com/glenn20/mp-image-tool-esp32 cd mp-image-tool-esp32
-
安裝相依的套件:
pip install -r requirements.txt
利用以下的指令就可以把韌體檔案變成 16MB 空間的大小:
python .\mp-image-tool-esp32 -f 16M ..\..\firmware\ESP32_GENERIC_S3-SPIRAM_OCT-20240222-v1.22.2.bin
選項 -f
就是用來指定韌體大小, 它會產生一個和原始韌體檔案同名但加上 "-16MB" 的檔案, 使用這個韌體檔就可以把 16MB 的 flash 通通解放了:
>>> import esp
>>> esp.flash_size()
16777216
>>> import micropython
>>> micropython.mem_info()
stack: 736 out of 15360
GC: total: 64000, used: 15440, free: 48560, max new split: 8257536
No. of 1-blocks: 340, 2-blocks: 40, max blk sz: 32, max free sz: 3023
>>> import gc
>>> gc.mem_alloc() + gc.mem_free()
8321536
不論是 flash 還是 psram, 通通都到位了。
Top comments (0)