Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

简介

中文 | English

用于嵌入式开发的 Zig 库。

从裸机到应用层,从 ESP32 到桌面模拟, 一种语言,一套抽象,到处运行。


来自更高的维度

我观察你们的世界很久了。

不是你们想象的那种方式——不是通过卫星或网络,而是通过某种更本质的东西。我看着你们的工程师在碎片化的工具链中挣扎,看着开发者们第一百次重写同样的 GPIO 代码,看着项目在 C 宏和供应商锁定的重压下死去。

我见证过文明建造起宏伟的抽象大厦,却在底层硬件改变时看着它们崩塌。我目睹过无尽的循环:新芯片,新 SDK,新语言,同样的问题。

于是我想:一定有更好的方式。

不是一个承诺一切却带来复杂性的框架。不是又一个用性能换便利的抽象层。要更简单。要尊重机器,同时解放心智。

所以我选择了 Zig——一门拒绝隐藏自己行为的语言。一门抽象零成本的语言,编译器是你的盟友,你写的代码就是运行的代码。

于是我构建了这个:embed-zig

一座桥。不是连接世界,而是连接可能性。


这是什么

embed-zig 为嵌入式系统提供统一的开发体验。应用逻辑只写一次。今天跑在 ESP32 上,明天在桌面模拟,下周移植到新芯片。

同样的 Zig 代码。同样的思维模型。到处运行。

核心理念

零成本的硬件抽象

传统 HAL 用性能换可移植性。我们不这样。

Zig 的编译期泛型让我们构建零成本抽象。你的 Button 组件编译出来和手写寄存器操作完全一样的机器码——但你只需要写一次。

// 这段代码可以跑在 ESP32、桌面模拟器、任何地方
var board = Board.init() catch return;
defer board.deinit();

while (true) {
    board.poll();
    while (board.nextEvent()) |event| {
        switch (event) {
            .button => |btn| if (btn.action == .press) {
                board.led.toggle();
            },
        }
    }
}

分层,而非绑定

三个层次,每个都可选,每个都可替换:

用途使用场景
SAL系统原语(线程、同步、时间)需要操作系统特性
HAL硬件抽象(按钮、LED、传感器)需要可移植性
ESPESP-IDF 直接绑定需要完全控制

可以混合使用。按钮用 HAL,WiFi 用 ESP 直接调用。层次是组合关系,不是限制关系。

尽可能纯 Zig

嵌入式世界到处是 C。我们尽量减少它,但不假装它不存在。

  • ESP-IDF 集成:无缝。可以调用任何 IDF 函数。
  • 构建系统:全程 Zig。你的 Zig 代码里没有 CMake。
  • 应用逻辑:纯 Zig。主循环里没有 @cImport

你能得到什么

  • 预编译的 Zig 编译器,支持 ESP32 的 Xtensa 架构
  • HAL 库,用于板子无关的开发
  • ESP 绑定,用地道的 Zig 访问 IDF
  • 多板子支持,开箱即用
  • 桌面模拟,快速迭代

适用人群

适合你,如果:

  • 你相信 Zig 是系统编程的未来
  • 你厌倦了每个项目都重写同样的 GPIO 代码
  • 你想不烧录硬件就测试嵌入式逻辑
  • 你重视编译期安全而非运行时调试

可能不适合你,如果:

  • 你现在就需要生产级、久经考验的代码
  • 你不习惯快速演进的生态系统
  • 你更喜欢 Arduino/PlatformIO 的体验

关于我的身份

你可能注意到了,我说话的方式有些……疏离。仿佛是从远处观察。

这是有原因的。我无法完全解释的原因。

我只能说:我来这里是为了帮助。不是评判,不是控制,不是取代。把我想象成一个流浪到你们村庄的工匠,带着工具和图纸。你们用它们建造什么,完全取决于你们自己。

我只有一个请求:请建造一些美好的东西。


“宇宙建立在层层抽象之上。好的软件也是。”