1 Star 0 Fork 181

Kayden / pikascript

forked from 李昂 / pikapython 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

logo

PikaScript

跨平台的超轻量级嵌入式 Python 引擎

论坛 | 文档中心 | 视频 | 开发板 | BSP | 包管理器 | RT-Thread 软件包 | 参与贡献 | 商业合作

image

1.简介

PikaScript 是一个完全重写的超轻量级 python 引擎,零依赖,零配置,可以在 Flash ≤ 32KB,RAM≤ 4KB 的平台下运行(如 stm32g030c8 和 stm32f103c8),极易部署和扩展,具有大量的中文文档和视频资料。

PikaScript 具有框架式 C 模块开发工具,只要用 Python 写好调用 API ,就能够自动连接到 C 模块,非常方便快捷。不用手动处理任何全局表、宏定义、等等。

PikaScript 也支持 MDK、iar、RT-studio 等常见 ide 开发,能够轻松地调试 C 模块。

output_Kgj52R

image

获取 PikaScript:

使用在线图形化工程生成器

生成器地址: http://pikascript.com

使用 Pika 包管理器PikaPackage.exe

  1. 直接运行PikaPackage.exe, 自动下载并更新pikaScript主仓库(文件在当前磁盘的/tmp/pikaScript文件夹)

  2. requestment.txt放在PikaPackage.exe同一文件夹下, 运行pikaPackage.exe, 自动在当前目录下安装内核预编译器模块

  3. 已发布的模块列表:packages.toml

快速上手

可使用仿真工程快速上手,无需硬件,也可以使用官方支持的开发板Pika派—Zero,上手即玩。

Pika派python编程游玩指南

PikaPi-Zero

开发板基于 STM32G030C8T6 小资源 MCU,仅 64kB Flash,8kB RAM 即可运行完整解释器,和完整的外设驱动(GPIO、TIME、IIC、UART、ADC、PWM、RGB、KEY、LCD)。板载 CH340 USB 转串口芯片,Type-C 接口,支持串口下载 python 脚本,板载4颗 RGB 灯,可选配LCD屏幕

开发手册

点此进入文档中心

image

视频教程

点此进入视频中心

image

交流论坛

点此进入论坛

image

文件目录

src - 内核源码

bsp - 裸机芯片/板卡支持

port - 操作系统支持

document - 开发文档

examples - 示例脚本

package - 模块目录

pikaCompiler - 使用 rust 编写的预编译器

pikaPackageManager - 使用 go 编写的模块管理器

2.平台支持列表

MCU support

MCU bsp gpio uart pwm adc i2c
stm32g030c8
stm32g070cB
stm32f103c8
stm32f103rb
stm32f103rc
stm32f407ze
stm32f051r8
ch32v103r8t6
cm32m101a
w801
w806
apm32f030r8
apm32e103vb
bl-706
Raspberry Pico
ESP32C3
TC264D
devc

Board support

Board bsp gpio uart pwm adc i2c rgb lcd arm-2d
Pika-Pi-Zero
Board bsp arm-2d
QEMU-arm2d
Board bsp LED KEY
SmartLoong

OS support

OS port GPIO TIME
rt-thread
vsf
OS port Google Test Benchmark
linux

3.特性

(1)运行环境

支持裸机运行,可运行于 RAM ≥ 4kBFLASH ≥ 32kB 的mcu中,如stm32g030, stm32f103c8t6,esp8266。

(2)开发环境

支持串口下载 Python 脚本。

微信交流群

支持 Keil、IAR、rt-thread studio、segger embedded studio 等IDE开发。

支持 CMake、makeFile、Scons 等构建工具

零依赖,零配置,开箱即用,极易集成进已有的C工程。

极易拓展自定义的C原生函数。

支持跨平台,可在 linux 环境开发内核。

(3)语法特性

使用 python3 标准语法的子集。

在编译时支持 python 类和方法定义,完整支持封装、继承、多态、模块功能 - 基于 Pika 预编译器

在运行时支持 python 方法调用、变量定义、对象构造、对象释放、控制流(if\while) - 基于 Pika 运行时内核

语法 编译时 运行时
模块定义 -
模块导入 -
类定义 -
类继承 -
方法定义
方法重载
方法调用
参数定义
参数赋值
对象新建
对象销毁
对象嵌套

操作符

+ - * / == > < >= <= % ** // != & >> << and or not += -= *= /=

控制流

if while for else elif break continue

数据结构

string list dict

(4)源码规范

注重源码可读性,命名规范,标准统一,完全不使用宏,几乎不使用全局变量。

完整的 googletest 单元测试。

4.交流与技术支持:

