中文页 | Forum | Documents | Videos | BSP | Package Manager | RT-Thread package | Contribute | Business
PikaScript is an ultra-lightweight Python engine with zero dependencies and zero-configuration, that can run with 4KB of RAM and 32KB of flash (such as STM32G030C8 and STM32F103C8).
It's very easy to bind C function to python module with the help of Pika Pre-compiler.
Only write the API of python in .py
and the bindings are autoly generated by Pre-compiler.
Generator url: http://pikascript.com
Use Pika package manager PikaPackage.exe
-
Run the PikaPackage.exe directly, then the pikascript repo would be downloaded auto in the /tmp/pikascript folder of your current disc partition.
-
Add requestment.txt to the same folder of PikaPackage.exe then run PikaPackage.exe. The run-time core, pre-compiler and moudles would be installed in the current folder.
-
Released modules:packages.toml
You can use simulation project to quick start without hardware,or use the out-of-the-box develop board Pika-Pi—Zero.
The board based on STM32G030C8T6 MCU, only 64kB Flash, 8kB RAM can run PikaScript with total peripheral device (GPIO、TIME、IIC、RGB、KEY、LCD、RGB). CH340 is deployed to support USB to serial with Type-C USB, support download python script py serial, there are 4 RGB on the board and support the LCD.
https://pikadoc.readthedocs.io/en/latest/index.html
src - core code
bsp - mcu/board support
port - OS support
document - developt document
examples - example scripts
package - packages and moudles
pikaCompiler - pre-compiler write by Rust, used to bind C function to python moudle.
pikaPackageManager - pacakge manager
MCU | bsp | gpio | uart | pwm | adc | i2c |
---|---|---|---|---|---|---|
stm32g030c8 | √ | √ | √ | √ | √ | √ |
stm32g070cB | √ | √ | √ | √ | √ | √ |
stm32f103c8 | √ | √ | √ | √ | √ | √ |
stm32f103rb | √ | √ | √ | √ | √ | √ |
stm32f103ze | √ | √ | √ | √ | √ | √ |
stm32f103rc | √ | √ | √ | √ | √ | √ |
stm32f401cc | √ | √ | √ | √ | √ | √ |
stm32f411ce | √ | √ | √ | √ | √ | √ |
stm32f407ze | √ | |||||
stm32f407zg | √ | |||||
stm32h750vb | √ | |||||
stm32f051r8 | √ | |||||
ch582 | √ | √ | √ | √ | √ | |
ch32v103r8t6 | √ | √ | ||||
cm32m101a | √ | |||||
w801 | √ | |||||
w806 | √ | √ | √ | √ | √ | √ |
apm32f030r8 | √ | |||||
apm32e103vb | √ | |||||
bl-706 | √ | |||||
Raspberry Pico | √ | |||||
ESP32C3 | √ | |||||
TC264D | √ | |||||
devc | √ |
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 | port | GPIO | TIME | PWM |
---|---|---|---|---|
RT-Thread | √ | √ | √ | √ |
vsf | √ | √ |
OS | port | Google Test | Benchmark |
---|---|---|---|
linux | √ | √ | √ |
https://github.com/maxgerhardt/pikascript-pio-bluepill
Support run in mcu without OS or file system. Can run in everywhere with RAM ≥ 4kB and FLASH ≥ 32kB,such as stm32g030, stm32f103c8t6,esp8266.
Support run and program python scripts by serial.
Support IDEs like Keil, IAR, RT-Thread studio and segger embedded studio to develop C moudle.
Support build tools like CMake, makeFile and Scons.
Zero dependencies, zero configuration, out-of-the-box, easy to integrated into privious C projcet.
Eazy to extern customized C moudles.
Support linux.
Support subaggregate of python 3 standard syntax.
Support class and method define, encapsulation-inheritance-polymorphism and moudles in compile time - Based on Pika Pre-compiler.
Support method invoke, argument define, new object, free object, control flow(if\while) and operator ( + - * / < == > ). - Based on Pika Runtime Core.
Syntax | Compile-Time | Run-Time | Shell |
---|---|---|---|
Module Define | √ | - | - |
Module Import | √ | - | - |
Class Define | √ | √ | √ |
Class Inherit | √ | √ | √ |
Method Define | √ | √ | √ |
Method Override | √ | √ | √ |
Method Invoke | √ | √ | √ |
Argument Define | √ | √ | √ |
Argument Assignment | √ | √ | √ |
Object New | √ | √ | √ |
Object Free | √ | √ | √ |
Object Nest | √ | √ | √ |
Control flow | √ | √ | √ |
+ | - | * | / | == | > | < | >= | <= | % | ** | // | != | & | >> | << | and | or | not | += | -= | *= | /= |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
√ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
if | while | for | else | elif | break | continue |
---|---|---|---|---|---|---|
√ | √ | √ | √ | √ | √ | √ |
Readability first, nearly never use macro function and global argument.
Complete unit testes based on google test.
https://t.me/+JL3TZ9k-Lfg2OWE1
E-mail: [email protected]
The scripts in demos are in the examples folder.
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)
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)
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)
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)
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()
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
The maximum RAM usage of these demos is only 3.56K, which is 4.56K if the 1K stack is included, and the maximum Flash usage is 30.4K. Refer to the 20K RAM and 64K Flash of STM32F103C8T6, less than 25% RAM and less than 50% Flash are used.
A quick comparison can be made between the microPython chip STM32F405RG and the PikaScript chip STM32G070CB.
Reference price comparison (take the selling price of 10 pieces in Lichuang Mall on September 11, 2021 as reference)
In addition to device drivers, developing custom Python modules for MCU is very easy. The following two demos are extensions of the custom module, which developed python interfaces for the ARM-2D image driver library.
step1: Clone the repo
git clone https://github.com/pikastech/pikascript
cd pikascript/docker
step2: build and run the docker contianer
sh build.sh
sh run.sh
# now you are in the port/linux
step3: init the port/linux
sh pull-core.sh
sh init.sh
step4: test the core
sh gtest.sh
sh ci_benchmark.sh
step5: Run the REPL
sh run.sh
step1: Clone the repo
git clone https://github.com/pikastech/pikascript
cd pikascript/port/linux
step2: install dependency
sh install_dependency.sh # install dependency
step3: init the port/linux
sh pull-core.sh
sh init.sh
step4: test the core
sh gtest.sh
sh ci_benchmark.sh
step5: Run the REPL
sh run.sh
Content | Contributer |
---|---|
Donate:500¥ (ctypes 相关) | 蒋太平 |
fix linux install script | Maximilian Gerhardt |
ch582 package | 梦程MI |
ch582 BSP | 梦程MI |
Donate:EC600X QuecPython 开发板 | 移远通信 武加玉 |
Performance Point: 900->1400 | GorgonMeducer |
stm32f051r8 BSP | unsigned |
stm32f407ze BSP | unsigned |
devc BSP | unsigned |
TC264D BSP | unsigned |
PikaVM improvement | GorgonMeducer |
W801Device package | 刘延(微信名) |
W806 bsp | 刘延(微信名) |
Donate:ESP32C3 5pic,调试器 | 启明云端 沧御 |
Donate:LS1C101芯片10pic, LS1c101开发板,调试器 | 龙芯俱乐部 石南 |
PikaVSF OS package | versaloon |
ESP32C3 BSP | 沧御 |
Donate:ESP32开发板、墨水屏*4 | name(微信名) |
Donate:智龙开发板 | 龙芯俱乐部 石南 |
package/STM32F1 | sjy |
package/STM32F103RBBooter | sjy |
bsp/stm32f103rb | sjy |
基于QEMU的ARM-2D仿真工程 | liuduanfei |
Donate:GD32E103TB芯片2片 | 信息牛(微信名) |
Rt-thread 支持包、适配层、模块 | Meco Jianting Man |
Donate:移远EC600S-CN 4G模块 | 移远模块 |
Donate:博流BL706 开发板 | 博流智能 bouffalolab |
Donate:**移动CM32M101A 开发板 | 孟巍(微信名) |
Donate:APM32F030R8 开发板 | 极海半导体 陈成 |
Donate:APM32E103VB 开发板 | 极海半导体 陈成 |
Donate: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 | 甜航 |