<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>

聚豐項目 > 自研Python解釋器

自研Python解釋器

PikaScript是一個完全重寫的超輕量級python引擎,具有完整的解釋器,字節碼和虛擬機架構,可以在少于4KB的RAM下運行,用于小資源嵌入式系統。相比同類產品,如MicroPython,LuaOS等,資源占用減少85%以上。 入選2021年度 Gitee最有價值開源項目,加入RT-Thread嵌入式實時操作系統編程語言類軟件包。 在CH32V103 RISC-V開發板上完成了PikaScript的部署,并為CH32V103提交了PikaSciprt標準BSP和驅動模塊包,并完成了交互式運行的驅動。

lyon1998 lyon1998

分享
2 喜歡這個項目
團隊介紹

lyon1998 lyon1998

團隊成員

lyon1998 開發者

分享
項目簡介
PikaScript是一個完全重寫的超輕量級python引擎,具有完整的解釋器,字節碼和虛擬機架構,可以在少于4KB的RAM下運行,用于小資源嵌入式系統。相比同類產品,如MicroPython,LuaOS等,資源占用減少85%以上。 入選2021年度 Gitee最有價值開源項目,加入RT-Thread嵌入式實時操作系統編程語言類軟件包。 在CH32V103 RISC-V開發板上完成了PikaScript的部署,并為CH32V103提交了PikaSciprt標準BSP和驅動模塊包,并完成了交互式運行的驅動。
硬件說明

RT-Thread使用情況概述:

整個方案涉及的技術棧有:RT-Thread線程和定時器, 編譯原理、字節碼設計、虛擬機設計、PikaScript部署技術和驅動模塊開發技術等等。通過這個作品,擴充了PikaScript的BSP支持列表,驗證了PikaScript和rt-thread的兼容性,驗證了PikaScript在小容量(64Kb)RISC-V架構的部署能力和兼容性。

內核部分:使用了線程、定時器 。

軟件包:

PikaScript軟件包


硬件使用了RTT大賽提供的CH32V103開發板,使用了板上的LED資源用于指示腳本運行狀態,為GPIO硬件開發了Python腳本模塊,用于測試腳本驅動拓展功能。

image.png

軟件說明

0.摘要


PikaScript是一個完全重寫的超輕量級python引擎,具有完整的解釋器,字節碼和虛擬機架構,可以在少于4KB的RAM下運行,用于小資源嵌入式系統。相比同類產品,如MicroPython,LuaOS等,資源占用減少85%以上。

入選2021年度 Gitee最有價值開源項目,加入RT-Thread嵌入式實時操作系統編程語言類軟件包。


本項目在CH32V103 RISC-V開發板上完成了PikaScript的部署,為CH32V103提交了PikaSciprt標準BSP和驅動模塊包,并完成了交互式運行的驅動。


1.方案選型——CH32V103運行Python腳本,并不好辦

首先我們需要選擇一個能夠在CH32上運行的嵌入式Python解釋器。


能夠在flash為64Kb的RISC-V MCU上部署Python解釋器,需要有極小的編譯體積,還不能依賴于ARM架構的獨享技術。

首先排除通用Python解釋器CPython,不說CPython需要依賴linux,單是體積就可以排除。


其次在嵌入式領域大火的MicroPython技術是有可能選用的備選項,但是MicroPython在ARM平臺需要最少128Kb的體積,而RISC-V平臺的GCC編譯器優化成熟度不如ARM平臺,所以編譯體積只會更大不會更小,所以MicroPython不能在本次的CH32V103平臺部署。


好了,不賣關子了,能夠在CH32V103平臺部署的Python解釋器,只有我目前在開發的PikaScript超輕量級Python解釋器,(如果還有其他方案,請批評指正,我麻溜修改)。雖然相對于MicroPython,PikaScript沒有那么完整的標準庫支持,但基本的運行時對象、控制流、交互式運行都是可以實現的,且PikaScript的跨平臺能力非常好,在極限的依賴管理策略下,PikaScript只依賴LibC,在任何平臺都幾乎沒有依賴缺失問題,或許還能夠運行在FPGA軟核中(理論上可行,未驗證)。


另外感謝Gitee提供的開源平臺,PikaScript剛剛被Gitee評委大佬們選入GVP——最有價值開源項目,所以如果你現在打開Gitee首頁,大概率可以看到PikaScript的金色牌牌。


