micropython解释器原理_了解一下 MicroPython 的项目整体架构
今天來(lái)說(shuō)說(shuō) MicroPython 的架構(gòu)情況,如果有必要我會(huì)做一些源碼分析的文章供大家參考。
先來(lái)認(rèn)識(shí)一下 MicroPython 整體情況,可以從軟件的角度上去看待,首先我們拿到 MicroPython 的主倉(cāng)庫(kù)。
直接 git clone https://github.com/micropython/micropython ,在 Windows 下進(jìn)行操作了解一下。
之后需要交叉編譯代碼的時(shí)候,必然會(huì)回到 Linux ,Windows 10 的發(fā)展 Linux 內(nèi)核還需要一些時(shí)間,但應(yīng)該也快了,屆時(shí)巨硬霸主將會(huì)攜帶跨平臺(tái)系統(tǒng)和云端開(kāi)發(fā)服務(wù)重新降臨到開(kāi)發(fā)者陣營(yíng)中,拭目以待。
目錄情況
一般來(lái)說(shuō),我們先看一下 readme.md 這里大多時(shí)候都會(huì)存放這個(gè)項(xiàng)目的整體情況或 build 情況。
This is the MicroPython project, which aims to put an implementation
of Python 3.x on microcontrollers and small embedded systems.
You can find the official website at micropython.org.
可知 micropython 是實(shí)現(xiàn)了 Python3.x 以上的 Python 語(yǔ)法解釋器,接著看到。
MicroPython implements the entire Python 3.4 syntax (including exceptions,
with, yield from, etc., and additionally async/await keywords from
Python 3.5). The following core datatypes are provided: str (including
basic Unicode support), bytes, bytearray, tuple, list, dict, set,
frozenset, array.array, collections.namedtuple, classes and instances.
Builtin modules include sys, time, and struct, etc. Select ports have
support for _thread module (multithreading). Note that only a subset of
Python 3 functionality is implemented for the data types and modules.
可以看到實(shí)現(xiàn)了不少關(guān)鍵詞(keywords ),注意 Python3 最大的變化在于 str 和 byte 徹底分離,而 MicroPython 也為此做了很多修改,符合預(yù)期。
然后協(xié)程相關(guān)的語(yǔ)法糖(yield、async、await)都支持了,with 和 in 也有,再來(lái)基本的標(biāo)準(zhǔn)庫(kù) sys 與 time、struct 、math 等。
最最重要的是,大量現(xiàn)成的基礎(chǔ)容器(str、bytes、bytearray、tuple、list、dict、set、btree),編寫(xiě)軟件的福利鴨!
最后就是根據(jù)芯片的 RTOS 情況提供的 _thread 多線程庫(kù),功能上略有缺失,因?yàn)槎嗑€程的設(shè)計(jì)和 X86 的有些區(qū)別。
but,這些特性并非所有芯片都支持,有時(shí)候,要依據(jù)不同的芯片情況,對(duì)此做裁剪處理,類似制作 linux kernel 一樣,選擇性的放入一些硬件相關(guān)的關(guān)鍵 C 驅(qū)動(dòng)代碼。
現(xiàn)在我們接著看很關(guān)鍵的倉(cāng)庫(kù)目錄說(shuō)明,可能有些過(guò)時(shí),但這并不影響我們對(duì)它的認(rèn)識(shí)。
Major components in this repository:
- py/ -- the core Python implementation, including compiler, runtime, and core library.
- mpy-cross/ -- the MicroPython cross-compiler which is used to turn scripts into precompiled bytecode.
- ports/unix/ -- a version of MicroPython that runs on Unix.
- ports/stm32/ -- a version of MicroPython that runs on the PyBoard and similar STM32 boards (using ST's Cube HAL drivers).
- ports/minimal/ -- a minimal MicroPython port. Start with this if you want to port MicroPython to another microcontroller.
- tests/ -- test framework and test scripts.
- docs/ -- user documentation in Sphinx reStructuredText format. Rendered HTML documentation is available at http://docs.micropython.org.
Additional components:
- ports/bare-arm/ -- a bare minimum version of MicroPython for ARM MCUs. Used mostly to control code size.
- ports/teensy/ -- a version of MicroPython that runs on the Teensy 3.1 (preliminary but functional).
- ports/pic16bit/ -- a version of MicroPython for 16-bit PIC microcontrollers.
- ports/cc3200/ -- a version of MicroPython that runs on the CC3200 from TI.
- ports/esp8266/ -- a version of MicroPython that runs on Espressif's ESP8266 SoC.
- ports/esp32/ -- a version of MicroPython that runs on Espressif's ESP32 SoC.
- ports/nrf/ -- a version of MicroPython that runs on Nordic's nRF51 and nRF52 MCUs.
- extmod/ -- additional (non-core) modules implemented in C.
- tools/ -- various tools, including the pyboard.py module.
- examples/ -- a few example Python scripts.
可以看到這些是官方做了一些架構(gòu)上的說(shuō)明,雖然有點(diǎn)亂,但也是可以窺探一二的。
只是為了編譯使用 MicroPython 的同學(xué),可以直接看到 ports 文件夾,這里存放著官方移植的一些對(duì)應(yīng)硬件的編譯固件配置,進(jìn)入到其中選擇你想要編譯的平臺(tái),即可得到一個(gè) MicroPython 解釋器,開(kāi)始你的 Python 編程。
如果想知道更多,我繼續(xù)往下講。
想知道更多?
文件夾列表大致內(nèi)容如下
py Python 解釋器相關(guān)的抽象實(shí)現(xiàn)的代碼,包含運(yùn)行時(shí)等等。
mpy-cross MicroPython 編譯器,處理 Python 代碼回 ByteCode 機(jī)器碼。
ports 對(duì)應(yīng)平臺(tái)移植配置文件
tests 框架測(cè)試腳本
docs 配置到 Sphinx 的文檔網(wǎng)站
extmod 一些不需要在 Core 中的抽象 C 接口代碼。
tools 各類腳本輔助工具,例如 Pyboard.py 可以通信控制 MicroPython 。
examples Python 示例代碼。
lib 給 port 用的各自平臺(tái)的 SDK 依賴庫(kù),可能在里面,也可能在外面,并不重要。
drivers 通過(guò)軟實(shí)現(xiàn)的硬件驅(qū)動(dòng),基于 py 的架構(gòu)使用標(biāo)準(zhǔn) C 實(shí)現(xiàn)的 Python 模塊(C + Python),和芯片自己提供的 SDK 略微不同,有較大的兼容性。
對(duì)于我們做移植或做深層次的開(kāi)發(fā)有兩個(gè)方向,假設(shè)不破壞官方的架構(gòu)的基礎(chǔ)上,如何結(jié)合到現(xiàn)在自己手頭的硬件或者軟件。
MicroPython 解釋器核心的基本認(rèn)識(shí)
我們需要對(duì) MicroPython 的解釋器有一個(gè)大概的認(rèn)識(shí),這就需要初略閱讀一下 py 的結(jié)構(gòu)了,關(guān)鍵的文件在 compile(python) 、 obj(alloc) 、 nlr (non-local return) 、vm(execute) 等地,總之全都很重要吧。
因此一個(gè)解釋器的構(gòu)成情況常有有代碼執(zhí)行環(huán)境(堆棧)、代碼交互接口(REPL)、變量存取接口(allocator)、代碼編譯接口(compile)等。
就我們通常的使用方法來(lái)講解吧。
一段 Python 代碼,通過(guò) REPL 進(jìn)入解釋器的緩存中,解釋器程序?qū)?huì)對(duì)這段代碼進(jìn)行解釋(編譯成 ByteCode),接著通過(guò)解釋后的 code 進(jìn)行執(zhí)行,執(zhí)行時(shí)送到解釋器的函數(shù)棧上,該執(zhí)行的就執(zhí)行,該報(bào)異常的報(bào)異常。
要做到這樣的效果,我們必須深入往下看才能得知具體的細(xì)節(jié),關(guān)于 py 的部分我就暫且講到這里,之后也會(huì)單獨(dú)解釋一些 py 的源碼解釋,專門講解它的構(gòu)成和 debug 或是修改源碼(bug)。
MicroPython 的測(cè)試 & 示例
如果我們沒(méi)有能力去修改 MicroPython ,那就要了解它的外圍代碼和測(cè)試,分別在 example 和 tests,這里有許多測(cè)試示例代碼供你應(yīng)用和查閱。
如看 run-tests-exp.sh 和 run-tests-exp.py 文件,又或是 run-tests ,這些都是自動(dòng)化的測(cè)試接口腳本,通過(guò)這樣的方式可以讓 micropython 解釋器進(jìn)行接口覆蓋性測(cè)試。
自動(dòng)化生成的示例如下:(均可在 Windows 或 Unix 下運(yùn)行喔)
如圖所見(jiàn),將在 repl 執(zhí)行的 Python code 結(jié)果返回存到 .exp (example)下進(jìn)行測(cè)試核對(duì)。
了解到它的測(cè)試框架后,現(xiàn)在是不是對(duì) MicroPython 稍微有了一些信心呢?接著我們還要看到真正開(kāi)始使用的部分了。
MicroPython 中各芯片標(biāo)準(zhǔn)移植接口
這里就存放著 MicroPython 應(yīng)用領(lǐng)域中最有價(jià)值的代碼,也就是官方提出的專用的移植接口示范,對(duì)于一般的開(kāi)發(fā)者來(lái)說(shuō),足夠使用了,但對(duì)于專業(yè)的來(lái)說(shuō),不僅是使用它,包括如何移植它,改造它,修復(fù)它等等都是要了解的。
先看一點(diǎn)簡(jiǎn)單的移植示例吧 windows 、unix 、還有 minimal 文件夾。
比如我現(xiàn)在在 Windows 上,使用 VS2019 直接打開(kāi) windows 的 micropython.vcxproj 文件即可編譯生成一個(gè) micropython.exe 解釋器了,如下圖。
而 unix 則對(duì)應(yīng)著 linux 或 macOS 環(huán)境下直接運(yùn)行即可,我這里不想多示范了,沒(méi)有什么區(qū)別。
但 minimal 很重要,這個(gè)是以 STM32F405 的芯片啟動(dòng)流程做了一個(gè)硬件移植示范,關(guān)于如何從 main 函數(shù)初始化 py 相關(guān)資源然后鏈接 nlr 函數(shù)等等示例,這將指導(dǎo)你如進(jìn)行 MicroPython 的移植。
事實(shí)上,無(wú)論是 STM 還是 TI 又或是 nRF 家的芯片,都可以依次為依據(jù)進(jìn)行主體的移植,然后根據(jù)周邊情況提供標(biāo)準(zhǔn)庫(kù)函數(shù)的接口,就可以完成 MicroPython 的移植,如果是嵌入式 C 類型的芯片,注意一下替代函數(shù)的對(duì)接就好了,因?yàn)?MicroPython 設(shè)計(jì)之初就足夠的抽象了,不信看看 bare-arm 的三個(gè)關(guān)鍵文件 mpconfigport.h 、 mphalport.h 、 qstrdefsport.h ,接著再看看 JavaScript 的接口,就知道我在說(shuō)什么了,你完全可以把 MicroPython 當(dāng)作一個(gè)解釋器接口模塊導(dǎo)入你的環(huán)境,其他動(dòng)態(tài)語(yǔ)言也是如此,例如 lua 和 JerryScript 也是如此,只是 micropython 提供了太多穩(wěn)定可用的模塊代碼,讓我沒(méi)得選擇了(真香。
結(jié)語(yǔ)
之后我將會(huì)以我在做的樂(lè)鑫 ESP 系列的芯片 esp8266 和 esp32 來(lái)做移植和修改的源碼解析說(shuō)明,畢竟官方已經(jīng)移植完了大多數(shù)主流的芯片配置項(xiàng)目,所以我只能做一些源碼升級(jí)和修改的說(shuō)明了,那些移植直接抄過(guò)來(lái)都不是太大的問(wèn)題。
寫(xiě)到這里,仔細(xì)一看 micropython 和我當(dāng)年做的 ZwLib 是同樣的架構(gòu)鴨,可惜我的太菜了就放棄繼續(xù)維護(hù)了,大佬不僅強(qiáng),寫(xiě)代碼的速度也很快,真令人頭大。
撰寫(xiě)時(shí)間:2019年9月2日
作者名稱:junhuanchen
聯(lián)系方式:
WeChat & Github: 作者名稱
QQ & E-mail: 作者名稱@qq.com
原文地址:https://www.cnblogs.com/juwan/p/11447455.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的micropython解释器原理_了解一下 MicroPython 的项目整体架构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python高斯滤波和降噪_python
- 下一篇: python如何将生成的随机数存入文件中