From 454034ac2a4758e7db5fd9a54a6482d7ba960872 Mon Sep 17 00:00:00 2001 From: lyon1998 Date: Thu, 31 Mar 2022 11:59:01 +0800 Subject: [PATCH] redirect document link --- document/1.三分钟快速上手.md | 143 +------ document/2.十分钟快速部署.md | 136 +------ document/3.PikaScript标准开发流程.md | 351 +----------------- document/4.PikaScript内核Api手册.md | 3 + ...的单片机来跑python,还要用Keil开发,怎么地吧.md | 113 +----- document/6.用Python玩ARM 2D,认真的嘛.md | 150 +------- ...a派开发板游玩指南,到手的开发板玩起来!.md | 191 +--------- .../8. 沁恒RISC-V内核MCU32V103驱动开发实战 | 286 +------------- 8 files changed, 17 insertions(+), 1356 deletions(-) diff --git a/document/1.三分钟快速上手.md b/document/1.三分钟快速上手.md index 4c5acaf8a..673b8f456 100644 --- a/document/1.三分钟快速上手.md +++ b/document/1.三分钟快速上手.md @@ -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) diff --git a/document/2.十分钟快速部署.md b/document/2.十分钟快速部署.md index 2557762b9..673b8f456 100644 --- a/document/2.十分钟快速部署.md +++ b/document/2.十分钟快速部署.md @@ -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) diff --git a/document/3.PikaScript标准开发流程.md b/document/3.PikaScript标准开发流程.md index 16fe5bb47..673b8f456 100644 --- a/document/3.PikaScript标准开发流程.md +++ b/document/3.PikaScript标准开发流程.md @@ -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 -#include -#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 -#include -#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) diff --git a/document/4.PikaScript内核Api手册.md b/document/4.PikaScript内核Api手册.md index 8b1378917..1c33597d6 100644 --- a/document/4.PikaScript内核Api手册.md +++ b/document/4.PikaScript内核Api手册.md @@ -1 +1,4 @@ +document is moved to : + +[https://pikadoc.readthedocs.io/zh/latest/index.html](https://pikadoc.readthedocs.io/zh/latest/index.html) diff --git a/document/5.我就要用最便宜的单片机来跑python,还要用Keil开发,怎么地吧.md b/document/5.我就要用最便宜的单片机来跑python,还要用Keil开发,怎么地吧.md index 0584c89f1..673b8f456 100644 --- a/document/5.我就要用最便宜的单片机来跑python,还要用Keil开发,怎么地吧.md +++ b/document/5.我就要用最便宜的单片机来跑python,还要用Keil开发,怎么地吧.md @@ -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) diff --git a/document/6.用Python玩ARM 2D,认真的嘛.md b/document/6.用Python玩ARM 2D,认真的嘛.md index 0fca4b0f3..673b8f456 100644 --- a/document/6.用Python玩ARM 2D,认真的嘛.md +++ b/document/6.用Python玩ARM 2D,认真的嘛.md @@ -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) diff --git a/document/7.Pika派开发板游玩指南,到手的开发板玩起来!.md b/document/7.Pika派开发板游玩指南,到手的开发板玩起来!.md index 6d9c86da4..673b8f456 100644 --- a/document/7.Pika派开发板游玩指南,到手的开发板玩起来!.md +++ b/document/7.Pika派开发板游玩指南,到手的开发板玩起来!.md @@ -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) diff --git a/document/8. 沁恒RISC-V内核MCU32V103驱动开发实战 b/document/8. 沁恒RISC-V内核MCU32V103驱动开发实战 index e222d34e3..673b8f456 100644 --- a/document/8. 沁恒RISC-V内核MCU32V103驱动开发实战 +++ b/document/8. 沁恒RISC-V内核MCU32V103驱动开发实战 @@ -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)