mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-15 17:02:53 +08:00
redirect document link
This commit is contained in:
parent
ae62279eda
commit
454034ac2a
@ -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)
|
||||
|
@ -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是模块API,rust-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)
|
||||
|
@ -1,350 +1,3 @@
|
||||
## 3.Pikascript标准开发流程
|
||||
document is moved to :
|
||||
|
||||
本篇文档将会介绍基于PikaScript开发的标准流程,这个标准流程将会涵盖大部分情况下会用到的PikaScript相关技术。
|
||||
|
||||
我们依然以keil的仿真工程为例,如果还没有获得仿真工程,请参考[1.三分钟快速上手](1.三分钟快速上手.md)
|
||||
|
||||
## (1). 使用已有的PikaScript类包
|
||||
|
||||
### a) PikaScript类包与包接口
|
||||
我们打开pikascript文件夹,发现文件夹根目录下除了main.py,还有Device.py,PikaObj.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)
|
||||
|
@ -1 +1,4 @@
|
||||
document is moved to :
|
||||
|
||||
[https://pikadoc.readthedocs.io/zh/latest/index.html](https://pikadoc.readthedocs.io/zh/latest/index.html)
|
||||
|
||||
|
@ -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.56K,Flash最大占用是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)
|
||||
|
@ -1,149 +1,3 @@
|
||||
# 0.前言
|
||||
document is moved to :
|
||||
|
||||
好消息! pikascript的Arm2D模块以及仿真工程初步整理好了!pikaScript,ARM-2D,rt-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,用来做IDE,rt-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.exe,pikascript的内核和模块就拉取下来了。
|
||||
|
||||
![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)
|
||||
|
@ -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)
|
||||
|
@ -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下运行,用于小资源嵌入式系统。相比同类产品,如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脚本模块,用于测试脚本驱动拓展功能。
|
||||
|
||||
软件说明
|
||||
|
||||
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的金色牌牌。
|
||||
|
||||
|
||||
|
||||
图片
|
||||
|
||||
|
||||
|
||||
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的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
|
||||
|
||||
图片
|
||||
|
||||
|
||||
|
||||
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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user