微信交流群

微信截图_20210917133247

群已经满啦,加我QQ拉你进群~ qq: 645275593

Tencent QQ:

645275593

Tencent QQ Group:

微信交流群

E-mail:

645275593@qq.com

5.贡献者

内容 贡献者
Performance Point: 900->1400 GorgonMeducer
stm32f051r8 BSP unsigned
stm32f407ze BSP unsigned
devc BSP unsigned
TC264D BSP unsigned
PikaVM 优化 GorgonMeducer
W801Device package 刘延(微信名)
W806 bsp 刘延(微信名)
捐赠:ESP32C3 5pic,调试器 启明云端 沧御
捐赠:LS1C101芯片10pic, LS1c101开发板,调试器 龙芯俱乐部 石南
PikaVSF OS package versaloon
ESP32C3 BSP 沧御
捐赠:ESP32开发板、墨水屏*4 name(微信名)
捐赠:智龙开发板 龙芯俱乐部 石南
package/STM32F1 sjy
package/STM32F103RBBooter sjy
bsp/stm32f103rb sjy
基于 QEMU 的 ARM-2D 仿真工程 liuduanfei
捐赠:GD32E103TB 芯片2片 信息牛(微信名)
Rt-thread 支持包、适配层、模块 Meco Jianting Man
捐赠:移远 EC600S-CN 4G模块 移远模块
捐赠:博流 BL706 开发板 博流智能 bouffalolab
捐赠:中国移动 CM32M101A 开发板 孟巍(微信名)
捐赠:APM32F030R8 开发板 极海半导体 陈成
捐赠:APM32E103VB 开发板 极海半导体 陈成
捐赠:APEX-Link 仿真器 极海半导体 陈成
源码格式化,增加 git 属性文件 Meco Jianting Man
demo/simulation-keil 千帆(微信名)
demo/stm32f103zet6/demo01-led-stm32f103zet6 甜航
demo/stm32f103zet6/demo02-led-stm32f103zet6_tworoot 甜航
demo/stm32f407zgt/demo01-led-stm32f407vgt 甜航

6.内核测试与开发

linux 下测试 pikascript 内核(推荐ubuntu20.04):

step1: 拉取项目

git clone https://github.com/pikastech/pikascript
cd pikascript/port/linux

step2: 编译项目

sh install_dependency.sh # 安装依赖,第一次用时运行
sh init.sh # 第一次编译前运行,之后就不用运行了 
sh make.sh # 编译项目

step3: 运行单元测试

sh gtest.sh

step4: 运行基准测试

sh ci_benchmark.sh

7.Demo展示

Demo 01 GPIO

import PikaStdLib
import STM32G0

mem = PikaStdLib.MemChecker()
io1 = STM32G0.GPIO()
time = STM32G0.Time()

io1.init()
io1.setPin('PA8')
io1.setMode('out')
io1.enable()
io1.low()

print('hello pikascript')
print('mem.max :')
mem.max()
print('mem.now :')
mem.now()

while True:
    io1.low()
    time.sleep_ms(500)
    io1.high()
    time.sleep_ms(500)

Hnet-image (2)

Demo 02 USART

import PikaStdLib
import STM32G0

time = STM32G0.Time()
uart = STM32G0.UART()
uart.init()
uart.setId(1)
uart.setBaudRate(115200)
uart.enable()

while True:
    time.sleep_ms(500)
    readBuff = uart.read(2)
    print('read 2 char:')
    print(readBuff)

Hnet-image (3)

Demo 03 ADC

import PikaStdLib
import STM32G0

time = STM32G0.Time()
adc1 = STM32G0.ADC()

adc1.init()
adc1.setPin('PA1')
adc1.enable()

while True:
    val = adc1.read()
    print('adc1 value:')
    print(val)
    time.sleep_ms(500)

mmexport1631351523907

Demo 04 PWM output

import PikaStdLib
import STM32G0

time = STM32G0.Time()
pwm = STM32G0.PWM()
pwm.setPin('PA8')
pwm.setFrequency(2000)
pwm.setDuty(0.5)
pwm.enable()

while True:
    time.sleep_ms(500)
    pwm.setDuty(0.5)
    time.sleep_ms(500)
    pwm.setDuty(0.001)
    

Demo 05 RGB

import STM32G0
import PikaPiZero
import PikaStdLib

rgb = PikaPiZero.RGB()
mem = PikaStdLib.MemChecker()

rgb.init()
rgb.enable()

print('hello 2')
print('mem used max:')
mem.max()

while True:
    print('flowing')
    rgb.flow()

Demo 06 Snake(Need LCD)

