# 十分钟部署到新平台 ## 如何选择可以运行 pikapython 的平台 - PikaPython 可以在所有 **支持 libc** 的**裸机**和**操作系统**上运行。 - 编译器需要能够支持 **C99 标准**。 - 支持 **32位/64位** 内核,**不支持 8 位**内核。 - 资源占用 - 如果是 **arm** 内核,考虑到拓展模块的资源占用,最低应该配备 **64k flash** 和 **8k ram**。 - 如果是 **risc-v** 内核,则需要 **128k flash**和 **8k ram** , 因为 risc-v 内核的 gcc 优化以及代码密度等问题,代码体积比 arm 内核大很多。 - 如果是 **其他内核**,可以参考 risc-v 的配置需求。 - 如果是 PC /服务器平台,则 linux/windows 均可。 在本篇文档中,将会介绍为新平台部署 PikaPython 的方法。PikaPython 几乎**没有全局变量和宏**,**仅依赖标准库**,因此为新平台部署 PikaPython 是非常容易的。 下面是部署 PikaPython 的具体步骤 ## 准备模板工程 你的模板工程仅需要包含一个支持 **printf **的**串口初始化**,然后就可以愉快地使用 pikapython 了。 通常的脚本解释器都依赖**操作系统**和**文件系统**,而 pikapython **不需要**这些,如果你部署过其他的脚本引擎,就会发现 PikaScrip 具有**真正的超轻量级**特性。 ## 下载 PikaPython 包管理器 PikaPython 包管理器可以帮助你拉取 pikapython 所需要的所有**源码**和**工具**,并且提供**版本选择**功能,方便你切换版本。并且 PikaPython 包管理器使用 **gitee 源**,能够在大陆顺畅地使用,**不需要**科学上网。 进入 PikaPython 主仓库 [https://github.com/pikastech/pikapython](https://github.com/pikastech/pikapython) 或者: [https://gitee.com/lyon1998/pikapython](https://gitee.com/lyon1998/pikapython) 下载 PikaPython 包管理器 PikaPackage.exe ![](assets/1638721231166-cca4d1c4-d8a7-4cfd-be3c-fee9a548c10d-164649951515223.png) 然后打开你要部署的工程,在工程的根目录下新建 pikapython 文件夹,然后把 PikaPackage.exe 复制进去。 ![](assets/142019778-c727336c-9b6a-4a82-b813-1671f4120152.png) ## 编写 main.py 接下来编写 pikapython 运行的 python 脚本,我们在 pikapython 文件夹新建一个 main.py 文件。 然后写入: ``` python print('hello PikaPython!') ``` 在后续步骤中,这个脚本会被 pikapython 解释器运行,到时候如果你看到 `hello PikaPython!` 的输出,就说明 pikapython 已经成功运行了。 ## 安装模块 接下来,在 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 中指定的源码和模块就会被拉取下来。 ![](assets/142022949-54585060-8612-42a8-a585-8c3e514a8be3.png) 拉取后的文件如下图所示,pikascript-core 是内核源码,pikascript-lib 是模块库,pikascript-api 是模块 API , rust-msc-latest-win10.exe 是 pikapython 专用的预编译器。 ![](assets/142023882-51ee4013-8318-483e-8ea4-5c57a5ffb6c6.png) 安装完毕后,包管理器会自动锁定版本,requestment.txt 会变成类似下面这样 ``` pikascript-core==v1.11.0 PikaStdLib==v1.11.0 ``` 如果你想升级版本,在 requestment.txt 中修改版本号然后再次运行 pikaPackage.exe 即可,原先的版本会被覆盖。 ## 预编译模块 接下来运行 rust-msc-latest-win10.exe,将 main.py 和导入的模块预编译为 pikapython 的 api 文件,预编译后的文件在 pikascript-api 文件夹内。 ![](assets/1644385072048-6354164c-e040-4318-a947-0114125e2d1d.png) 我们打开 pikascript-api 文件夹,发现里面有一些 .c 和 .h 文件,就说明预编译是成功的,pikapython 预编译器可以把 **python 模块**预编译为 .c 和 .h 文件。 ![image-20231219173420551](assets/image-20231219173420551.png) 如果想要查看预编译的 Log 输出,则可以用 CMD 运行预编译器: ![image-20231219173619510](assets/image-20231219173619510.png) 然后在 CMD 里面输入 rust-msc-latest-win10.exe 运行(小技巧:可以输入一部分然后按 TAB 自动补全)。 ![image-20231219173652157](assets/image-20231219173652157.png) 从输出的 Log 看没有 Error 相关的信息,说明预编译是成功的。 ## 添加源码 在 Project 中新建三个 group ,建议命名为 pikascript-core, pikascript-api 和 pikascript-lib ![](assets/130967351-597b8f6b-cc4e-4bc3-9cb6-2f335e5dccea.png) 然后将 pikapython 文件夹内的三个子文件夹下的 .c 文件(包括 pikascript-lib 里的子文件夹)全部添加到 keil 工程里(实际的 .c 文件个数可能和截图不一致,全部添加即可。) ![](assets/130971776-41d8c940-42d0-407d-872e-53525ce299a6.png) 再然后为 pikascript-core 和 pikascript-api 文件夹添加 include 路径 ![](assets/130967813-94016b8a-e408-4b49-b1e1-76a5df5fe984.png) ![](assets/130967949-8399c65b-5584-4674-a947-e40103d953ea.png) ## 调整堆栈 打开工程的启动文件, 在 stm32 中, 这是一个 startup_stm32xxxx.s 的文件,而在其他平台上,你要自己弄清楚如何调整堆栈。 ![](assets/130966276-24014a0a-90a6-4bd7-96b7-fde54806b8c3.png) 建议分配 4K 的栈空间和 16K 的堆空间,最少也需要分配 1K 的栈空间和 4K 的堆空间 4K 栈空间对应 0x1000, 16K 堆空间对应 0x4000,如下图所示 ![](assets/130967178-a985a4f5-730c-47fd-9317-68f33bc00066.png) ## 启动 PikaPython 在 main.c 的初始化代码中添加 PikaPython 的启动代码。 - 添加头文件 在头文件中加入 ```c #include "pikascript.h" ``` ![](assets/130969048-4def9902-5f36-4798-9eac-ebbb1441087f.png) - 初始化 pikapython 并得到 pikapython 主对象的指针 pikaMain 在 main 函数中加入一句启动代码 ```c PikaObj* pikaMain = pikaScriptInit(); ``` ![](assets/130969274-ff2fdf6f-2389-466b-b51e-e7bc33472558.png) 结束了?对,结束了,就这么简单,是不是很神奇。 这是因为预编译器在背后做了很多辅助工作,包括自动生成 `pikaScriptInit()` 函数。 ## 编译源码 编译源码时需要勾选 C99 标准,而编译优化等级可以任意选择,pikapython 均支持。 ![](assets/130968626-7d8d4f46-eb0c-4ccd-9c34-eab160b290f5.png) 然后直接编译即可,一般来说是可以直接通过的,使用 compiler version 5 或者 compiler version 6 均可。 ## 深入适配 深入适配包括对终端交互运行、文件系统、RTOS 等高级功能的进一步支持,参考文档:[深入适配指导](port_guide.html)章节。