mcpField
W
wendy-lite

wendy-lite

github.com/wendylabsinc开发6265 次安装5 周前更新
代码仓库

关于 wendy-lite

Wendy Lite 是在 ESP32-C6 微控制器上运行 WebAssembly 应用的固件,面向希望使用多种语言开发设备应用的开发者。WASM 应用可通过宿主导入函数访问硬件。

主要功能

  1. 01基于 WAMR 的 WASM 运行时
  2. 02支持 C、Rust、Swift、Zig、TypeScript 或 WAT
  3. 03提供 GPIO、I2C、SPI、UART 等硬件 API
  4. 04通过 USB CDC 和 WiFi 上传应用
  5. 05闪存持久化及启动时加载
  6. 06支持异步事件回调

适用场景

  1. 01在 ESP32-C6 设备上运行 WASM 应用
  2. 02使用支持的语言构建设备端应用
  3. 03从 WASM 控制 GPIO、总线和外设
  4. 04通过 USB 或 WiFi 上传并运行应用

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/wendylabsinc/claude-skills --skill wendy-lite

安装后在 Claude Code 中输入/wendy-lite确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
firmware-config.md
swift-sdk.md
wasm-api.md

详细介绍

Wendy Lite

Wendy Lite 是适用于 ESP32-C6 微控制器的 WebAssembly(WASM)运行时固件。它让开发者能够使用 C、Rust、Swift、Zig、TypeScript 或 WAT 编写应用,将其编译为 WASM,并在设备上运行,同时完全访问硬件。

核心概念

  • WAMR 运行时:使用 WebAssembly Micro Runtime 执行 WASM 二进制文件
  • 主机导入:WASM 应用从 "wendy" 模块导入函数以访问硬件
  • 回调系统:异步事件(GPIO 中断、定时器、BLE)通过导出的 wendy_handle_callback 分发
  • 闪存持久化:WASM 二进制文件存储在闪存分区 wasm_a(2MB)中,并在启动时自动加载
  • 多语言:应用可使用 C、Rust、Swift 6.0+、Zig、TypeScript 或原始 WAT 编写

项目结构

wendy-lite/
├── main/wendy_main.c              # Firmware entry point, WASM lifecycle manager
├── components/
│   ├── wendy_wasm/                # WAMR integration (load, run, stop modules)
│   ├── wendy_hal/                 # Hardware: GPIO, I2C, RMT, NeoPixel, Timer
│   ├── wendy_hal_export/          # Registers HAL as WASM host imports
│   ├── wendy_usb/                 # USB CDC wire protocol for app upload
│   ├── wendy_wifi/                # WiFi station + HTTP binary download
│   ├── wendy_ble_prov/            # BLE WiFi provisioning ("Wendy-XXXX")
│   ├── wendy_cloud_prov/          # Cloud device certificate provisioning
│   ├── wendy_callback/            # Async ISR-safe event dispatch (max 32 handlers)
│   ├── wendy_storage/             # NVS key-value storage for apps
│   ├── wendy_uart/                # UART serial communication
│   ├── wendy_spi/                 # SPI bus master
│   ├── wendy_sys/                 # System: reboot, uptime, device ID
│   ├── wendy_otel/                # OpenTelemetry: logs, metrics, traces
│   ├── wendy_ble/                 # BLE peripheral/central (optional)
│   ├── wendy_net/                 # TCP/UDP sockets, DNS, TLS (optional)
│   ├── wendy_wasi_shim/           # WASI compatibility layer
│   ├── wendy_safety/              # Memory safety
│   └── wendy_app_usb/             # USB from WASM app perspective (optional)
├── wasm_apps/                     # Example WASM applications
│   ├── include/wendy.h            # App API header (all host imports)
│   ├── Makefile                   # Build system for all app languages
│   ├── blink/                     # C: GPIO LED blink
│   ├── i2c_sensor/                # C: BMP280 I2C sensor reader
│   ├── swift_display/             # Swift 6.0+ embedded WASM app
│   ├── rust_blink/                # Rust WASM app
│   ├── zig_blink/                 # Zig WASM app
│   └── wat_blink/                 # Raw WebAssembly Text
├── partitions.csv                 # Flash layout (nvs, factory, wasm_a, storage)
├── sdkconfig.defaults             # ESP-IDF + WAMR + feature flags
└── diagram.json                   # Wokwi simulator circuit

编写 WASM 应用

C(推荐用于入门)
#include "wendy.h"

void _start(void) {
    gpio_configure(2, WENDY_GPIO_OUTPUT, WENDY_GPIO_PULL_NONE);
    for (int i = 0; i < 10; i++) {
        gpio_write(2, 1);
        timer_delay_ms(500);
        gpio_write(2, 0);
        timer_delay_ms(500);
    }
}

构建:

cd wasm_apps
make blink

或手动构建:

clang --target=wasm32 -O2 -nostdlib -I include \
  -Wl,--no-entry -Wl,--export=_start -Wl,--allow-undefined \
  -o app.wasm app.c
Swift(推荐用于应用开发)

