页次: 1
地址 http://pikapython.com:22010
体验账户:test@test.com
密码:testtest
说明:
1. 知识库主要基于 PikaPython 文档构建
2. 知识内容提问效果较好,直接询问代码的效果还一般
的确是没有限制在嵌入式,但是多个方向都去推广的话还是精力存在限制,当然我们也很欢迎和感谢有大佬加入,去做做windows里面的专题性的探索
目前这些资料里面是在windows里面跑的,可以参考一下:
1. PikaPython ESP32专题实战 (前面有一些vs下的模拟开发) https://www.bilibili.com/video/BV1zh4y1T7Vi
2. 💻 pikapython-msvc-qt 移植pikapython到windows平台,基于QT,采用MSVC编译器,移植pthread库,支持多线程。
https://gitee.com/SenySunny/pikapython-msvc-qt
3. https://gitee.com/SenySunny/modbus_rt modbus_rt 是一个跨平台的 modbus 库,原生提供了 pikapython 的支持,其中也包括对 windows 平台的支持
@XianGe
我在另一个帖子里面回复了:https://whycan.com/p_103273.html#p103273
rust-msc-latest-win10.exe 预编译器命令
1. 默认从入口脚本开始,收集依赖,全部编译并打包,默认入口脚本为 main.py
绑定C模块并编译主文件生成 pikaModules.py.a:
rust-msc-latest-win10.exe
2. 指定脚本入口编译并打包
编译指定入口脚本.py文件生成默认输出:
rust-msc-latest-win10.exe test.py
3. 自定义输出文件
将编译结果输出到指定文件:
rust-msc-latest-win10.exe test.py -o out.a
4. 生成字节码,仅编译单个脚本生成 .py.o 文件:
rust-msc-latest-win10.exe -c main.py
5. 生成字节码,指定文件名
自定义编译输出文件名:
rust-msc-latest-win10 -c main.py -o custom.o
@lyon1998
另外如果是从 XIP flash 里面启动 .a,那么缓存用的 RAM 都省掉了,这样是最快且省内存的
我自己做项目的工程一般是这样设计的:
1. 准备文件系统,同时也给 .a 划分一块 xip flash
2. 支持串口发送.a,写入到文件系统,然后重启
3. 上电启动时,文件是否有 .a 如果有,那将文件中的 .a 写入到 xip flash,然后删除文件
4. 从 xip flash 启动
这种方式可以做到的优势:
1. 能够动态更新 python 脚本
2. python 脚本编译为 .a 的过程提前放到了 PC 进行,速度很快
3. 从 xip flash 中启动 .a 完全不需要缓存字节码,秒启动且 RAM 占用最低
但是我的脚本文件是需要再PC端编写好代码后,再发给MCU运行,obj_runModule(newAi->pikaMain,"main");这里的main是运行pikapython根目录下那个文件吗
这个是可以实现的,只不过两种路径。
1. 就是发python原文件给MCU,然后MCU编译出.a,然后运行
2. 在PC把python(更新后的),在 PC 编译出.a,然后发送给MCU,然后运行
路径2也是可以实现动态刷新的,而且启动快,通过串口/网口等把.a发过去,然后把.a存到文件系统/FLASH,再加载运行
推荐你看看这个视频讲解,里面有详细的启动流程的说明 https://www.bilibili.com/video/BV1zh4y1T7Vi/
可以参考下面的代码,代表了几种典型的启动方式
PikaObj *root = newRootObj("pikaMain", New_PikaMain);
FILE *fp = fopen(PIKA_SHELL_SAVE_APP_PATH, "rb");
if (fp != NULL) {
fclose(fp);
printf("[Info] load app from sd card\n");
obj_linkLibraryFile(root, PIKA_SHELL_SAVE_APP_PATH); // 从文件中加载 .a 启动
obj_runModule(root, "main");
} else {
printf("[Info] load app from firmware\n");
extern unsigned char pikaModules_py_a[];
obj_linkLibrary(root, pikaModules_py_a); // 从 flash 中加载 .a 启动
}
pikaPythonShell(root);
while (1) {
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
这个代码的出处在 https://gitee.com/Lyon1998/pikapython_openhardware/blob/master/PIKA_PI_WIRELESS_FIRMWARE/main/main.c
你可以参考一下这个工程,里面的功能是比较多的
用预编译器(就是你说的那个rust程序)就可以生成字节码,实际上打包是生成字节码的后续步骤,先生成字节码再打包
参考视频:【对python进行编译链接,下载进单片机!】 https://www.bilibili.com/video/BV14t4y1x7nv/?share_source=copy_web&vd_source=2129601400eeeeff48386eb3d1e04ad2
新年的征程刚刚启航,首届PikaPython开发者大会即将在B站与你相遇!这款超轻量级Python解释器,开箱即用,让你在仅4KB的RAM上也能享受编程的乐趣。它是完全独立的,不需外部依赖,非常适合需要迅速部署的项目。如果你对嵌入式脚本编程感兴趣,那么PikaPython将会是你嵌入式项目的新伙伴。
📌 今晚议程精彩看点:
🛠️ 快速了解PikaPython: PikaPython不仅仅是一个脚本引擎,它也是一个由国内开发者发起的、遵循MIT开源协议的项目,代表了嵌入式系统在轻量级编程领域的最新进展。它结合了Python的易用性和C语言的扩展性,使得即使在资源受限的硬件上也能轻松应对各种编程挑战。
🌐 加入我们的直播间,一同探索PikaPython的无限可能!
准备好你的问题和想法,今晚在B站,我们一起深入探讨PikaPython将如何为嵌入式开源世界带来变革。
首届PikaPython开发者大会,我们不见不散! 🌟
欢迎加入直播预约群,第一时间获取直播动态:
轻松掌握 PikaPython:编译与应用教程(Makefile & CMake)
作者:程住气
校对:李昂
想要轻松入门 PikaPython 编程吗?本文将引导您在支持 Makefile 和 CMake 的开发平台上迈出第一步。无论您是初学者还是希望将 PikaPython 应用于实际项目,本指南都能助您一臂之力。
教程中的 makefile 和 CMake 工程可以在 Win 上运行,这样可以快速进行测试和进行仿真运行,后面可以移植到你的实际硬件平台上(例如 STM32、ESP32等)。
在开始教程之前,让我们先简要了解一下 PikaPython。
PikaPython 是一个轻量级的嵌入式 Python 解释器,专为资源受限的嵌入式系统设计。它提供了 Python 语言的核心功能,同时优化了内存和处理能力的使用,使得即使在硬件资源有限的环境下也能高效运行。
PikaPython 的目标是为嵌入式开发者提供一个易于使用、灵活且功能丰富的编程工具,无论是初学者还是有经验的开发者,都可以利用PikaPython在各种嵌入式设备上实现高效的 Python 编程。
1.PikaPython 官网
参考资料来源:https://pikapython.com
2.先下载包管理器:用于拉取pikapython的源码
3.拉取内核源码
新建记事本requestment.txt,输入下面内容。
(没有这步,包管理器会自动新建 requestment.txt)
pikascript-core
PikaStdLib
其他可用版本查看:https://gitee.com/Lyon1998/pikascript/blob/master/packages.toml
然后执行包管理器,进行拉取代码。
运行预编译rust-msc-latest-win10.exe,它会将 python 文件预编译到pikascript-api 中的 C 文件中去
新建main.c文件,代码如下:
#include<stdio.h>
#include"pikascript.h"
int main(int argc,char **argv)
{
printf("hello world\r\n");
//固件启动,需要编译
PikaObj* pikaMain = pikaScriptInit();
}
5.内核编译
官方视频 (https://www.bilibili.com/video/BV1zh4y1T7Vi) 是用 visual studio 来做的,这个软件太大了,家里网速慢,同时电脑有现成的 vscode,所以将分别采用 WIN 环境下 makefile 和 CMAKE 来编译。(其实是后续的 ESP32 视频,编译用的是 CMAKE,看不懂所以回头学了 CMAKE + makefile)
下载和安装MinGW32
下载地址:https://www.onlinedown.net/soft/10056269.htm
解压后,添加环境变量后:
1.新建makefile文件,代码如下
2.执行make
TAR = pikapython
# 添加头文件搜索路径
INC = -I ./ -I ./pikascript-core -I ./pikascript-api -I ./pikascript-lib/PikaStdLib
# 寻找源文件.c
SOURCES = $(wildcard *.c ./pikascript-api/*.c ./pikascript-core/*.c ./pikascript-lib/PikaStdLib/*.c)
OBJ = $(patsubst %.c,%.o,$(SOURCES))
# test:
# @echo $(SOURCES)
$(TAR):$(OBJ)
gcc $^ -o $@ $(INC)
%.o:%.c
gcc -c $^ -o $@ $(INC)
clean:
rm -rf *.o ./**/*.o ./**/**/*.o $(TAR)
CMAKE环境搭建:下载地址:https://cmake.org/download/
cmake --help 验证是否安装成功
CMAKE开始:
1.新建CMakeLists.txt文件,代码如下:
# 指定使用的 cmake 的最低版本,可选,非必须,如果不加可能会有警告
cmake_minimum_required(VERSION 3.10)
# 生成工程名字
project(pikapython)
# GLOB查找.c文件
file(GLOB API_SRC ${CMAKE_CURRENT_SOURCE_DIR}/pikascript-api/*.c)
file(GLOB CORE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/pikascript-core/*.c)
file(GLOB LIB_SRC ${CMAKE_CURRENT_SOURCE_DIR}/pikascript-lib/PikaStdLib/*.c)
# 将所有的源文件组合在一起
set(SOURCE_FILES ${API_SRC} ${CORE_SRC} ${LIB_SRC} main.c)
# message("所有的.c文件:",${SOURCE_FILES})
# 添加头文件搜索路径
include_directories(${CMAKE_SOURCE_DIR}/pikascript-core)
include_directories(${CMAKE_SOURCE_DIR}/pikascript-api)
include_directories(${CMAKE_SOURCE_DIR}/pikascript-lib/PikaStdLib)
# 定义工程会生成一个可执行程序
add_executable(pikapython ${SOURCE_FILES})
2.新建build文件夹,然后进入build文件
3. cmake ..
4. make
(2.3的步骤是为了简洁工程,cmake会生成一堆中间文件,这样中间文件全部在build文件夹里了)
1. 修改main.py文件,加一句print('hello world!')
2. 运行预编译rust-msc-latest-win10.exe
3. 编译内核makefile/cmake
4. 执行
想要深入了解 PikaPython?请访问官网 (https://pikapython.com) 的文档中心:
后续你可以将 PikaPython 移植到你的产品的硬件平台上(例如 STM32、ESP32等),如果在使用中有任何疑问,欢迎加入交流群:577623681(QQ群)
@耳东陈
append之后加一个arg_deinit(),因为list的append操作会拷贝一份arg
可以参考一下这个例子:
@li460135301
这里有一个参考示例:
import _test
class Test:
_name = ''
def __init__(self, name):
self._name = name
def __setitem__(self, key, val):
_test._setitem(self._name, key, val)
def __getitem__(self, key):
return _test._getitem(self._name, key)
A = Test('A')
A[0] = 1
print(A[0])
A[1] = 'B'
print(A[1])
各位Python爱好者,大家好!
今天,我们有一个非常激动人心的消息要跟大家分享。我们的PikaPython项目在GitHub上的star数量已经突破了1000大关,这得益于广大开发者和爱好者们的热情支持与积极参与。为了感谢大家,我们特意为大家准备了这篇推送,一起来庆祝这个意义非凡的时刻!
首先,让我们来简单回顾一下PikaPython的特点和优势。PikaPython是一款超轻量级的Python解释器,主要应用于物联网和边缘AI领域,只需4KB的RAM,不依赖操作系统、文件系统以及第三方库即可运行。这使得它在各种资源受限的环境中,如嵌入式系统、IoT设备等,都能轻松胜任。
PikaPython的优势如下:
1. 超轻量级:只需4KB的RAM,让资源消耗降至最低,非常适合物联网和边缘AI领域的应用场景。
2. 零依赖:无需操作系统、文件系统支持,也不依赖任何第三方库,简化了项目的部署和维护。
3. 开箱即用:无需复杂配置,简单易懂的使用方式让你立刻上手。
4. C语言拓展:支持用C语言轻松扩展功能,让你的项目更加强大。
在此,我们要感谢每一位为PikaPython点赞、关注、贡献代码的朋友们。正是你们的支持,让PikaPython能够不断完善、发展,成为如今这个受到大家喜爱的项目。我们也将继续努力,为广大Python爱好者提供更优质、更实用的解决方案。
未来,我们还将继续深化PikaPython的研发,力求为物联网和边缘AI领域的开发者和爱好者带来更多便利。我们期待更多的开发者加入到PikaPython的大家庭中来,一起共同推动轻量级Python解释器的发展!
再次感谢大家的支持,让我们共同见证PikaPython继续闪耀星光,创造更多的辉煌!
附:QQ交流群,欢迎大佬们来玩:
首先第一步还是要用c模块做一个方法,比如有一个 _test.pyi 的 C 模块
# _test.pyi
def get(name: str) -> int:
pass
def set(name: str, val: int):
pass
然后下一步建立一个 test.py 的 py 模块,用 __getattr__ 和 __setattr__ 来进行数据绑定
# test.py
import _test
class DataBinding:
def __getattr__(self, name):
return _test.get(name)
def __setattr__(self, name, val):
_test.set(name, val)
然后就可以通过访问 DataBinding 类的属性来读写变量了
# main.py
import test
databinding = test.DataBinding()
databinding.A = 1 # 等效为 _test.set("A", 1)
val = databinding.A # 等效为 val = _test.get("A")
@fxyc87
这些函数是用##拼接出的的weak函数,例如
PIKA_WEAK int pika_hal_platform_##dev_name##_open(pika_dev* dev,
char* name) {
WEAK_FUNCTION_NEED_OVERRIDE_ERROR()
return -1;
}
用户写了这些函数之后就会覆盖这些weak,然后被调用了,源码在:https://gitee.com/Lyon1998/pikapython/blob/master/package/PikaStdDevice/pika_hal_table_rule.h#L4
更多的信息可以参考这个文档:http://pikapython.com/doc/PikaStdDevice%20%E6%A0%87%E5%87%86%E8%AE%BE%E5%A4%87.html#id13
有没有移植相关的文档?我想移植到自家芯片上,哈哈。
哦,在rtt上找到一个。
文档在这里,应该和你在rtt找的是一样的
拼了合宙19.9的大佬看过来,玩玩板子赚点赏金
在esp32的idf平台上有移植么 squareline生成的micropyhton代码是不是可以在这上面跑
官网有 esp32c3 的 template 可用,lvgl 和 micropython 是兼容的,其他的不兼容。
PikaScript 网络/蓝牙标准库开始施工了!计划是做成只依赖于基于 BSD socket 的全家桶(包含 reqeusts/mqtt/iot/socket 4个 Python 模块),只需要芯片能跑 LWIP,就可以直接安装模块,不需要任何其他的适配。
拟定架构如图:
主要分为 BLE 和 Network 两个部分:
BLE:
BLE framwork 为 ble 模块的 c 适配层,和 原生 BLE SDK 对接
ble 模块的 API 标准由 pikascript api 小组自拟,相关 issue:MQTT BLE std规范提案
Network:
Network 部分有 requests 模块,MQTT 模块和 iot 模块
Network 模块基于 BSD Socket 搭建,只要平台支持 BSD Socket,无需任何适配即可使用 Network
socket 模块 API 与 CPython socket 模块一致
reqeusts 模块 API 与 CPython reqeusts 模块一致,http 协议栈选用 rtt webclient
mqtt 模块的 API 标准由 pikascript api 小组自拟,相关 issue:MQTT BLE std规范提案 , mqtt 协议栈选用 mqttclient
iot 模块对应各云服务商(阿里/腾讯)系 API,如果标准 http\mqtt 模块无法满足要求,则为各云服务商制作补充性的专用 API
如果对于标准库的 API 提案有建议和想法,可以在 Issue 里面留言。
gitee Issue:
https://gitee.com/Lyon1998/pikascript/issues/I60Q8Q
另外标准网络库的工程量较大,如果有大佬感兴趣可以加入我们的开发小组一起开发,会有一点点奖金(来源是 PikaScript 收到的赞助,比较微薄),还会有定期的培训,也可以学习一些技术,qq 群:577623681
语言
支持 is 关键词#188
支持 in 关键词#189
支持 assert 关键词#190
支持默认函数参数 #170
支持基本类型的方法,如 int, str #183
支持多行调用,如 foo(a, \n b) #197
支持 add(), sub() 魔法方法 #198
用科学计数法表示浮点数 #217
支持多值返回和多值赋值 #200
死循环的 Python 程序增加退出接口 #201
支持关键字参数 #207
支持 if a in list 和 if a in dict #208
支持 super() #209
支持列表的切片 #210
支持 for d.items in k,v #213
支持 c 模块的 int64 类型注解 #214
发生错误时退出脚本 #215
支持对含有中文的字符串进行切片 #218
库
支持exec()内置程序 #193
支持dir()内置程序 #194
支持getattr()和setattr()内建程序 #195
支持range(a)和range(a, b, c)#216
错误修正
Bug: try ... except for dict no attr not work #204
解析问题 #187
列表、元组或字典中未指定的成员变量的原因
支持void行,obj_run()没有新行 #196
发布页: https://gitee.com/Lyon1998/pikascript/releases/tag/v1.11.0
之前版本有些问题,升级到 v1.10.8,然后参考下面的示例
pyi:
def test_dict() -> dict: ...
C:
PikaObj* Test_test_dict(PikaObj* self) {
PikaObj* dict = newNormalObj(New_PikaStdData_Dict);
PikaStdData_Dict___init__(dict);
Arg* para1 = arg_newInt(1);
Arg* para2 = arg_newInt(2);
PikaStdData_Dict_set(dict, "para1", para1);
PikaStdData_Dict_set(dict, "para2", para2);
arg_deinit(para1);
arg_deinit(para2);
return dict;
}
PikaScript 是否支持STM32G030F6P6?
芯片至少需要有64k flash
如何选择可以运行 pikascript 的平台
PikaScript 可以在所有 支持 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 均可。
PikaScript 合并进入 LVGL 主线文档,并在 LVGL 博客频道发表文章!
LVGL 文档连接:
https://docs.lvgl.io/master/get-started/bindings/pikascript.html
LVGL 博客链接:
https://blog.lvgl.io/2022-08-24/pikascript-and-lvgl
LVGL 创始人 Gabor 表示对此非常感兴趣。
为开源项目贡献代码是很有趣的一件事情,但是 git 的使用还是有一些门槛,PikaScript 新上线了模块贡献引导功能,新手也可以很轻松的为开源项目提交代码了!
在 http://pikascript.com 主页下方,点击 “上传我的模块” 即可进入
填写模块名
创建版本号
上传代码文件
填写 email 和 name,使用 github 的邮箱可以在 github 上有贡献记录
这时代码合并请求就已经自动创建了,等待审核就可以了。
可以打开 pull reqeust 的页面
下面是 pull request 的界面
最后简单聊聊参与到开源项目的几个理由。
作为个人来说,自己写的代码可以帮助到其他的开发者,这本身就挺让人有成就感的,而且可以结识很多的开源大佬。
另一方面,开源的代码比自己用的代码更讲究通用性,更需要合理的组织架构,因此对自己的技术也是一个磨练。
对于学生来说,参与开源项目的经历也是有助于找工作的。
对企业来说,参与到开源项目的贡献也可以减轻维护的压力,会有很多社区的用户帮助维护和测试这些代码,另一方面,参与开源项目也可以在项目的未来发展中具有一定的话语权。
速度提升78%
初步支持"try...except" #169
支持 0bxxx字面值 #171
支持像 String('test').split('t') 这样的函数链
支持切片嵌套,如 a = x[y[z]] #173
支持切片链,如 a[x][y] #174
支持 function()[x] #177
支持元组字面值 #178
支持绑定来自其他 *.py (除main.py外)引入的 .pyi
支持 del 关键字 #I5KDES:对象销毁问题
支持binascii #176
支持open() 内置函数 #181
支持 windows 和 linux 的sleep()#186
错误:打印(无)返回其他字符串 #175
错误:对于循环错误继续后的内部循环 #179
错误:当 arg 大小 > int16_t 时堆栈错误 #185
一些python运算符操作不正确或不符合预期 #I5JN75:某些python运算符的运算结果有误或未达到预期
[dict] 中的 输出不正确 #I5JWSR:for in [dict]输出有误
.pyi 生成的函数的入口参数顺序可能发生更改
更新C模块中入口参数的顺序。
中断可以使用内核提供的注册回调机制
文档:
https://pikadoc.readthedocs.io/zh/latest/coreapi_event.html
ESP32的驱动是网友贡献的,目前还没有wifi和蓝牙的适配
引用一段文档:
“obj_run 支持运行字符串形式的 Python 脚本,因此无论以哪种方式存储,只要最后给 obj_run 传入 Python 脚本的字符串即可。所以可以的存储方式有:flash 直接存储、文件系统、外部存储器 等。”
所以,只要把python脚本的字串存储起来就可以了
simon 大佬实现了U盘运行 python 原帖:https://whycan.com/t_7586.html
文档链接:
一个德国老外在stm32f103cb上的pikascript项目,用的是 platofrmIO,对linux开发和platformIO感兴趣的大佬们可以关注一下
目前 pikascript 不支持多值返回,如果需要返回多个值,可以使用对象的属性 api,将返回值保存进对象的属性中,再依次取出。
例如:
pika 的C模块py中:
# python
class Test(TinyObj):
def test(a:int, b:float):
pass
pika 的C模块.c 中:
/* C */
void Test_test(PikaObj* self, int a, float b){
int res1;
float res2;
/* do something */
obj_setInt(self, "c", res1);
obj_setFloat(self,"d", res2);
}
Python 调用中:
mytest = Test()
a = 1
b = 2
mytest.test(a,b)
res1 = mytest.c
res2 = mytest.d
【N32G457 】基于RT-Thread和N32G457的Python智能小车
【应用的背景】
智能小车在编程和嵌入式教育中是一个经典的案例,Python 是一种高级语言,有着易学,易用,抽象能力强,跨平台能力强的特点。
本项目中,使用 NG32G457 开发板,基于 PikaScript 超轻量级 Python 引擎,搭建了一个 Python 智能小车,这个项目在编程教育方面,有一定的参考价值。
【实现功能】
Python 交互式控制小车的各个轮子的转速。
Python 交互式读取红外传感器的返回值。
使用 Python 编程,实现了小车的智能避障功能。
【开发板和RT-Thread使用情况概述】
开发板使用的是 RT-Thread 开发者大赛提供的 N32G457 评估板。
使用了开发板的 PWM, GPIO 功能。
使用了 RT-Thread 的 PikaScript 软件包,提供 Python 引擎。
使用了 PikaScript 的 pikaRTDevice 模块,驱动开发板的 PWM, GPIO。
使用了 PikaScript 的 pikaRTThread 模块,实现了延时和线程的挂起。
【硬件框架】
硬件包含以下几个部分:
小车机械框架:小车底盘,电机,轮胎。
电源电路和电池:3.7V 锂电池,锂电池充电电路。
红外传感器。
电机驱动电路。
NG32G457 主控制器。
【软件框架说明】
软件包含以下几个部分:
NG32G457 的 BSP。
PikaScript 软件包。
PikaScript 模块管理文件 reqeustment.txt。
控制小车的 Python 代码 main.py。
【软件模块说明】
NG32G457 的 BSP:
由 RT-Thread Studio 生成的模板工程。
PikaScript 软件包。
参考 PikaScript 开发文档,使用 RT-Thread Studio 安装 PikaScript 软件包。
在工程中的 packages/pikascript-latest/requestment.txt 中写入 PikaScript 需要安装的内核,模块及相应版本。
pikascript-core==v1.4.1
PikaStdLib==v1.4.1
PikaStdDevice==v1.4.4
pikaRTThread==v1.1.1
pikaRTDevice==v1.0.0
在 packages/pikascript-latest/main.py 中编写 Python 代码,实现小车的避障功能。
(1) 导入模块:
import PikaStdLib
import pikaRTThread
import pikaRTDevice
import PikaDebug
(2) 创建常用的工具对象:
thread = pikaRTThread.Thread() #线程管理对象
mem = PikaStdLib.MemChecker() #内存监控对象
pdb = PikaDebug.Debuger() #调试器对象
print('mem use max:')
mem.max() #打印当前的内存占用
编写硬件初始化代码:
# A2
Ain1 = pikaRTDevice.GPIO()
Ain1.setId(16)
Ain1.setMode('out')
Ain1.enable()
# A4
Ain2 = pikaRTDevice.GPIO()
Ain2.setId(20)
Ain2.setMode('out')
Ain2.enable()
# A6
Apwm = pikaRTDevice.PWM()
Apwm.setName('tim3pwm1')
Apwm.setChannel(1)
Apwm.setFreq(1000)
Apwm.setDuty(0)
Apwm.enable()
# A3
Bin1 = pikaRTDevice.GPIO()
Bin1.setId(17)
Bin1.setMode('out')
Bin1.enable()
# A5
Bin2 = pikaRTDevice.GPIO()
Bin2.setId(21)
Bin2.setMode('out')
Bin2.enable()
# A7
Bpwm = pikaRTDevice.PWM()
Bpwm.setName('tim3pwm2')
Bpwm.setChannel(2)
Bpwm.setFreq(1000)
Bpwm.setDuty(0)
Bpwm.enable()
#PC4
sensor1 = pikaRTDevice.GPIO()
sensor1.setId(24)
sensor1.setMode('in')
sensor1.setPull('up')
sensor1.enable()
#PC5
sensor2 = pikaRTDevice.GPIO()
sensor2.setId(25)
sensor2.setMode('in')
sensor2.setPull('up')
sensor2.enable()
(3) 编写电机控制代码:
def motor1(speed: float):
if speed > 0:
Ain1.high()
Ain2.low()
Apwm.setDuty(speed)
else:
Ain1.low()
Ain2.high()
Apwm.setDuty(-speed)
def motor2(speed: float):
if speed > 0:
Bin1.high()
Bin2.low()
Bpwm.setDuty(speed)
else:
Bin1.low()
Bin2.high()
Bpwm.setDuty(-speed)
(4) 编写小车的避障功能:
def go():
while True:
if not sensor2.read():
print('turn right...')
motor1(0.6)
motor2(-0.6)
elif not sensor1.read():
print('turn left...')
motor1(-0.6)
motor2(0.6)
else:
print('forword...')
motor1(0.6)
motor2(0.6)
(5) 启动小车:
go()
【作品完整图片】
【视频演示效果】
https://www.bilibili.com/video/BV1DY411n7eD/
【代码地址】
Python 小车项目仓库:https://gitee.com/Lyon1998/n32g45
PikaScript 项目主仓库:https://gitee.com/lyon1998/pikascript
@jtp108
pikascript 的对象是用对象树来组织的,也就是只要获得根对象,就可以获得所有的对象。
在启动 pikascript 时,pikascriptInit 函数会创建一个根对象,并执行 main.py 里面的脚本。
PikaObj* pikaMain = pikascriptInit();
main.py里面,看似执行的都是全局函数,创建和修改的都是全局变量,但实际上,在 pikascript 引擎中,全局变量和全局函数,就是根对象的属性和方法。
所以,只要通过根对象,就可以获得 main.py 里面任意一个对象。
例如,如果在 main.py 中创建一个 mem 对象:
mem = PikaScript.Memchecker()
那么在 C 中获得 mem 对象的方法就是:
PikaObj* mem = obj_getPtr(pikaMain, "mem");
就是获得 pikaMain 对象下的 "mem" 属性,类型是指针。
也可以获得嵌套的对象,比如,如果有一个全局的对象 IIC,然后该对象有 pin 子对象。
那么获得 pin 子对象的方法就是:
PikaObj* pin = obj_getPtr(pikaMain, "IIC.pin");
或者分两步获得:
PikaObj* IIC = obj_getPtr(pikaMain, "IIC");
PikaObj* pin = obj_getPtr(IIC, "pin");
如果是在 C 模块的回调函数中,想要获得根对象,那么可以通过 PikaScript 自动创建的根对象全局指针。
extern PikaObj* __pikaMain;
在执行 pikascriptInit()时,会自动创建一个 __pikaMain 全局指针,用来指向根对象。
参考文档:
1. pikascript 对象结构的原理
https://pikadoc.readthedocs.io/zh/latest/%E5%8E%9F%E7%90%86%E7%AE%80%E4%BB%8B.html
2. pikascript 对象API
https://pikadoc.readthedocs.io/zh/latest/Pika%20%E5%AF%B9%E8%B1%A1%20PikaObj.html
问:
如何实现C 调用python 模块?
串口接收中断处理函数,在Python处理
我想用obj_run 执行main.py里定义的这个函数如何实现?
import PikaStdLib
import pikaRTthread
def on_uart_recv_data():
print('hello on_uart_recv_data!')
pass
答:
obj_run(pikaMain,"on_uart_recv_data()")
问:
直接就可以?前面不需要 import main
答:
是的,pikaMain的作用域就是主作用域
问:如何传递参数?把串口收到的字节数组 作为参数传递给packet
答:使用 obj_setStr即可
obj_setStr(pikaMain,"packet",rxbuffer)
obj_run(pikaMain,"on_uart_recv_data(packet)")
结果:成功了
PikaScript新支持了树莓派Pico和ESP32,其中Pico使用MDK开发(基于傻孩子大佬的Pico_Template项目)。
树莓派Pico还附有推送一篇:
除了API之外,在RTOS上可能还需要考虑libc的问题。
newlib把开源项目坑惨了,用默认libc不得行,所以rtt上都重载到rtt自己实现的libc了。
参考文档:
https://www.yuque.com/liang-mltek/pikascript/zqzv33
参考代码:
https://gitee.com/Lyon1998/pikascript/blob/master/package/pikaRTBooter/pika_config.c
制作新的API请参考以下几个文档
pikascript模块:
https://www.yuque.com/liang-mltek/pikascript/imqf0c
制作新模块:
https://www.yuque.com/liang-mltek/pikascript/usacrp
发布模块:
https://www.yuque.com/liang-mltek/pikascript/xq50e1
https://whycan.com/files/members/3294/pika_start_file.png
https://whycan.com/files/members/3294/pika_start_mcu.png
IAR里运行U盘里的py脚本,不过IAR编译有几个错误,在这里:https://whycan.com/t_7587.html
666大佬NB
@lyon1998
好的,我看看咋移植的。我看了一下语法,确实有一些还需要完善,不知道性能咋样
运行速度不如mpy,因为是体积优化优先的。
下面是移植文档,不过我看到大佬已经跑起来了哈哈!大佬NB
挺有意思,语法支持的完整度咋样?
只针对小资源的芯片吧?
https://gitee.com/Lyon1998/pikascript#3%E8%AF%AD%E6%B3%95%E7%89%B9%E6%80%A7
支持了一些基本语法,可以在这里看到最新的情况。
不只是小资源的芯片,所有的芯片理论上都可以,另外还有rtt软件包,能跑rtt的都一键支持。
平台支持列表可以在这里看到
https://gitee.com/Lyon1998/pikascript#2%E5%B9%B3%E5%8F%B0%E6%94%AF%E6%8C%81%E5%88%97%E8%A1%A8
【11. python脚本不能直接解释运行吗?是否还是要预编译吗?】
python脚本可以直接解释运行,也支持交互式运行,需要预编译的是c模块。
【12. micropython 可以直接插USB识别为U盘,把代码拷贝进去就行,不知道PikaScript支不支持】
目前支持的形式是通过串口助手发送main.py文件。发送完就能运行。
【13. 绑定C库的教程有没有?】
文档:编写新的PikaScript模块
https://www.yuque.com/liang-mltek/pikascript/usacrp
@lyon1998
期待,我现在在micropython上跑LVGL,可以实时画界面看效果还是不错的。F4现在确实挺贵,哪天有空试试PikaScript!
期待大佬的LVGL哈哈,目前我在和ARM-2D的作者王桑合作。
顺便给ARM-2D打个广告,ARM-2D是由ARM官方支持,完全开源的用于小资源嵌入式系统的最新GUI技术,比LVGL资源更小,只需要2Kb内存,20Kb 左右flash即可运行,具有图形加速、部分缓冲、脏矩阵加速刷新、透明度、抗锯齿、旋转等等强大的图像处理能力。
下面是ARM-2D的github主页:
https://github.com/ARM-software/EndpointAI/tree/master/Kernels/Research/Arm-2D
PikaScript还有一个和ARM2D的联合仿真工程,可以基于QEMU进行GUI仿真
好东西!就是不知道完成度如何,比如哪些Python3语法是支持的,哪些不支持,有什么差异。
另外,绑定C库的教程有没有
目前支持下面这些语法特性
下面这个是绑定C模块的教程
还有两个视频
【6. 有没有想过PikaScrip会用在什么领域】
目前用在小资源的单片机中,一般是cotex-m4以下的内核。
应用领域例如集成在屏幕驱动中,可以使用python脚本驱动屏幕。
或者集成在传感器、电机、智能小车、机器人等教育套件中。
还有通讯模块等小模块中,支持python配置设备。
【7. 会考虑直接在py源码文件中支持json吗】
pikascript目前的语法界定在python的子集,暂时没有超出python语法标准的计划。
【8. 现在PikaScript支持List、字典这种数据类型了吗】
目前还没有,但是会在近期(大概三个月内)提供支持,pikascript的数据结构基础是对象,目前仍在加强对象的功能。list、字典等数据结构后续会基于对象模拟出来。
【9. 如何选择可以运行pikascript的MCU】
如果是arm内核,考虑到拓展模块的资源占用,最低应该配备64k flash和8k ram。
如果是risc-v内核,则需要128k flash和8k ram, 因为risc-v内核的gcc优化以及代码密度等问题,代码体积比arm内核大很多。
【10. python脚本解析为字节码的过程在MCU内部进行,比较影响性能,有办法在PC端直接解析成字节码吗?】
可以的,在PC上解析字节码可以使用pikascript/tools/pikaByteCodeGen工具。
【1. Pika现在支持多线程吗?】
目前还不支持
【2. 可以动态加载py文件吗】
目前能动态加载单文件,可以参考examples里面的main.py,是支持动态加载的。
【3. 现在这个Python脚本编译后是需要编译进固件吗?是否可以单独写到FLASH或者内存中,用vm来动态调用,是否支持直接更新解析后的字节码?】
Python脚本可以直接编译进固件中,也可以写入到FLASH中,PikaScript读取字符串形式的Python脚本即可运行。Pika将Python脚本解析为字节码的过程可以在MCU上完成,也可以在PC上完成,解析后的字节码同样以字符串形式,即可交给VM执行。
在PC上解析字节码可以使用pikascript/tools/pikaByteCodeGen工具。
【4. PikaScript目前只支持单文件的Python脚本吗?】
是的,Python脚本只支持单文件,C模块已支持多文件。
【5. pikaStdDevice模块是用来干什么的?为什么不能直接调用?】
pikaStdDevice模块是用来统一外设的API的,是一个抽象的模块,不能直接调用。在编写具体的模块时,先从pikaStdDevice中继承,再重写平台实现。
比如stm32和esp32,驱动实现肯定不一样,但是如果他们的驱动模块都从pikaStdDevice中的类里面继承,再重写平台实现,用户再用esp32和stm32时,就感觉是一套api。这是一个跨MCU架构的标准驱动计划。
希望移植到更多MCU上面
这是目前已经支持的平台,可以直接去pikascript/bsp找到相应移植好的工程
在其他平台移植也很简单,可以参考下面的文档
PikaScript是一个完全重写的超轻量级python引擎,具有完整的解释器,字节码和虚拟机架构,可以在少于4KB的RAM下运行,用于小资源嵌入式系统。相比同类产品,如MicroPython,LuaOS等,资源占用减少85%以上。入选2021年度 Gitee最有价值开源项目,加入RT-Thread嵌入式实时操作系统编程语言类软件包。
下面是一些例程Demo,截取自宣传用的公众号文章,表述略显浮夸(捂脸)
————————————分割线————————————
我就想用单片机跑个Python,得用linux虚拟机+交叉编译工具链+命令行编译micropython固件,还得用DfuSe工具烧录固件,烧录完还不能用C的调试器来调试。
我想拓展个自己的C模块,还要学着用一些完全看不懂的宏函数,还得手动注册,还得编写makeFile,编译完照样不能调试C。
我穷,买不起STM32F4,想买个STM32F103C8T6的micropython开发板,淘宝一搜,好像没有。
现在C8T6贵了,我还想用F0,用G0,能行吗?
好像,给G0移植micropython,不是很容易。
那?有没有另一种玩法?
换句话说,我想用Keil开发,用Keil调试,我还想用最便宜的单片机。
这,能玩Python吗?
要不,试试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工程。
说了这么多,刘华强就有疑问了,你说这脚本,保熟吗?
我这开水果脚本摊儿的,能买你生脚本蛋子?
这就挑点儿Demo给哥儿几个瞧瞧。
这可都是STM32G070RBT6的Demo。
Demo 01 万物起源点个灯
看看这脚本,可都是如假包换的Python3标准语法。
这灯不就闪起来了吗。
Demo 02 串口测试
开个串口,读俩字符试试
非常顺滑
Demo 03 读个ADC试试
同样几行脚本搞定。
这是输出的结果。
这几个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资源对比
Flash资源对比
参考价对比(以2021年9月11日立创商城10片售价为参考)
拓展能力如何呢?
除了设备驱动之外,为mcu开发自定义的python脚本绑定在pikascript的开发框架下非常轻松,下面两个Demo就是自定义的C模块拓展,这个Demo基于ARM-2D图像驱动库开发了一些python脚本接口。
几个小方块~
几个旋转太阳~
那,PikaScript是开源的吗?
当然,这个就是PikaScript的github主页:
https://github.com/pikasTech/pikascript
还有gitee主页
https://gitee.com/Lyon1998/pikascript
开发难不难?
PikaScript为开发者准备了丰富的Demo和由浅入深的开发指南,指南还会持续完善和维护。 image
可以商用吗?
当然!PikaScript采用MIT协议,允许修改和商用,但是要注意保留原作者的署名。
页次: 1