手上有塊基於ESP8266的NodeMCU板子,沒錯,就是那個10塊錢的帶WIFI的芯片,當時感覺又便宜又又有wifi,並且可以用腳本lua寫代碼,果斷買買買,然后玩了一下WIFI跟樹莓派通訊(樹莓派開Http Server,然后用lua通過socket模擬http指令定期獲取樹莓派的指令)。控制了個繼電器加燈泡玩了玩,手頭上的dht11也能直接讀出來(nodemcu內置驅動了),然后就沒有然后了,感覺lua不是我的菜,用慣了python,寫lua還是十分別扭的.嗯對lua的吐槽開始:
1.沒有高層次的封裝,缺少輪子,雖然有cjson,socket等可用,然而沒有httpclient之類更高層次的封裝,搞個rest 請求還得自己寫http頭,雖然也不麻煩,然而用慣了urllib的python用戶自然不是很爽。lua本身是作為C的嵌語言設計的,所以基本庫太有限,雖然網上配合lua的C庫眾多,然而想搞進nodemcu的固件里,我這半吊子水平還是有難度的,一句話就是nodemcu提供的功能,可以很好的搞,沒提供的功能干瞪眼。
2.一些語法上的吐槽,比如默認全局變量,局部變量要加local之類的,年代久遠,記不清了總之用慣了python習慣了優雅的設計,就不習慣丑陋了(引戰了引戰了)
3.固件開發不活躍,現在github上的代碼基本都是幾年前的了,雖然最新的2.1.0發布於2017年8月,看看changelog,其實就是一個18B20驅動的重寫,沒有什么大改進。這也是國人類似項目的一貫作風:為了賣板子然后找個大神移植下固件,然后能把東西賣出去就OK了,至於固件的演進,看大神的的心情了……
4.nodemcu只能用在esp8266上,當然esp32也可以跑了,然而也就這樣了,參照上邊那條,開發不活躍啊,不像micropython或者espruino(一個跑在單片機的javascript固件),官方就支持好多的MCU
所以后來有了Arduino for ESP8266,就用Arduino IDE耍去了,那個支持的MCU多(lll¬ω¬),以前其實也知道有MicroPython,但大神說因為8266資源有限,被裁減的太厲害(其實當然完全不是那么回事)啥也干不了,不如等ESP32(然后我就真等ESP32了)。
經過漫長的等待,ESP32的板子終於價格降到心理價位,然后果斷入坑,當然是刷MicroPython了,然后為了對比,順便把手上的8266也刷上了MicroPython固件,搞起來,先看可用內存:
ESP8266:
>>> micropython.mem_info()
stack: 2112 out of 8192
GC: total: 35968, used: 9376, free: 26592
No. of 1-blocks: 50, 2-blocks: 10, max blk sz: 264, max free sz: 1261
嗯,8K的的棧,36K的堆確實小了些,然而……esp32也好不到哪兒去
>>> micropython.mem_info()
stack: 736 out of 15360
GC: total: 111168, used: 6864, free: 104304
No. of 1-blocks: 26, 2-blocks: 8, max blk sz: 264, max free sz: 6402
納尼?說好的400+Kb的內存呢,怎么只有110K左右?(雖然比8266是好多了)
經過探索gayhub上的代碼,終於明白了原因:
因為esp8266的資源太有限,所以用的是non-os的SDK,這樣能最大化的分配內存的使用,而ESP32用的是基於FreeRTOS的ESP-IDF。micropython只是作為一個線程跑在FreeRTOS上,所以分配的堆就小了些(110K)並且有個哥們現在寫了個Multi-Heap的補丁,通過多次申請堆內存,能讓可用內存達到200K+,不過因為改動量比較大,暫時沒有合並進MicroPython的主線。所以想寫大量的程序,現階段還是用Arduino或者直接C+ESP-IDF擼代碼比較靠譜,當然我是當玩具玩,其實8266的35K也可以玩玩了。
更新:micropython寫大量的邏輯也是可以的,就是把代碼寫成庫,編譯為mpy文件並集成到固件中在代碼中調用,因為集成在固件中的庫是直接在ROM執行的,可以節省大量的RAM空間。