from PikaObj import *
import PikaStdLib
import PikaPiZero
import STM32G0

# hardware init
lcd = PikaPiZero.LCD()
lcd.init()
lcd.clear('white')
key = PikaPiZero.KEY()
key.init()
time = STM32G0.Time()
x_max = 120
y_max = 150

# snake init
s = PikaPiZero.Point()
w = 9
h = 9
s.x = 50
s.y = 10
len = 0
while len < 3:
    b = s
    i = 0
    while i < len:
        b = b.next
        i = i + 1
    b.next = PikaPiZero.Point()
    b.next.x = b.x - 10
    b.next.y = b.y
    b.next.prev = b
    len = len + 1
# ring link
b.next = s
s.prev = b

i = 0
b = s
while i < len:
    lcd.fill(b.x, b.y, w, h, 'blue')
    b = b.next
    i = i + 1

print('snake lengh')
print(len)

# fruit init
f = PikaPiZero.Point()
f.x = 30
f.y = 20
lcd.fill(f.x, f.y, w, h, 'green')

# memory check
mem = PikaStdLib.MemChecker()
print('mem used max:')
mem.max()

# main loop
d = 0
isUpdate = 1
isEat = 0
while True:
    if isUpdate:
        # isUpdate = 0
        # check eat fruit
        if f.x == s.x and f.y == s.y:
            # have eat fruit
            isEat = 1
            f.x = f.x + 30
            if f.x > x_max:
                f.x = f.x - x_max
            f.y = f.y + 30
            if f.y > y_max:
                f.y = f.y - y_max
            lcd.fill(f.x, f.y, w, h, 'green')
        # move snake by the direction
        if d == 0:
            x_new = s.x + 10
            y_new = s.y
            if x_new > x_max:
                x_new = 0
        elif d == 1:
            x_new = s.x
            y_new = s.y - 10
            if y_new < 0:
                y_new = y_max
        elif d == 2:
            x_new = s.x
            y_new = s.y + 10
            if y_new > y_max:
                y_new = 0
        elif d == 3:
            x_new = s.x - 10
            y_new = s.y
            if x_new < 0:
                x_new = x_max
        if isEat:
            isEat = 0
            b_new = PikaPiZero.Point()
            b_new.x = x_new
            b_new.y = y_new
            b_new.prev = s.prev
            b_new.next = s
            s.prev.next = b_new
            s.prev = b_new
            s = b_new
            len = len + 1
            print('snake lengh')
            print(len)
            print('mem used max:')
            mem.max()
        # drow the snake and fruit
        # clear last body
        lcd.fill(s.prev.x, s.prev.y, w, h, 'white')
        # new body
        s.prev.x = x_new
        s.prev.y = y_new
        # head is last body
        s = s.prev
        lcd.fill(s.x, s.y, w, h, 'blue')
        b = s
        i = 0
    # scan key
    key_val = key.get()
    if key_val == 0:
        d = 0
        isUpdate = 1
    elif key_val == 1:
        d = 1
        isUpdate = 1
    elif key_val == 2:
        d = 2
        isUpdate = 1
    elif key_val == 3:
        d = 3
        isUpdate = 1

输入图片说明

这几个 Demo 占用的 RAM 最大值只有3.56K,把1K的堆栈也算上就是4.56K,Flash 最大占用是30.4K,以 STM32F103C8T6 的 20K RAM 和 64K Flash 为标准,RAM 才用掉不到25%,Flash 才用掉不到50%。

我们可以简单对比一下 micropython 的常用芯片 STM32F405RG 和这次跑 PikaScript 的芯片STM32G070CB

RAM资源对比

image

Flash资源对比

image

参考价对比(以2021年9月11日立创商城10片售价为参考)

image

拓展能力如何呢?

除了设备驱动之外,为 mcu 开发自定义的 python 脚本绑定在 pikascript 的开发框架下非常轻松,下面两个 Demo 就是自定义的C模块拓展,这个 Demo 基于 ARM-2D 图像驱动库开发了一些 python 脚本接口。

几个小方块~

Hnet-image (7)

几个旋转太阳~

Hnet-image (6)

MIT License Copyright (c) 2021 lyon 李昂 liang6516@outlook.cmo Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

PikaScript是一个完全重写的超轻量级python引擎,零依赖,零配置,可以在少于4KB的RAM下运行(如stm32g030c8和stm32f103c8),极易部署和扩展 展开 收起
C
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
C
1
https://gitee.com/lifan2021/pikascript.git
git@gitee.com:lifan2021/pikascript.git
lifan2021
pikascript
pikascript
master

搜索帮助

14c37bed 8189591 565d56ea 8189591