redirect document link

This commit is contained in:
lyon1998 2022-03-31 11:59:01 +08:00
parent ae62279eda
commit 454034ac2a
8 changed files with 17 additions and 1356 deletions

View File

@ -1,142 +1,3 @@
## 1.PikaScript-三分钟快速上手
在本篇中你将可以在手边没有硬件的情况下对pikascript进行上手测试。
测试使用keil5的仿真工程仿真目标板为stm32f103下载仿真工程即可直接开始测试。
### (1) 下载工程
进入下载pikascript仓库
(右键在新标签页中打开)
[pikascript](../../../../pikascript)
然后下载源码
![image](https://user-images.githubusercontent.com/88232613/131968475-4a7c12ca-04ec-4e37-87ff-ba494b87c732.png)
(github 页面)
![image](https://user-images.githubusercontent.com/88232613/130744477-e6760afb-99bf-4be0-aa04-8fbe2ea737ec.png)
(gitee 页面)
本篇的测试只需要解压demo/simulation-keil工程即可
![image](https://user-images.githubusercontent.com/88232613/131968548-3b711fc6-6e6c-4315-9aca-3af50723d46c.png)
直接打开工程
![image](https://user-images.githubusercontent.com/88232613/130745821-864038df-d8b0-41d2-97e8-199815d0d57d.png)
### (2) 运行仿真工程
选择使用仿真器进行调试
![image](https://user-images.githubusercontent.com/88232613/130747706-b912e09f-3f68-495a-a69f-f8f7500b1e4e.png)
编译工程然后进入调试
![3MT68@ }AWJTGAYJA12VG%V](https://user-images.githubusercontent.com/88232613/130747350-70ffa319-f04d-4f26-a75b-61864a19b8d8.png)
打开串口显示面板
![image](https://user-images.githubusercontent.com/88232613/130747952-42073ba1-c4c4-4acb-9495-766cd5731374.png)
运行然后查看输出结果
![image](https://user-images.githubusercontent.com/88232613/130748221-53fff9f6-6427-417d-b95a-3fa52a57eeaf.png)
### (3) 改改脚本看看
用任意编辑器打开main.py推荐vscode 没有vscode用记事本打开也可以
![image](https://user-images.githubusercontent.com/88232613/130748847-477facfb-e16e-4e0e-8876-d66efd0ae48c.png)
以下就是main.py
``` python
# main.py
from PikaObj import *
import Device
import PikaStdLib
led = Device.LED()
uart = Device.Uart()
mem = PikaStdLib.MemChecker()
print('hello wrold')
uart.setName('com1')
uart.send('My name is:')
uart.printName()
print('mem used max:')
mem.max()
print('mem used now:')
mem.now()
```
这个脚本使用标准的python3语法那么如何让这个脚本在单片机里运行呢
事实上pikascript虽然使用python语法但原理上更像是java是半编译半解释型的pikascript的类和方法是需要编译的而方法调用和对象新建/销毁则是在运行时解释的。
编译pikascript分为两步第一步是使用pikascript预编译器将.py文件编译为pikascript-api中的.c和.h文件。
第二步是使用c编译器编译所有的c工程然后下载到单片机里即可。
双击rust-msc-v0.5.0.exe运行pika预编译器值得一提的是这个预编译器是使用rust语言编写的。
![image](https://user-images.githubusercontent.com/88232613/130749341-d12b7985-3685-419c-b9b8-8a09ae6f73d3.png)
为了验证编译的效果我们可以先把pikascript-api文件夹里的文件全部删除然后再运行编译器看看能不能自动生成pikascript-api里面的.c,.h文件。
注意不要把pikascript-api文件夹给删掉了只删除里面的文件即可。
下面就是pikascript-api生成的.c,.h文件
![image](https://user-images.githubusercontent.com/88232613/130750476-eaffce03-caeb-40b3-9841-550034fa191a.png)
接下来我们来修改一下main.py看看效果
``` python
from PikaObj import *
import Device
import PikaStdLib
led = Device.LED()
uart = Device.Uart()
mem = PikaStdLib.MemChecker()
print('hello wrold')
uart.setName('com1')
uart.send('My name is:')
uart.printName()
print('mem used max:')
mem.max()
print('mem used now:')
mem.now()
# new code start
print('add new code start')
uart.setName('com2')
uart.printName()
print('add new code end')
# new code end
```
我们在main.py下面新加了4行脚本我们来编译运行看看效果。
编译pikascript-api
![image](https://user-images.githubusercontent.com/88232613/130751195-40944d60-7d56-48a9-9f47-cab87d77d5a8.png)
编译keil工程然后进入调试
![image](https://user-images.githubusercontent.com/88232613/130751539-aa0bdb82-750f-4f98-8f6f-02d653dda64a.png)
运行然后观察输出
![image](https://user-images.githubusercontent.com/88232613/130751653-cad627c2-367c-45a6-8c5f-686c7514df3c.png)
我们发现多了3行输出说明编译运行顺利。
好了到这里pikaScript的三分钟快速上手就结束了。
想要了解如何部署pikaScript到你的工程里面请看这里
[2. 十分钟快速部署](./2.%E5%8D%81%E5%88%86%E9%92%9F%E5%BF%AB%E9%80%9F%E9%83%A8%E7%BD%B2.md)
想要继续学习pikaScript的标准开发流程可以看这里
[3. PikaScript标准开发流程](./3.PikaScript标准开发流程.md)
document is moved to :
[https://pikadoc.readthedocs.io/zh/latest/index.html](https://pikadoc.readthedocs.io/zh/latest/index.html)

View File

@ -1,135 +1,3 @@
## 2.十分钟快速部署
document is moved to :
在本篇文档中将会介绍为已有的keil工程部署PikaScript的方法。
PikaScript几乎没有全局变量和宏仅依赖标准库因此为已有的工程部署PikaScript是非常容易的。
下面是部署PikaScript的具体步骤。
### (1)下载PikaScript包管理器
PikaScript包管理器可以帮助你拉取pikascript所需要的所有源码和工具并且提供版本选择功能方便你切换版本。
并且PikaScript包管理器使用gitee源能够在大陆顺畅地使用不需要科学上网。
进入PikaScript主仓库
https://github.com/mimilib/pikascript
下载PikaScript包管理器PikaPackage.exe
![image](https://user-images.githubusercontent.com/88232613/142019152-afbe2f84-7f76-45ab-856b-bd796c6b5fc9.png)
然后打开你要部署的工程在工程的根目录下新建pikascript文件夹然后把PikaPackage.exe复制进去。
![image](https://user-images.githubusercontent.com/88232613/142019778-c727336c-9b6a-4a82-b813-1671f4120152.png)
你的工程仅需要包含一个支持printf的串口初始化然后就可以愉快地使用pikascript了。
通常的脚本解释器都依赖操作系统和文件系统而pikascript不需要这些如果你部署过其他的脚本引擎就会很清楚PikaScrip具有真正的超轻量级特性。
### (2)拉取源码,预编译模块
接下来在PikaPackage.exe的帮助下我们可以轻松地拉去指定版本的源码和模块。
拉取源码和模块通过一个requestment.txt的文件如果你熟悉python的pip包管理器就会发现pikascript的requestment.txt文件格式与pip是一致的。
在项目的pikascript文件夹下新建一个requestment.txt文件然后写入以下内容。
```
pikascript-core==v1.2.0
PikaStdLib==v1.1.0
```
这表示使用v1.2.0版本的pikascript解释器内核和v1.1.0版本的标准库,解释器内核和标准库是必选项,而其他的模块可以有选择地添加,在初次部署时,应当只添加解释器和标准库以避免不必要的麻烦。
你可以照抄stm32g030的[requestment.txt](/bsp/stm32g030c8/pikascript/requestment.txt)内核和标准库版本, 这是官方支持的开发板[Pika派—Zero](https://item.taobao.com/item.htm?spm=a1z10.3-c.w4023-23991764790.10.16f97c58fsLjVk&id=654947372034)所使用的版本。而所有可选的版本可以在[packages.toml](/packages.toml)文件中查看。
现在的pikascript文件夹就有了pikaPackage.exe和requestment.txt两个文件双击运行pikaPackage.exe在requestmemt.txt中指定的源码和模块就会被拉取下来。
![image](https://user-images.githubusercontent.com/88232613/142022949-54585060-8612-42a8-a585-8c3e514a8be3.png)
拉取后的文件如下图所示pikascript-core是内核源码pikascript-lib是模块库pikascript-api是模块APIrust-msc-latest-win10.exe是pikascript专用的预编译器。
![image](https://user-images.githubusercontent.com/88232613/142023882-51ee4013-8318-483e-8ea4-5c57a5ffb6c6.png)
如果你想使用其他的版本在requestment.txt中修改版本号然后再次运行pikaPackage.exe即可原先的版本会被覆盖。
拉取完源码之后接下来编写pikascript运行的python脚本我们在pikascript文件夹新建一个main.py文件。
然后写入:
``` python
import PikaStdLib
print('hello PikaScript!')
```
其中```import PikaStdLib``` 表示导入标准库,标准库是必须要导入的,即使没有直接用到,而```print('hello PikaScript!')```用于测试pikascript是否正常启动。
接下来运行rust-msc-latest-win10.exe将main.py和导入的模块预编译为pikascript的api文件预编译后的文件在pikascript-api文件夹内。
![image](https://user-images.githubusercontent.com/88232613/142025848-29ed0599-711a-42d6-91a9-d29f842e2332.png)
我们打开pikascript-api文件夹发现里面有一些.c和.h文件就说明预编译是成功的pikascript预编译器可以把python文件预编译为.c和.h文件。
![image](https://user-images.githubusercontent.com/88232613/142026275-716bb2d7-209d-4c26-9b40-aae78a452668.png)
### (3)添加源码
在Project中新建三个group建议命名为pikascript-core,pikascript-api和pikascript-lib
![image](https://user-images.githubusercontent.com/88232613/130967351-597b8f6b-cc4e-4bc3-9cb6-2f335e5dccea.png)
然后将pikascript文件夹内的三个子文件夹下的.c文件全部添加到keil工程里
![image](https://user-images.githubusercontent.com/88232613/130971776-41d8c940-42d0-407d-872e-53525ce299a6.png)
再然后为pikascript-core和pikascript-api文件夹添加include路径
![image](https://user-images.githubusercontent.com/88232613/130967813-94016b8a-e408-4b49-b1e1-76a5df5fe984.png)
![image](https://user-images.githubusercontent.com/88232613/130967949-8399c65b-5584-4674-a947-e40103d953ea.png)
### (4)调整堆栈
打开工程的启动文件, 在stm32中, 这是一个startup_stm32xxxx.s的文件而在其他平台上你要自己弄清楚如何调整堆栈。
![image](https://user-images.githubusercontent.com/88232613/130966276-24014a0a-90a6-4bd7-96b7-fde54806b8c3.png)
建议分配4K的栈空间和16K的堆空间最少也需要分配1K的栈空间和4K的堆空间
4K栈空间对应0x1000, 16K堆空间对应0x4000如下图所示
![image](https://user-images.githubusercontent.com/88232613/130967178-a985a4f5-730c-47fd-9317-68f33bc00066.png)
### (5)启动PikaScript
在main.c的初始化代码中添加PikaScript的启动代码。
1) 添加 #include "pikascript.h"
![image](https://user-images.githubusercontent.com/88232613/130969048-4def9902-5f36-4798-9eac-ebbb1441087f.png)
2) 初始化pikaScript并得到pikascript主对象的指针pikaMain
![image](https://user-images.githubusercontent.com/88232613/130969274-ff2fdf6f-2389-466b-b51e-e7bc33472558.png)
结束了?对,结束了,就这么简单,是不是很神奇。
这是因为预编译器在背后做了很多辅助工作,包括自动生成```pikaScriptInit()```函数。
### (6)编译源码
编译源码时需要勾选C99标准而编译优化等级可以任意选择pikascript均支持。
![image](https://user-images.githubusercontent.com/88232613/130968626-7d8d4f46-eb0c-4ccd-9c34-eab160b290f5.png)
然后直接编译即可一般来说是可以直接通过的使用compiler version 5 或者 compiler version 6均可。
### 结语
部署文档到此就结束了。继续学习PikaScript的标准开发流程请看
[3. PikaScipt标准开发流程](./3.PikaScript标准开发流程.md)
[https://pikadoc.readthedocs.io/zh/latest/index.html](https://pikadoc.readthedocs.io/zh/latest/index.html)

View File

@ -1,350 +1,3 @@
## 3.Pikascript标准开发流程
document is moved to :
本篇文档将会介绍基于PikaScript开发的标准流程这个标准流程将会涵盖大部分情况下会用到的PikaScript相关技术。
我们依然以keil的仿真工程为例如果还没有获得仿真工程请参考[1.三分钟快速上手](1.三分钟快速上手.md)
## (1). 使用已有的PikaScript类包
### a) PikaScript类包与包接口
我们打开pikascript文件夹发现文件夹根目录下除了main.py还有Device.pyPikaObj.py和PikaStdLib.py这三个.py文件分别对应三个PikaScript***类包***(class package),简称***包***(package),每个.py文件本身称为***包接口***(package interface)。一个类包中可以包含若干个相关性较强的类。
![image](https://user-images.githubusercontent.com/88232613/131083885-a78befe9-7aee-4bae-84cc-86c81eef7622.png)
每一个PikaScript***类包***由***包接口***和***包实现***(package implement)两部分组成。
我们先打开Device.py查看一下内容在后续的文档中我们会称Device.py为***Device包接口***。
以下就是Device.py的全部内容。
``` python
# Device.py
from PikaObj import *
class LED(TinyObj):
def on():
pass
def off():
pass
class Uart(TinyObj):
def send(data:str):
pass
def setName(name:str):
pass
def printName():
pass
```
可以看到Device.py中使用pyhon标准语法定义了两个类分别是`LED`类和`Uart`类,这两个类都继承自```TinyObj```。
LED类中定义了两个方法分别是`on()`方法和`off()`方法,而`Uart`类则定义了`send(data:str)`方法、`setName(name:str)`方法和`printName()`方法。
可以看到,这些方法都有一个特点,与其说这是方法的***定义***,不如说是方法的***声明***因为所有的方法实现都pass掉了都没有写实现。而且方法的入口参数都是带有***类型声明***的。比如`data:str`就表示一个`data`参数,参数类型为`str`即字符串类型。
这是因为这个包的包实现是由C语言编写的也就是说PikaScript的所有类包都是使用python语法编写声明而使用C语言编写实现。PikaScript的类包开发是一种***面向接口***编程的***混合编程***技术。
然而在使用已有的类包时,是不需要了解包实现的,只需要了解包接口,即可使用这个类包。
### b) 导入并调用包
下面我们看一下如何使用这个类包。
我们打开工程中的main.py见名知意这个文件是PikaScript的入口文件。
main.py的内容如下
``` python
# main.py
from PikaObj import *
import Device
import PikaStdLib
led = Device.LED()
uart = Device.Uart()
mem = PikaStdLib.MemChecker()
print('hello wrold')
uart.setName('com1')
uart.send('My name is:')
uart.printName()
print('mem used max:')
mem.max()
print('mem used now:')
mem.now()
```
导入一个已经编写好的类包是非常简单的比如导入Device包只需要`import Device`即可,要注意的是所有的.py文件应当放在pikascript文件架的根目录下。
然后使用Device中的LED类新建对象只需要写一句`uart = Device.Uart()`即可,这表示新建一个`uart`对象这个对象的类是Device包中的Uart类。
调用方法则使用`uart.setName('com')`这种形式这都是Python的标准语法不需要过多介绍。
在main.py中写好包的调用后双击rust-msc-v0.5.0.exe即可预编译PikaScript工程预编译的输出文件在pikascrip-api文件夹内。
![image](https://user-images.githubusercontent.com/88232613/131095540-46b38726-8fda-4b10-94f1-5af31ae7a792.png)
pika预编译器会为导入的包生成.h声明文件和-api.c构造器文件。文件名以包名开头每个类对应一个.h文件和一个-api.c文件。
![image](https://user-images.githubusercontent.com/88232613/131096295-8b1b2161-cb59-45e6-92f3-eb2cf79a47f7.png)
而PikaMain-api.c和PikaMain.h则是对应了一个特殊的类这个类是PikaScript的主类由main.py编译而成。
![image](https://user-images.githubusercontent.com/88232613/131096521-569e30a0-876e-4bb5-bfd3-0c01b6b8a38f.png)
pikaScript.c和pikaScript.h则是根据main.py编译出的初始化函数运行初始化函数时会自动执行启动脚本。
![image](https://user-images.githubusercontent.com/88232613/131096760-20592a84-bbc1-4b61-a57f-299183983adf.png)
在现在的main.py中启动脚本是写在最外层的方法调用也就是:
``` python
print('hello wrold')
uart.setName('com1')
uart.send('My name is:')
uart.printName()
print('mem used max:')
mem.max()
print('mem used now:')
mem.now()
```
编译出的pikaScriptInit()初始化函数对应的是:
``` c
PikaObj * pikaScriptInit(){
PikaObj * pikaMain = newRootObj("pikaMain", New_PikaMain);
obj_run(pikaMain, "print('hello wrold')");
obj_run(pikaMain, "uart.setName('com1')");
obj_run(pikaMain, "uart.send('My name is:')");
obj_run(pikaMain, "uart.printName()");
obj_run(pikaMain, "print('mem used max:')");
obj_run(pikaMain, "mem.max()");
obj_run(pikaMain, "print('mem used now:')");
obj_run(pikaMain, "mem.now()");
return pikaMain;
}
```
## (2) 编写新的PikaScript类包
### a)新建包接口
编写一个新的类包首先需要编写包接口文件比如编写一个数学计算类包Math第一步是编写Math.py包名首字母应当大写。
如果要从PikaScript基本类中创建新的类则需要import PikaObj类包导入PikaObj类包应使用`from PikaObj import *`的引入方式实际上Pika预编译器是不会编译使用`from`语法导入的包的这样写只是为了获得python编辑器的智能语法提示PikaObj是内置于Pika运行时内核的。
``` python
# Math.py
from PikaObj import *
```
我们可以打开PikaObj.py文件查看里面的类接口
``` python
# PikaObj.py
class TinyObj:
pass
class BaseObj(TinyObj):
pass
def print(val: any):
pass
def set(argPath: str, val: any):
pass
```
可以看到里面有`TinyObj``BaseObj`两个类这两个类是由PikaScript内核实现的基本类TinyObj是没有任何功能的最基本的类内存占用最少`BaseObj``TinyObj`相似,但是`BaseObj`可以挂载子对象。
`print(val: any)`表示输入参数为泛型的函数,`set(argPath:str, val:any)`也是泛型函数这两个函数由内核实现PikaScript类包目前还不支持自定义泛型函数。
### b)编写类接口
现在我们可以在Math.py里面新建类了比如我们要新建一个`Adder`类来实现相关的加法运算我们就可以在Math.py里面添加Adder类为了节省内存Adder类从TinyObj基类中继承。
然后我们希望Adder可以为整形、浮点型数据提供加法运算那么就可以添加byInt方法和byFloat方法。
``` python
# Math.py
class Adder(TinyObj):
def byInt(a:int, b:int)->int:
pass
def byFloat(a:float, b:float)->float:
pass
```
上面的一段代码中我们定义了`Adder`类,并添加了两个方法的声明,`byInt(a:int,b:int)->int`表示方法名为byInt,输入参数为`a``b``a``b`的类型都是`int`型,而返回值也是`int`型,返回值由`->int`来确定这都是python的标准语法是带类型声明的写法。
我们再向math.py里面添加一个Multiplier类用来实现乘法Multiplier的写法如下所示Multiplier类同样从`TinyObj`基类中继承:
``` python
# Math.py
class Multiplier(TinyObj):
def byInt(a:int, b:int)->int:
pass
def byFloat(a:float, b:float)->float:
pass
```
到此类接口就编写完成了。我们在main.py中引入Math包这样Pika预编译器就会去编译Math类包了。
```
# main.py
import Math
```
双击运行pika预编译器。
![image](https://user-images.githubusercontent.com/88232613/131119247-ae25276e-f7c9-49ef-81e1-dbddcaffdf6c.png)
打开pikascript-api文件夹可以发现我们新编写的类包接口已经可以被编译出来了。
![image](https://user-images.githubusercontent.com/88232613/131119310-99564d6a-d570-4375-9c01-c2d7cde74655.png)
### c)编写类的实现
我们把刚刚新编译出的两个-api.c文件添加到工程然后编译一下试试。
![image](https://user-images.githubusercontent.com/88232613/131119636-3c3d52ce-a7c2-48a4-beb4-5498dfd4f279.png)
发现编译报错了,提示是有四个函数没有找到定义。
![image](https://user-images.githubusercontent.com/88232613/131119786-823a96e3-7ab3-45f8-8c7c-282ba9b7b863.png)
这是正常的因为我们之前并没有为Math包的类编写实现下面我们就来编写这些类的实现。
为了包管理的方便我们把实现文件都放在pikascript-lib文件夹下
![image](https://user-images.githubusercontent.com/88232613/131120029-81c9b91f-2669-40cf-86da-78d72bce81c8.png)
在pikascript-lib文件夹下新建一个Math文件夹用来放Math包的实现代码。
![image](https://user-images.githubusercontent.com/88232613/131120240-a4001fa4-1fd2-4b6b-82a2-191834ed781b.png)
然后在Math文件夹下新建.c文件建议用"包名_类名.c"的命名方式为每一个类新建一个.c文件提高代码的清晰性。
![image](https://user-images.githubusercontent.com/88232613/131120619-45ae3520-7b63-434b-8831-5b4d9f900cad.png)
然后我们在这两个.c文件里面编写类的方法实现。那么问题来了我们如何知道应当编写哪些实现呢
这个很简单我们打开Math_Multiplier.h和Math_Adder.h就可以发现我们需要编写的实现函数已经被声明好了。
``` c
/* Math_Multiplier.h */
/* ******************************** */
/* Warning! Don't modify this file! */
/* ******************************** */
#ifndef __Math_Multiplier__H
#define __Math_Multiplier__H
#include <stdio.h>
#include <stdlib.h>
#include "PikaObj.h"
PikaObj *New_Math_Multiplier(Args *args);
float Math_Multiplier_byFloat(PikaObj *self, float a, float b);
int Math_Multiplier_byInt(PikaObj *self, int a, int b);
#endif
```
``` c
/* Math_Adder.h */
/* ******************************** */
/* Warning! Don't modify this file! */
/* ******************************** */
#ifndef __Math_Adder__H
#define __Math_Adder__H
#include <stdio.h>
#include <stdlib.h>
#include "PikaObj.h"
PikaObj *New_Math_Adder(Args *args);
float Math_Adder_byFloat(PikaObj *self, float a, float b);
int Math_Adder_byInt(PikaObj *self, int a, int b);
#endif
```
然后我们直接在Math_Adder.c和Math_Multipler.c里面去实现这四个函数就ok了。
``` c
/* Math_Adder.c */
#include "pikaScript.h"
float Math_Adder_byFloat(PikaObj *self, float a, float b)
{
return a + b;
}
int Math_Adder_byInt(PikaObj *self, int a, int b)
{
return a + b;
}
```
``` c
/* Math_Multipler.c */
#include "pikaScript.h"
float Math_Multiplier_byFloat(PikaObj *self, float a, float b)
{
return a * b;
}
int Math_Multiplier_byInt(PikaObj *self, int a, int b)
{
return a * b;
}
```
这时,再编译项目,就可以通过了。
### d)测试一下效果
我们用下面的main.py来测试一下我们新编写的类包
``` python
# main.py
import Math
adder = Math.Adder()
muler = Math.Multiplier()
res1 = adder.byInt(1, 2)
print('1 + 2')
print(res1)
res2 = adder.byFloat(2.3, 4.2)
print('2.3 + 4.2')
print(res2)
res3 = muler.byInt(2, 3)
print('2 * 3')
print(res3)
res4 = muler.byFloat(2.3, 44.2)
print('2.3 * 44.2')
print(res4)
```
运行的效果如下:
![image](https://user-images.githubusercontent.com/88232613/131123307-1d9564d1-8b99-4784-99ed-9756693781f1.png)
这说明我们编写的类包工作正常了。
### e)发布类包
出于开源的精神,发布你自己的类包是一件非常酷且激动人心的事情。
发布类包只需要发布类接口和类实现文件即可。
比如发布刚刚新编写的Math类包就是发布Math.py文件和pikascript-lib/Math文件夹。
![image](https://user-images.githubusercontent.com/88232613/131123704-403753d8-2ef1-488e-a02a-08fce33cd6de.png)
这样一个类包就完成了你可以把这个类包发布在github的独立仓库中或者也可以使用pull request功能将你的类包添加进pikascript主仓库
到此为止pikascript标准开发流程就结束了。
更多的进阶应用请关注[PikaScript内核Api手册](4.PikaScript内核Api手册.md)。
[https://pikadoc.readthedocs.io/zh/latest/index.html](https://pikadoc.readthedocs.io/zh/latest/index.html)

View File

@ -1 +1,4 @@
document is moved to :
[https://pikadoc.readthedocs.io/zh/latest/index.html](https://pikadoc.readthedocs.io/zh/latest/index.html)

View File

@ -1,112 +1,3 @@
document is moved to :
我就想用单片机跑个Python得用linux虚拟机+交叉编译工具链+命令行编译micropython固件还得用DfuSe工具烧录固件烧录完还不能用C的调试器来调试。
我想拓展个自己的C模块还要学着用一些完全看不懂的宏函数还得手动注册还得编写makeFile编译完照样不能调试C。
我穷买不起STM32F4想买个STM32F103C8T6的micropython开发板淘宝一搜好像没有。
现在C8T6贵了我还想用F0用G0能行吗
好像给G0移植micropython不是很容易。
那?有没有另一种玩法?
换句话说我想用Keil开发用Keil调试我还想用最便宜的单片机。
能玩Python吗
![output_Kgj52R](https://user-images.githubusercontent.com/88232613/132941900-985ebc9e-fb65-48f6-8677-d3ebc65422ee.gif)
要不试试PikaScript
啥是PikaScript
PikaScript可以为资源受限的mcu提供极易部署和拓展的Python脚本支持。
PikaScript支持裸机运行最低可运行于 RAM ≥ 4kB FLASH ≥ 32kB 的mcu中推荐配置为 RAM ≥ 10kB FLASH ≥ 64kB像是stm32f103c8t6、stm32g070RBT6这些完全没有压力甚至已经满足了推荐配置。
而且支持Keil、IAR、rt-thread studio、segger embedded studio等IDE开发零依赖零配置开箱即用极易集成进已有的C工程。
说了这么多,刘华强就有疑问了,你说这脚本,保熟吗?
![QQ截图20210911174834](https://user-images.githubusercontent.com/88232613/132943877-81031a9a-d152-4143-9cad-96db61e9b000.png)
我这开~~水果~~脚本摊儿的,能买你生脚本蛋子?
这就挑点儿Demo给哥儿几个瞧瞧。
这可都是STM32G070RBT6的Demo。
## Demo 01 万物起源点个灯
![mmexport1631351506111](https://user-images.githubusercontent.com/88232613/132943903-b3558929-a107-4a99-bdc4-1b3fd3f7172b.png)
看看这脚本可都是如假包换的Python3标准语法。
这灯不就闪起来了吗。
![Hnet-image (2)](https://user-images.githubusercontent.com/88232613/132943428-f2b365ca-140e-42f4-936c-db6a7d9f8dee.gif)
## Demo 02 串口测试
![mmexport1631351902469](https://user-images.githubusercontent.com/88232613/132944132-90898355-de94-4d81-990b-7b85d4a4d08a.png)
开个串口,读俩字符试试
![Hnet-image (3)](https://user-images.githubusercontent.com/88232613/132943365-0f7059b3-4f9d-4989-a5ec-2cce72b0cc96.gif)
非常顺滑
## Demo 03 读个ADC试试
![mmexport1631351527609](https://user-images.githubusercontent.com/88232613/132944180-a805c8f8-40d5-45ff-ae2a-a0fe8f9db1ab.png)
同样几行脚本搞定。
![mmexport1631351523907](https://user-images.githubusercontent.com/88232613/132944185-0a01b1ba-8cf7-4f9f-9d73-fe9cbcd52f0b.png)
这是输出的结果。
这几个Demo占用的RAM最大值只有3.56K把1K的堆栈也算上就是4.56KFlash最大占用是30.4K以STM32F103C8T6的20K RAM和64K Flash为标准RAM才用掉不到25%Flash才用掉不到50%,简直是资源多到不知道咋霍霍。
同样跑Python我们可以简单对比一下micropython的常用芯片STM32F405RG和这次跑PikaScript的芯片STM32G070CB
## RAM资源对比
![image](https://user-images.githubusercontent.com/88232613/132944731-a55ece1d-061f-4b91-ba87-bd6547be96a7.png)
## Flash资源对比
![image](https://user-images.githubusercontent.com/88232613/132944745-e9cf598d-e75f-40bb-873e-911819d535b7.png)
## 参考价对比(以2021年9月11日立创商城10片售价为参考
![image](https://user-images.githubusercontent.com/88232613/132944757-2b5cfda8-f93f-4456-8d7f-4e4767954056.png)
## 拓展能力如何呢?
除了设备驱动之外为mcu开发自定义的python脚本绑定在pikascript的开发框架下非常轻松下面两个Demo就是自定义的C模块拓展这个Demo基于ARM-2D图像驱动库开发了一些python脚本接口。
## 几个小方块~
![Hnet-image (7)](https://user-images.githubusercontent.com/88232613/132945282-bfd310df-8063-456d-b90c-6b798a2c8ed5.gif)
## 几个旋转太阳~
![Hnet-image (6)](https://user-images.githubusercontent.com/88232613/132945107-e473a2cc-9fbc-47f9-aaed-a28d3ad1048c.gif)
## 那PikaScript是开源的吗
当然这个就是PikaScript的github主页
https://github.com/pikasTech/pikascript
## 开发难不难?
PikaScript为开发者准备了丰富的Demo和由浅入深的开发指南指南还会持续完善和维护。
![image](https://user-images.githubusercontent.com/88232613/132945342-6ace05aa-50c4-4533-9129-ef131cd9fc1d.png)
## 可以商用吗?
当然PikaScript采用MIT协议允许修改和商用但是要注意保留原作者的署名。
## 结语
本篇主要内容到此结束想要继续了解PikaScript可以看看往期文章~
都看到这了还不去github主页逛逛嘛
![image](https://user-images.githubusercontent.com/88232613/132945415-4fb38ee9-1028-44a5-9348-955a54175c85.png)
加入微信交流群获得更多技术支持,以及和群里的大佬吹水~
![image](https://user-images.githubusercontent.com/88232613/132945424-95ac119b-3f78-4def-8cad-8917866c5e13.png)
[https://pikadoc.readthedocs.io/zh/latest/index.html](https://pikadoc.readthedocs.io/zh/latest/index.html)

View File

@ -1,149 +1,3 @@
# 0.前言
document is moved to :
好消息! pikascript的Arm2D模块以及仿真工程初步整理好了pikaScriptARM-2Drt-thread齐活儿解锁python玩Arm2D的新姿势还不需要硬件可以直接仿真可以说是非常方便了。
下面就是仿真的效果使用python编程调用Arm2d~
![image](https://user-images.githubusercontent.com/88232613/132945282-bfd310df-8063-456d-b90c-6b798a2c8ed5.gif)
![image](https://user-images.githubusercontent.com/88232613/132945107-e473a2cc-9fbc-47f9-aaed-a28d3ad1048c.gif)
在自己的电脑上部署运行这个仿真工程也非常简单,按照下面的几步操作就可以了~
# 1.获得仿真工程
首先进入PikaScript的代码仓库
https://github.com/pikastech/pikascript (需要科学上网)
![image](https://user-images.githubusercontent.com/88232613/139675132-739ec77b-db22-4ed9-a670-77ec7544d1b9.png)
然后点一个Star
如果进不去的话,就进下面这个
https://gitee.com/Lyon1998/pikascript (国内也能上)
![image](https://user-images.githubusercontent.com/88232613/139675170-fe0ce449-872f-466e-8780-74465730178a.png)
然后也点一个Star
等你点完Star我们开始下一步操作。
我们从代码仓库的主页往下翻看到Get PikaScript然后点PikaPackage.exe下载pikascript的包管理器。
![image](https://user-images.githubusercontent.com/88232613/139675454-596829d1-0325-42ab-96c5-f3d3d369d7d4.png)
Gitee上的也是一样的任选一个即可。
![image](https://user-images.githubusercontent.com/88232613/139675486-0f63e7b4-669d-4370-80ad-134c0f28f203.png)
下面把PikaPackage.exe放到你想要下载PikaScript的磁盘为了节省你的C盘你可以把PikaPackage.exe放在D盘可以是D盘的任意位置。
双击PikaPackage.exe包管理器就会自动帮你把最新的PikaScript下载到D:/tmp/pikascript文件夹中。(如果放在C盘就会下载到C:/tmp/pikascript)
下载使用的是国内资源,不需要科学上网,速度应该很不错。
下载完之后就可以删掉这个pikaPackage.exe了。
顺利的话,你就可以在/tmp/pikascript文件夹下找到下载好的pikascript代码仓库了。
![image](https://user-images.githubusercontent.com/88232613/139676635-c3f1c6ae-ab44-42a5-ab9a-9bedd2383f31.png)
我们进入bsp文件夹拷贝一份simulation-rtt-qemu-arm2d出来。
![image](https://user-images.githubusercontent.com/88232613/139677151-33c1dbd0-c2f2-4ea3-a5ae-569e5a448cce.png)
到此为止工程就准备ok了。
# 2.安装开发环境
有了工程之后还需要安装开发环境需要安装的只有两个东西一个是rt-thread studio用来做IDErt-thread studio里面集成了qemu用来仿真mcu和gui非常方便。另一个是最新的arm gcc工具链。
## rt-thread studio 安装包链接
https://download-sh-cmcc.rt-thread.org:9151/www/studio/download/RT-Thread%20Studio-v2.1.2-setup-x86_64_20210831-1200.exe
## arm gcc 安装包链接
https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-win32.exe
rt-thread studio装在你喜欢的地方就可以arm gcc要装在默认的c盘。
装好之后就可以开始用python玩arm-2d了。
# 3.拉取模块并预编译
我们进入simulation-rtt-qemu-arm2d/packages/pikascrpt目录这个目录就是pikascrit的文件了。
![image](https://user-images.githubusercontent.com/88232613/139678258-e2cdc50d-475b-435a-af8c-7c19cc3a218d.png)
为了版本管理的方便pikascript使用requestment.txt管理内核和模块的版本所以这个文件夹里没有pikascript的源码只有一个requestment.txt文件如果熟悉pip就会发现这个文件和pip所使用的版本描述文件是一模一样的。
![image](https://user-images.githubusercontent.com/88232613/139678404-9b747c0a-6508-4f6d-b0ca-671560f31fbd.png)
我们双击运行这个文件夹下的pikaPackage.exepikascript的内核和模块就拉取下来了。
![image](https://user-images.githubusercontent.com/88232613/139678437-a77b7278-cafd-485e-b353-94a12302c8cb.png)
拉下来之后是这样的。
![image](https://user-images.githubusercontent.com/88232613/139678713-0cd86aef-2996-4898-931d-68c805534312.png)
最后我们再运行rust-msc-latest-win10.exe进行预编译就OK了。
![image](https://user-images.githubusercontent.com/88232613/139678750-befc11e9-d812-4fcf-949e-64dd873d0211.png)
# 4.运行
我们打开RT-Thread Studio点击导入
![image](https://user-images.githubusercontent.com/88232613/139679061-2e3b2ea0-8e9a-44c9-9a0f-6f40d82a0208.png)
然后选择simulation-rtt-qemu-arm2d文件夹
![image](https://user-images.githubusercontent.com/88232613/139679380-3a45f426-e575-4142-b5f1-76439c7efc38.png)
选择工程,然后点锤子编译,再点虫子进入仿真
![image](https://user-images.githubusercontent.com/88232613/139679532-e19ed911-c7f4-4840-a5e3-f5b66905a62f.png)
这时会弹出一个QEMU的框然后点击运行。
![image](https://user-images.githubusercontent.com/88232613/139679756-cb099fc9-c3e9-4b76-9037-38392350530b.png)
运行成功的话,就可以看到白色背景上有一个蓝色的小方块了。到此为止部署就成功了。
![image](https://user-images.githubusercontent.com/88232613/139679797-3ce8f253-beb9-480f-90ee-1844500a77ab.png)
# 5.修改python代码试试
python的源码就在simulation-rtt-qemu-arm2d/packages/pikascript/main.py里面可以打开看看~
![image](https://user-images.githubusercontent.com/88232613/139679915-45d1362e-7066-4829-ae83-b4bbc5d0aaa0.png)
下面就是main.py的内容新建了一个box对象然后设置了颜色和位置你可以试着修改颜色为'red'或者改一下坐标看看也可以新建另一个screen.elems.b2试试。
![image](https://user-images.githubusercontent.com/88232613/139680125-11ff47b3-e75e-47f4-8dd7-5b310c5be16c.png)
每次修改完后要记得预编译才能把python转为工程里的.c文件
![image](https://user-images.githubusercontent.com/88232613/139680376-b9681759-971a-43f7-9282-ee0e35a367a5.png)
然后再编译,进入仿真,就可以看到效果了。这次我把方块改成了红色。
![image](https://user-images.githubusercontent.com/88232613/139680521-20f83ee3-2163-4649-ad23-ae73b77f482e.png)
# 6.结语
这是Arm-2D的仓库~ 还没star的同学记得补个star~
https://github.com/ARM-software/EndpointAI
![image](https://user-images.githubusercontent.com/88232613/139681272-73a1a8c2-2889-4dab-bd05-7174cb14334c.png)
感谢liuduanfei大佬提供的rtt-Arm2d-qemu仿真工程~ 下面是liuduanfei大佬的github主页
![image](https://user-images.githubusercontent.com/88232613/139681543-99a64e9b-eb10-4c8e-bbe3-e8170c85385a.png)
https://github.com/liuduanfei
[https://pikadoc.readthedocs.io/zh/latest/index.html](https://pikadoc.readthedocs.io/zh/latest/index.html)

View File

@ -1,190 +1,3 @@
# Pika派开发板游玩指南到手的开发板玩起来
document is moved to :
今天我们不聊驱动开发还有架构原理这些令人头大的硬核内容我们就单纯的用Pika派开发板玩玩Python编程
在单片机上点亮一个“人生苦短我用Python”的成就
观看此篇文章的读者想必大部分手里已经有一块Pika派如果没有的话也可以去淘宝店铺搜索“皮卡派”就可以找到了~
开发板长下面这个样子板载一个STM32芯片型号是STM32G030上面有4个炫彩RGB和一个串口转USB芯片采用Type-C接口。
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/193551_ac53c408_5521445.png "屏幕截图.png")
这个开发板由PikaScript项目官方支持持续滚动更新PikaScript的最新内核最新功能都可以在这个开发板上抢先体验到。
这个开发板也由项目官方适配了大量外设驱动、包括GPIO、TIME、ADC、IIC、LCD、KEY、PWM等模块的驱动都已经开发好可以直接用python进行编程。
## 如何给单片机下载Python程序
下载方法非常简单只需要连接上Type-C数据线就可以了。
然后我们点examples文件夹
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/200332_3e87979e_5521445.png "屏幕截图.png")
我们用一根USB数据线连接电脑和Pika派开发板就可以下载程序了。
下载程序的时候需要使用一个串口助手工具我们可以使用正点原子开发的XCOM助手在正点原子的论坛可以下载到。
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/200618_b8f264a8_5521445.png "屏幕截图.png")
选择好COM口然后波特率选为115200再点打开串口这时候就和Pika派连接上了。
这时候直接发送一个Pthon脚本文件就可以给Pika派下载Python程序了。
为了验证下载能不能成功我们使用PikaScript源码仓库里面的示例Python脚本。
我们进入PikaScript的代码仓库
https://gitee.com/Lyon1998/pikascript
惯例点一个Star~
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/201054_c22a0714_5521445.png "屏幕截图.png")
然后我们点击examples文件夹里面放的就是可以运行的Python例程了~
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/201133_2caa690c_5521445.png "屏幕截图.png")
我们打开GPIO文件夹来点亮一下流水灯看看~
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/201304_ee6f19c7_5521445.png "屏幕截图.png")
GPIO文件夹里面的main.py就是GPIO的示例代码了
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/201351_226525cc_5521445.png "屏幕截图.png")
我们可以点开main.py看看~
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/201416_4e812a19_5521445.png "屏幕截图.png")
先不解释里面的内容,我们直接下载这个脚本看看。
我们也在桌面新建一个main.py文件然后把这段代码复制进去。
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/201535_8f49da20_5521445.png "屏幕截图.png")
我们选择这个main.py文件
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/201639_79a783b1_5521445.png "屏幕截图.png")
然后点击"发送文件", 就可以把脚本下载进去了!
我们可以看到[ OK ]: Programing ok!的提示,这就是说明下载成功了!
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/201816_13337449_5521445.png "屏幕截图.png")
这时开发板上面的LED就会闪动起来
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/202935_f82345e6_5521445.png "屏幕截图.png")
恭喜你达成单片机玩Python的成就
## GPIO的脚本里写了什么?
下面我们来逐行解析一下GPIO的这个例程。
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/203322_8cbe563c_5521445.png "屏幕截图.png")
首先是第一行和第二行,这表示导入了两个模块,一个是```PikaStdLib```模块,一个是```STM32G0```模块。
PikaStdLib是PikaScript的标准库里面有一些系统的功能比如可以检查内存的占用。
第四行里面我们就新建了一个mem对象这个对象的类是PikaStdLib.MemChecker()。
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/203532_a3e2dc7b_5521445.png "屏幕截图.png")
这个类有max()方法和now()方法使用这两个方法就可以打印出当前PikaScript所使用的内存大小。
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/203657_3ef8a678_5521445.png "屏幕截图.png")
我们可以看看串口的打印输出可以看到最大的内存占用是1.51kB而当前的内存占用是0.61kB,是不是很小!
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/203737_1509b9db_5521445.png "屏幕截图.png")
time对象是通过STM32G0的Time()类新建的,可以提供基本的延时功能。
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/203848_4a13cdf4_5521445.png "屏幕截图.png")
通过time.sleep_ms()方法就可以按毫秒进行延时了比如下面代码的作用就是延时500ms。
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/203938_62748bd5_5521445.png "屏幕截图.png")
io1就是我们今天的主角了这是一个GPIO对象是用STM32G0.GPIO()类新建的。
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/204024_6adc51e3_5521445.png "屏幕截图.png")
在新建了io1对象之后我们要给这个io进行初始化init()用于对象初始化在最前面使用然后setPin('PA8')表示使用PA8口setMode('out')表示使用输出模式而enable()表示启动io1的硬件low()将io1的电平拉低。
PA8上连接了Pika派上面的一个led灯只要控制PA8的电平就可以控制灯的亮灭了。
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/204104_1f08a3b3_5521445.png "屏幕截图.png")
而在程序的主循环里面对io1进行高低电平的切换就可以使LED闪动了~
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/204301_0ec427ea_5521445.png "屏幕截图.png")
## 其他的Python例程解读
我们再解读一下examples里面的其他例程比如这个ADC例程就是读取PA1管脚上面的模拟电压值然后打印出来~
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/204751_8bb53225_5521445.png "屏幕截图.png")
下面是串口的例程,功能是读取收到的两个字节,然后打印出来
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/205006_0e0113df_5521445.png "屏幕截图.png")
再下面这个是PWM的例程可以指定管脚输出PWM波可以设置频率和占空比
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/205127_5f60a8d7_5521445.png "屏幕截图.png")
再下面这个就是RGB的例程了~
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/205232_6de29e2f_5521445.png "屏幕截图.png")
这个例程可以驱动板载的4个RGB流水灯~
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/205338_ae2e2de2_5521445.png "屏幕截图.png")
还有一个LCD的例程可以在LCD上面显示一个小方块而你可以使用板载的四个按键控制小方块运动~
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/210940_f30be3d5_5521445.png "屏幕截图.png")
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/211210_43b35b56_5521445.png "屏幕截图.png")
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/211404_c89d9a17_5521445.png "屏幕截图.png")
当你熟悉了LCD驱动之后可以试试自己开发小游戏哦~
## 固件升级
Pika派的固件是滚动更新的会不断推出新的固件版本不断提供新的功能而有一些新的功能只有升级固件才能玩到所以学会升级固件也是很重要的~
升级固件也是使用串口就可以了在升级时我们需要用bsp编译出一个固件的.bin文件如果你是一个动手能力很强的DIY爱好者可以自己编译固件编译的方法在视频里面~
https://www.bilibili.com/video/BV1c44y1v7Jd
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/205647_0d32ad97_5521445.png "屏幕截图.png")
如果你想用现成的固件也可以直接下载编译好的~
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/210126_d14c9754_5521445.png "屏幕截图.png")
点击下载就可以获得最新的固件了~
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/210155_5248a47c_5521445.png "屏幕截图.png")
下面需要让pika派进入升级模式我们按住开发板上面的SW0键同时按下RST键就可以进入升级模式了。
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/210422_3acb9ed0_5521445.png "屏幕截图.png")
在升级模式下,我们可以看到串口的提示信息
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/210526_b7b28342_5521445.png "屏幕截图.png")
然后我们用串口助手选择刚才下载的stm32g030c8.bin文件通过串口发送。
识别到固件后会显示Reciving....
![输入图片说明](https://images.gitee.com/uploads/images/2021/1122/210611_2fd707d0_5521445.png "屏幕截图.png")
发送完毕后再按一下RST键重启就完成升级了
[https://pikadoc.readthedocs.io/zh/latest/index.html](https://pikadoc.readthedocs.io/zh/latest/index.html)

View File

@ -1,285 +1,3 @@
前言:
document is moved to :
这是一个RTT设计大赛的参赛项目实现了在CH32V103 RISC-V平台基于rt-thread完成了PikaScript Python引擎的部署。
项目网页:
http://www.elecfans.com/project/938
(网页中还包含了视频展示)
下面是项目介绍的正文:
项目简介
PikaScript是一个完全重写的超轻量级python引擎具有完整的解释器字节码和虚拟机架构可以在少于4KB的RAM下运行用于小资源嵌入式系统。相比同类产品如MicroPythonLuaOS等资源占用减少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脚本模块用于测试脚本驱动拓展功能。
软件说明
0.摘要
PikaScript是一个完全重写的超轻量级python引擎具有完整的解释器字节码和虚拟机架构可以在少于4KB的RAM下运行用于小资源嵌入式系统。相比同类产品如MicroPythonLuaOS等资源占用减少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解释器如果还有其他方案请批评指正我麻溜修改。虽然相对于MicroPythonPikaScript没有那么完整的标准库支持但基本的运行时对象、控制流、交互式运行都是可以实现的且PikaScript的跨平台能力非常好在极限的依赖管理策略下PikaScript只依赖LibC在任何平台都几乎没有依赖缺失问题或许还能够运行在FPGA软核中理论上可行未验证
另外感谢Gitee提供的开源平台PikaScript刚刚被Gitee评委大佬们选入GVP——最有价值开源项目所以如果你现在打开Gitee首页大概率可以看到PikaScript的金色牌牌。
图片
PikaScript还入选了rt-thread软件包rt-thread真的是非常有活力的开源社区
图片
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固件有哪些部分。
图片
在图中标注黄色的部分是我们需要制作的,而绿色部分是跨平台的,我们只需要拉取源码进行编译即可,不需要修改。
从下往上看首先是需要一份PikaScript的BSPBSP也就是板级支持包这通常只要将厂商提供的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
图片
3.制作CH32V103的驱动模块
接下来我们制作CH32V103的驱动模块使得CH32V103上面的外设资源能够被Python脚本调用到。
在这个项目中我们制作了一个PikaScript的标准设备驱动什么是标准设备驱动呢我们先从其他的脚本技术说起比如MicroPython并没有统一的外设调用API这使得用户在使用不同的平台时都需要重新学习API比如下面这个是MicroPython在STM32F4平台驱动GPIO的代码。
图片
这个是ESP8266的
图片
可以明显看到在选择pin的管脚时一个用的是字符串而另一个用的是整型数驱动的API标准很混乱。
有没有什么办法能够统一外设的API使得用户只需要熟悉一套API就能够在任意平台通用呢
方法是有的就是PikaStdDevice标准设备驱动模块
图片
PikaStdDevice是一个抽象的设备驱动模块定义了所有的用户API而各个平台的驱动模块只要从PikaStdDevice继承就能够获得一模一样的用户API而PikaStdDevice内部会间接调用平台驱动通过多态特性重写底层的平台驱动就可以在不同的平台工作了
以GPIO模块为例以下是PikaStdDevice定义的用户API
图片
以下是PikaStdDevice需要重写的平台驱动
图片
而我们要制作的CH32V103的GPIO模块就从标准驱动模块中继承。
图片
通过这个方法我们就可以让STM32的驱动模块、CH32的驱动模块、ESP32的驱动模块有着一模一样的用户API用户只要熟悉了一套API就可以轻松使用支持了PikaScript标准驱动模块的所有平台这才是真正的跨平台
下面是部分被注册在驱动模块里面C原生驱动函数
图片
驱动模块的开发,我也制作了两个视频,供想要了解细节的大佬们参考。
https://www.bilibili.com/video/BV1aP4y1L7pi
https://www.bilibili.com/video/BV1Jr4y117Z8
图片图片
4.支持交互式运行
PikaScript不依赖文件系统只要传入字符串就可以运行所以只要制作支持字符串读取的串口驱动就可以支持交互式运行了
下面是本项目中支持交互式运行的驱动代码。
图片
5.main.py初始化脚本
图片
最后我们编写一段用Python写成的初始化脚本在固件启动后运行初始化GPIO并且获得一个系统对象用于提供延时功能。在初始化结束后led闪烁10次并打印hello pikascript
编写好初始化脚本后,用预编译器就可以集成在固件中了。
下面是预编译器生成的初始化函数
图片
项目地址:
PikaScript-CH32V103参赛项目仓库
https://gitee.com/lyon1998/ch32v103-pika
PikaScript总仓库
https://gitee.com/lyon1998/pikascript
https://github.com/pikastech/pikascript
PikaScript交流群
图片
[https://pikadoc.readthedocs.io/zh/latest/index.html](https://pikadoc.readthedocs.io/zh/latest/index.html)