4.1. 十分钟部署到新平台

4.1.1. 如何选择可以运行 pikapython 的平台

  • PikaPython 可以在所有 支持 libc裸机操作系统上运行。

  • 编译器需要能够支持 C99 标准

  • 支持 32位/64位 内核,不支持 8 位内核。

  • 资源占用

    • 如果是 arm 内核,考虑到拓展模块的资源占用,最低应该配备 64k flash8k ram

    • 如果是 risc-v 内核,则需要 128k flash8k ram , 因为 risc-v 内核的 gcc 优化以及代码密度等问题,代码体积比 arm 内核大很多。

    • 如果是 其他内核,可以参考 risc-v 的配置需求。

  • 如果是 PC /服务器平台,则 linux/windows 均可。

在本篇文档中,将会介绍为新平台部署 PikaPython 的方法。PikaPython 几乎没有全局变量和宏仅依赖标准库,因此为新平台部署 PikaPython 是非常容易的。

下面是部署 PikaPython 的具体步骤

4.1.2. 准备模板工程

你的模板工程仅需要包含一个支持 printf 串口初始化,然后就可以愉快地使用 pikapython 了。 通常的脚本解释器都依赖操作系统文件系统,而 pikapython 不需要这些,如果你部署过其他的脚本引擎,就会发现 PikaScrip 具有真正的超轻量级特性。

4.1.3. 下载 PikaPython 包管理器

PikaPython 包管理器可以帮助你拉取 pikapython 所需要的所有源码工具,并且提供版本选择功能,方便你切换版本。并且 PikaPython 包管理器使用 gitee 源,能够在大陆顺畅地使用,不需要科学上网。

进入 PikaPython 主仓库

https://github.com/pikastech/pikapython

或者:

https://gitee.com/lyon1998/pikapython

下载 PikaPython 包管理器 PikaPackage.exe

_images/1638721231166-cca4d1c4-d8a7-4cfd-be3c-fee9a548c10d-164649951515223.png

然后打开你要部署的工程,在工程的根目录下新建 pikapython 文件夹,然后把 PikaPackage.exe 复制进去。

_images/142019778-c727336c-9b6a-4a82-b813-1671f4120152.png

4.1.4. 编写 main.py

接下来编写 pikapython 运行的 python 脚本,我们在 pikapython 文件夹新建一个 main.py 文件。

然后写入:

print('hello PikaPython!')

在后续步骤中,这个脚本会被 pikapython 解释器运行,到时候如果你看到 hello PikaPython! 的输出,就说明 pikapython 已经成功运行了。

4.1.5. 安装模块

接下来,在 PikaPackage.exe 的帮助下我们可以轻松地拉取指定版本的源码和模块。拉取源码和模块通过一个requestment.txt 的文件,如果你熟悉 python 的 pip 包管理器,就会发现,pikapython 的 requestment.txt 文件格式与 pip 是一致的。

在项目的 pikapython 文件夹下新建一个 requestment.txt 文件,然后写入以下内容。

pikascript-core
PikaStdLib

requestment.txt 文件中表示表示安装 pikascript-core 解释器内核和 PikaStdLib 标准库,解释器内核和标准库是必选项,而其他的模块可以有选择地添加,在初次部署时,应当只添加内核和标准库以避免遇到兼容性问题。

双击运行 pikaPackage.exe,在 requestmemt.txt 中指定的源码和模块就会被拉取下来。

_images/142022949-54585060-8612-42a8-a585-8c3e514a8be3.png

拉取后的文件如下图所示,pikascript-core 是内核源码,pikascript-lib 是模块库,pikascript-api 是模块 API , rust-msc-latest-win10.exe 是 pikapython 专用的预编译器。

_images/142023882-51ee4013-8318-483e-8ea4-5c57a5ffb6c6.png

安装完毕后,包管理器会自动锁定版本,requestment.txt 会变成类似下面这样

pikascript-core==v1.11.0
PikaStdLib==v1.11.0

如果你想升级版本,在 requestment.txt 中修改版本号然后再次运行 pikaPackage.exe 即可,原先的版本会被覆盖。

4.1.6. 预编译模块

接下来运行 rust-msc-latest-win10.exe,将 main.py 和导入的模块预编译为 pikapython 的 api 文件,预编译后的文件在 pikascript-api 文件夹内。

_images/1644385072048-6354164c-e040-4318-a947-0114125e2d1d.png

我们打开 pikascript-api 文件夹,发现里面有一些 .c 和 .h 文件,就说明预编译是成功的,pikapython 预编译器可以把 python 模块预编译为 .c 和 .h 文件。

image-20231219173420551

如果想要查看预编译的 Log 输出,则可以用 CMD 运行预编译器:

image-20231219173619510

然后在 CMD 里面输入 rust-msc-latest-win10.exe 运行(小技巧:可以输入一部分然后按 TAB 自动补全)。

image-20231219173652157

从输出的 Log 看没有 Error 相关的信息,说明预编译是成功的。

4.1.7. 添加源码

在 Project 中新建三个 group ,建议命名为 pikascript-core, pikascript-api 和 pikascript-lib

_images/130967351-597b8f6b-cc4e-4bc3-9cb6-2f335e5dccea.png

然后将 pikapython 文件夹内的三个子文件夹下的 .c 文件(包括 pikascript-lib 里的子文件夹)全部添加到 keil 工程里(实际的 .c 文件个数可能和截图不一致,全部添加即可。)

_images/130971776-41d8c940-42d0-407d-872e-53525ce299a6.png

再然后为 pikascript-core 和 pikascript-api 文件夹添加 include 路径

_images/130967813-94016b8a-e408-4b49-b1e1-76a5df5fe984.png

_images/130967949-8399c65b-5584-4674-a947-e40103d953ea.png

4.1.8. 调整堆栈

打开工程的启动文件, 在 stm32 中, 这是一个 startup_stm32xxxx.s 的文件,而在其他平台上,你要自己弄清楚如何调整堆栈。

_images/130966276-24014a0a-90a6-4bd7-96b7-fde54806b8c3.png

建议分配 4K 的栈空间和 16K 的堆空间,最少也需要分配 1K 的栈空间和 4K 的堆空间

4K 栈空间对应 0x1000, 16K 堆空间对应 0x4000,如下图所示

_images/130967178-a985a4f5-730c-47fd-9317-68f33bc00066.png

4.1.9. 启动 PikaPython

在 main.c 的初始化代码中添加 PikaPython 的启动代码。

  • 添加头文件

在头文件中加入

 #include "pikascript.h"

_images/130969048-4def9902-5f36-4798-9eac-ebbb1441087f.png

  • 初始化 pikapython 并得到 pikapython 主对象的指针 pikaMain

在 main 函数中加入一句启动代码

PikaObj* pikaMain = pikaScriptInit();

_images/130969274-ff2fdf6f-2389-466b-b51e-e7bc33472558.png

结束了?对,结束了,就这么简单,是不是很神奇。

这是因为预编译器在背后做了很多辅助工作,包括自动生成 pikaScriptInit() 函数。

4.1.10. 编译源码

编译源码时需要勾选 C99 标准,而编译优化等级可以任意选择,pikapython 均支持。

_images/130968626-7d8d4f46-eb0c-4ccd-9c34-eab160b290f5.png

然后直接编译即可,一般来说是可以直接通过的,使用 compiler version 5 或者 compiler version 6 均可。

4.1.11. 深入适配

深入适配包括对终端交互运行、文件系统、RTOS 等高级功能的进一步支持,参考文档:深入适配指导章节。