PF 语言旨在解决传统单片机开发逻辑僵化、更新困难的痛点,用最小的资源换取最大的灵活性。
解释器核心代码不到 500 行。运行时仅需 500 Byte RAM 和 3K Byte ROM,适合各类低成本 MCU。
完全兼容 C 语言基础语法。嵌入式工程师无需学习新语言,上手即用,所见即所得。
解释器通过 1ms 周期调用,采用协作式多任务模型。不阻塞主循环,不影响原有 C 程序运行。
脚本可直接调用 C 函数,读取 C 数组。支持注册自定义回调,打通脚本与硬件驱动的壁垒。
PF 语言专为资源受限环境设计,采用创新的“宿主-脚本”分离架构,将编译的复杂性留在 PC 端,将执行的灵活性带入 MCU。
在 PC 端使用 C# 编译器对脚本进行词法分析与编译。编译器会进行语法检查,并将 C 风格源码转换为高度紧凑的二进制字节码(Bytecode),通常仅几十字节。
生成的字节码可通过 UART、CAN、蓝牙或 WiFi 等任意链路发送至单片机。PF 解释器支持动态加载,无需复位 MCU 即可更新业务逻辑。
基于栈的虚拟机 (VM) 在 MCU 内部运行。通过 periodic_task_1ms 周期调用,解释器以非抢占方式执行指令。sleep 指令会自动挂起 VM 并让出 CPU 资源。
通过 FFI (Foreign Function Interface) 表,脚本可以直接调用宿主 C 程序注册的函数(如 GPIO 控制、传感器读取),实现软硬件的深度融合。
// 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);
}
}
// 单片机固件主循环 (Host)
while (1) {
// 1. 执行关键实时任务 (如电机控制)
Motor_Loop();
// 2. 执行通信协议栈
Protocol_Process();
// 3. PF 解释器步进 (仅占用极短时间)
// 如果脚本在 sleep,此函数立即返回
periodic_task_1ms(sys_tick);
Delay_ms(1);
}
PF 语言完全由个人独立开发,旨在为嵌入式社区提供更灵活的工具。如果您觉得这个项目对您的工作有帮助,或者希望加速多任务功能的研发,欢迎通过下方二维码进行捐赠。您的每一份支持都是项目前进的动力!
附言:非常感谢您的慷慨解囊,所有捐赠将用于维护网站和后续功能开发。