Swift 应用使用 https://github.com/wendylabsinc/wendy-lite 中的 WendyLite Swift 软件包,该软件包为所有 WASM 主机导入提供类型安全的封装。

完整的 Swift API 参考、Package.swift 设置和示例,请参阅 references/swift-sdk.md。

要点:

  • 需要 Swift 6.0+,并支持 Embedded Swift
  • 使用 @_cdecl("_start") 作为 WASM 入口点
  • 不进行堆分配——使用栈分配的元组缓冲区
  • 仅使用 StaticString——不在运行时构造字符串
  • 通过 UnsafeRawPointer 将 UnsafePointer<UInt8> 转换为 UnsafePointer<CChar>,以用于 API 调用
  • 使用 wendy run 构建并部署

快速入门:

import WendyLite

@_cdecl("_start")
func start() {
    GPIO.configure(pin: 2, mode: .output)
    GPIO.write(pin: 2, level: 1)
    System.sleepMs(1000)
    GPIO.write(pin: 2, level: 0)
}
其他语言
语言构建命令要求
Rustmake rust_blinkrustup(非 Homebrew Rust)
Zigmake zig_blinkZig 0.13+
WATmake wat_blinkWABT(wat2wasm)
应用要求
  1. 导出 _start 函数作为入口点
  2. 从 "wendy" 模块导入主机函数
  3. 对于异步回调,导出 wendy_handle_callback(int handler_id, int arg0, int arg1, int arg2)
  4. 调用 sys_yield() 以允许分发回调

硬件访问概览

子系统关键函数说明
GPIOgpio_configure、gpio_read、gpio_write、gpio_set_pwm、gpio_analog_read、gpio_set_interrupt支持输入、输出、PWM、ADC 和中断
I2Ci2c_init、i2c_scan、i2c_write、i2c_read、i2c_write_read固件已预先初始化总线 0
NeoPixelneopixel_init、neopixel_set、neopixel_clear通过 RMT 控制 WS2812 RGB LED
定时器timer_delay_ms、timer_millis、timer_set_timeout、timer_set_interval阻塞式延迟和异步回调
UARTuart_open、uart_write、uart_read、uart_set_on_receive带回调的串口
SPIspi_open、spi_transfer、spi_close全双工主机
存储storage_get、storage_set、storage_delete、storage_exists持久化 NVS 键值存储
系统sys_reboot、sys_uptime_ms、sys_device_id、sys_yield设备信息和控制
OTelotel_log、otel_metric_*、otel_span_*结构化日志、指标和追踪
BLEble_init、ble_advertise_start、ble_gatts_*、ble_gattc_*可选,默认禁用
WiFiwifi_connect、wifi_status、wifi_get_ip、wifi_ap_start面向应用的 WiFi 控制
套接字net_socket、net_connect、net_send、net_recvTCP/UDP,可选
TLStls_connect、tls_send、tls_recv安全连接
控制台wendy_print输出到 UART 和 USB

启动与生命周期

  1. 固件初始化 NVS、WAMR 池、HAL、USB、BLE 配网和 WiFi
  2. WASM 管理器线程启动,并注册所有 HAL 导出项
  3. 从闪存分区 wasm_a 自动加载 WASM(如果存在)
  4. 在专用线程(8KB 栈)中运行 WASM _start()
  5. 事件循环处理上传、运行、停止和重置请求

上传 WASM 二进制文件

  • WiFi:完成 WiFi 配网后,通过 UDP 监听器进行 HTTP 下载
  • USB CDC:采用包含 PING、UPLOAD(START/CHUNK/DONE)、RUN、STOP、RESET 消息的线协议
  • Flash:写入 wasm_a 分区,并附带 4 字节大小头信息,重启后仍会保留

BLE 配网

设备通过 BLE 广播为“Wendy-XXXX”。客户端可以:

  1. 通过 BLE 扫描发现设备
  2. 通过 GATT 特征发送 WiFi SSID/密码
  3. 设备连接 WiFi 并启动 mDNS + UDP 监听器

构建固件

# Requires ESP-IDF (v5.x) with ESP32-C6 support
idf.py set-target esp32c6
idf.py build
idf.py flash monitor

Wokwi 模拟器

项目包含 wokwi.toml 和 diagram.json,可在没有实体开发板的情况下进行硬件模拟。

内存限制

  • WAMR 池:229KB(在 WiFi/BLE 启动前预分配)
  • WASM 栈:8KB,堆:8KB
  • Flash:总计 4MB(1.875MB 固件、2MB WASM、64KB 应用存储)
  • 将 WiFi/PHY IRAM 转存至 Flash,以释放约 15-25KB DIRAM

参考文件

根据需要加载以下文件,了解特定主题:

  • references/swift-sdk.md - WendyLite Swift 包:Package.swift 设置、完整的 Swift API 参考、Embedded Swift 限制、栈缓冲区模式、代码示例
  • references/wasm-api.md - 完整的 WASM 应用 API:所有主机导入项、常量、回调系统,以及各子系统的函数签名和用法(C 级别)
  • references/firmware-config.md - ESP-IDF sdkconfig 选项、分区表、功能标志、内存调优、组件启用/禁用

评论

支持 Markdown