2024年10月10日 星期四

MicroPython 學習筆記 : ESP8266 載入 xtools 出現 MemoryError 問題

今天台灣國慶日放假一天, 我從昨晚開始到今天早上都在整理零件庫, 盤點這些年來不斷購買的零組件, 發現買了很多 ESP8266 開發板 (主要是 Wemos D1 mini 與 Witty Cloud), 這實在是失算, 因為 ESP8266 的 RAM 只有 160KB, 扣掉 MicroPython 系統與 TCP/IP 協議堆疊, 大約只剩下 50KB 可以給應用程式使用, 難怪載入 xtools 函式庫時會出現 MemoryError 錯誤, 因為 xtools 站了 13KB 左右, 下面是 D1 mini 上開機後載入 xtools 就報錯 : 

MicroPython v1.21.0 on 2023-10-05; ESP module with ESP8266
Type "help()" for more information.

>>> import xtools   
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError: memory allocation failed, allocating 468 bytes

如果是在 ESP32 開發板就不會有這種情形, 因為 ESP32 擁有 520KB 的 RAM, 扣掉系統與堆疊至少還有 320KB 給應用程式, 是 ESP8266 的 6 倍以上, 有較充裕的記憶體空間用來執行較複雜的運算. 

所以在 ESP8266 開發板上用 xtools 寫應用程式不要用 import xtools 匯入整個模組, 因為那些用不到的函式會佔用 RAM 空間; 而是要用 from xtools import 語法只匯入接下來會用到的函式, 用完就以 del 指令刪除, 而且不使用 config.py 儲存帳密金鑰, 而是直接傳入參數. 

MicroPython v1.21.0 on 2023-10-05; ESP module with ESP8266
Type "help()" for more information.

>>> from xtools import connect_wifi  
>>> connect_wifi('ASUS-RT-AX3000', '123456')    
network config: ('192.168.50.89', '255.255.255.0', '192.168.50.1', '192.168.50.1')
'192.168.50.89'
>>> del connect_wifi      # 用完就刪除
>>> from xtools import tw_now     
>>> tw_now()  
Querying NTP server and set RTC time ... OK.
'2024-10-10 19:12:37'
>>> del tw_now      

但即使這麼做, 對於消耗記憶體較多的 line_msg() 就沒轍了, 會發生記憶體溢位導致系統重開機 :

>>> from xtools import line_msg    
>>> line_msg('<YOUR LINE TOKEN>', 'test')     

 ets Jan  8 2013,rst cause:2, boot mode:(3,7)

load 0x40100000, len 31168, room 16 
tail 0
chksum 0x9f
load 0x3ffe8000, len 1060, room 8 
tail 12
chksum 0xd2
ho 0 tail 12 room 4
load 0x3ffe8430, len 1124, room 12 
tail 8
chksum 0x95
csum 0x95
����o�{��o|� d ldl`c� �|;�l�'� �'�

MicroPython v1.21.0 on 2023-10-05; ESP module with ESP8266
Type "help()" for more information.

>>> 

這就是為什麼應該買 ESP32 而非 ESP8266 的原因. 

沒有留言 :