image.png


PikaScript還入選了rt-thread軟件包,rt-thread真的是非常有活力的開源社區

image.png

PikaScript嚴苛的依賴管理策略,使得部署非常輕松,這是跨平臺,易部署的特點。但是單純的易部署并沒有什么用,如果難以拓展功能,就只是一個花瓶而已。我們知道在MCU開發領域,一直是C語言的天下,C語言的生態占據MCU開發的80%以上,大部分MCU都有廠家提供的C語言開發套件,因此MCU平臺的Python解釋器,最重要的拓展手段,就是綁定C語言的原生庫,將C語言庫綁定為Python模塊,這通常被稱為Python的C模塊。


為MicroPython綁定C語言模塊與通用的CPython類似,需要將C庫編譯為靜態庫,再進行鏈接,鏈接時需要手動注冊許多全局表,且制作C模塊的過程中需要使用大量linux平臺獨有的工具,這對于以Windows平臺開發為主的MCU工程師來說,門檻很高。


而PikaScript可以在MCU工程師熟悉的Windos平臺完成C模塊的開發,通過自研的模塊預編譯器,能夠自動完成模塊的注冊工作,C模塊的開發者需要提供的僅僅是一個用Python寫成的模塊的調用API而已,預編譯器會自動將這個Python文件預編譯為C文件,完成模塊的鏈接和注冊。而只要使用正確的命名,原生的C的函數就能夠被自動注冊進模塊中,供解釋器調用,也不需要編譯靜態庫。


讓PikaScript在CH32V103跑起來,意思也就是開發一個能在CH32V103運行的PikaScript固件。


我們先看一下一個PikaScript固件有哪些部分。



image.png

在圖中標注黃色的部分是我們需要制作的,而綠色部分是跨平臺的,我們只需要拉取源碼進行編譯即可,不需要修改。


從下往上看,首先是需要一份PikaScript的BSP,BSP也就是板級支持包,這通常只要將廠商提供的MCU的標準庫稍加整理即可獲得。然后是PikaScript的啟動器,這包含了固件入口main.c,以及基本的設備初始化代碼,包括對printf的支持。


有了BSP和啟動器,就已經可以運行PikaScript的固件了,只不過還只能使用PikaScript提供的標準庫功能和Python的基本語法,還不能使用MCU上搭載的外設資源。


為了使用CH32V103的外設資源,我們還需要開發CH32V103的驅動模塊,在這個項目中,我們開發了GPIO的驅動模塊和基于rt-thread tick定時器的延時模塊。


最上層的就是我們要運行的Python腳本了,模塊預編譯器也可以處理Python腳本,根據腳本中導入的模塊來自動裁剪固件,在腳本中沒有import的固件會被自動裁剪掉,我們可以在main.py中選擇要加入固件的模塊,以及編寫系統初始化后最先運行的Python腳本,將其燒錄進固件中。


2.制作BSP和啟動器——先跑起來再說

BSP通常是用芯片的原廠提供的例程制作的,在這個項目中,我們就使用CH32V103的官方例程中的uart_printf和MounRiver River Studio生成的rt-thread模板來制作。完成了對rt-thread模板的一些剪裁之后,再加入printf的初始化函數,對項目稍作整理,BSP部分就完成了。


PikaScript的啟動器的制作也比較簡單,在main.c中添加#include “pikaScript.h”并調用pikaScriptInit()函數即可啟動PikaScript。pikaScript.h和pikaScriptInit()都是由預編譯器自動生成的,在制作啟動器之前,需要拉取PikaScript的源碼。


PikaScript官方(其實就是我自己)提供了一個包管理工具,只需要編寫requestment.txt,就可以從gitee中自動拉取相應版本的源碼和模塊。在拉取內核源碼時,預編譯器也會自動被拉取下來,我們在main.py中寫入import PikaStdLib,然后用我們使用拉取下來的預編譯器進行預編譯,就能得到pikaScriptInit()函數了。


包管理工具不僅可以拉取內核,還可以拉取模塊,也就是說我們自己制作的CH32V103的驅動模塊,也可以掛到PikaScript模塊庫中,進行自動拉取。


