v1.0.0 beta 测试版

为单片机而生的
嵌入式脚本语言

采用 C 语言语法,解释器仅需 500 字节 RAM。无缝挂载至现有 C 工程,实现逻辑动态更新,无需重新烧录固件。

查看技术文档

核心特性

PF 语言旨在解决传统单片机开发逻辑僵化、更新困难的痛点,用最小的资源换取最大的灵活性。

极度轻量

解释器核心代码不到 500 行。运行时仅需 500 Byte RAM 和 3K Byte ROM,适合各类低成本 MCU。

C 语言语法

完全兼容 C 语言基础语法。嵌入式工程师无需学习新语言,上手即用,所见即所得。

非侵入式集成

解释器通过 1ms 周期调用,采用协作式多任务模型。不阻塞主循环,不影响原有 C 程序运行。

强大的 FFI

脚本可直接调用 C 函数,读取 C 数组。支持注册自定义回调,打通脚本与硬件驱动的壁垒。

工作原理与架构

PF 语言专为资源受限环境设计,采用创新的“宿主-脚本”分离架构,将编译的复杂性留在 PC 端,将执行的灵活性带入 MCU。

1. 编写与编译 (Compile)

在 PC 端使用 C# 编译器对脚本进行词法分析与编译。编译器会进行语法检查,并将 C 风格源码转换为高度紧凑的二进制字节码(Bytecode),通常仅几十字节。

2. 动态传输 (Transmit)

生成的字节码可通过 UART、CAN、蓝牙或 WiFi 等任意链路发送至单片机。PF 解释器支持动态加载,无需复位 MCU 即可更新业务逻辑。

3. 协作式执行 (Execute)

基于栈的虚拟机 (VM) 在 MCU 内部运行。通过 periodic_task_1ms 周期调用,解释器以非抢占方式执行指令。sleep 指令会自动挂起 VM 并让出 CPU 资源。

4. 原生交互 (FFI)

通过 FFI (Foreign Function Interface) 表,脚本可以直接调用宿主 C 程序注册的函数(如 GPIO 控制、传感器读取),实现软硬件的深度融合。

logic.pf (脚本代码)
// PF 脚本:用户编写的业务逻辑
void main() {
    int val;
    int threshold = 500;
    
    while (1) {
        // 调用 C 注册的 API (FFI 绑定)
        val = sensor_read(0); 
        
        if (val > threshold) {
            log_error(val);
            set_bit(1, 1); // 亮红灯
        } else {
            set_bit(1, 0); // 灭灯
        }
        
        // 挂起 VM 100ms,让出 CPU 给主循环
        // 这是实现协作式多任务的关键
        sleep(100);
    }
}
firmware.c (宿主代码)
// 单片机固件主循环 (Host)
while (1) {
    // 1. 执行关键实时任务 (如电机控制)
    Motor_Loop(); 
    
    // 2. 执行通信协议栈
    Protocol_Process();
    
    // 3. PF 解释器步进 (仅占用极短时间)
    // 如果脚本在 sleep,此函数立即返回
    periodic_task_1ms(sys_tick);
    
    Delay_ms(1);
}