BSP和啟動器的制作我錄制了一個視頻教程,想要了解細節或者想自己制作BSP的大佬可以看視頻了解。

https://www.bilibili.com/video/BV1Cq4y1G7Tj

image.png


3.制作CH32V103的驅動模塊


接下來我們制作CH32V103的驅動模塊,使得CH32V103上面的外設資源能夠被Python腳本調用到。


在這個項目中,我們制作了一個PikaScript的標準設備驅動,什么是標準設備驅動呢?我們先從其他的腳本技術說起,比如MicroPython,并沒有統一的外設調用API,這使得用戶在使用不同的平臺時,都需要重新學習API,比如下面這個是MicroPython在STM32F4平臺驅動GPIO的代碼。

image.png

這個是ESP8266的

image.png

可以明顯看到在選擇pin的管腳時,一個用的是字符串,而另一個用的是整型數,驅動的API標準很混亂。


有沒有什么辦法,能夠統一外設的API,使得用戶只需要熟悉一套API,就能夠在任意平臺通用呢?


方法是有的,就是PikaStdDevice標準設備驅動模塊!


2e08e56afb970732848d87d438968ef.png


PikaStdDevice是一個抽象的設備驅動模塊,定義了所有的用戶API,而各個平臺的驅動模塊只要從PikaStdDevice繼承,就能夠獲得一模一樣的用戶API,而PikaStdDevice內部會間接調用平臺驅動,通過多態特性重寫底層的平臺驅動,就可以在不同的平臺工作了!


以GPIO模塊為例,以下是PikaStdDevice定義的用戶API


image.png


以下是PikaStdDevice需要重寫的平臺驅動


image.png


而我們要制作的CH32V103的GPIO模塊,就從標準驅動模塊中繼承。


image.png


通過這個方法,我們就可以讓STM32的驅動模塊、CH32的驅動模塊、ESP32的驅動模塊有著一模一樣的用戶API!用戶只要熟悉了一套API,就可以輕松使用支持了PikaScript標準驅動模塊的所有平臺!這才是真正的跨平臺!


下面是部分被注冊在驅動模塊里面C原生驅動函數


image.png


驅動模塊的開發,我也制作了兩個視頻,供想要了解細節的大佬們參考。

https://www.bilibili.com/video/BV1aP4y1L7pi

https://www.bilibili.com/video/BV1Jr4y117Z8

image.pngimage.png


4.支持交互式運行


PikaScript不依賴文件系統,只要傳入字符串就可以運行,所以只要制作支持字符串讀取的串口驅動,就可以支持交互式運行了!

下面是本項目中支持交互式運行的驅動代碼。

814ff1c9b9753da64901baf10be7c7b.png


5.main.py初始化腳本


image.png

最后我們編寫一段用Python寫成的初始化腳本,在固件啟動后運行,初始化GPIO,并且獲得一個系統對象,用于提供延時功能。在初始化結束后,led閃爍10次,并打印hello pikascript!


編寫好初始化腳本后,用預編譯器就可以集成在固件中了。


下面是預編譯器生成的初始化函數


image.png


項目地址:

PikaScript-CH32V103參賽項目倉庫:

https://gitee.com/lyon1998/ch32v103-pika

PikaScript總倉庫:

https://gitee.com/lyon1998/pikascript

https://github.com/pikastech/pikascript

演示效果

在演示視頻中,演示了PikaScript的啟動和交互式運行,包括:

  1. 1.測試了PikaScript的Python腳本交互式運行功能。

  2. 2.使用led對象的high()方法和low()方法,控制IO的電平,進而控制LED燈。

  3. 3.測試了PikaScript解釋器對Python變量的動態創建的支持。

  4. 4.測試了PikaScript對Python標準庫函數print的支持,包括打印整型數和字符串數。

  5. 5.測試了PikaScript解釋器對運算符以及組合運算的支持。

  6. 6.測試了PikaScript解釋器對條件運算符的支持和對控制流的支持。

  7. 7.測試了PikaScript對多行Python腳本交互式運行的支持。

  8. 8.測試了sys對象的delay()系統方法,該方法基于rt-thread延時函數,驗證了與rt-thread操作系統的兼容性。

  9. 9.循環打印1-1000整型數,測試了腳本的運行速度。

評論區(0 )
亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>