• Stars
    star
    135
  • Rank 269,297 (Top 6 %)
  • Language
    C
  • License
    MIT License
  • Created almost 3 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Run statically-compiled WebAssembly apps on any embedded platform

SWUbanner

embedded-wasm-apps

Run native, statically-compiled apps on any platform, using WebAssembly.
Examples include AssemblyScript, Rust, C/C++, TinyGo, Zig, etc.

How it works

This does not use Wasm3 engine. The approach is similar to WasmBoxC or RLBox:

  1. Compile source code to wasm
  2. Translate wasm to C using wasm2c
  3. Compile produced C, link with a thin runtime implementation using the native platform toolchain

How it works

Benefits

  • Language/toolchain decoupling
  • Resilience against attacks (RCE, Control-flow hijacking)
  • Sandboxing / SFI (Software Fault Isolation)
  • Enables wasm transformations, like instrumentation or gas metering
  • Software-based memory virtualization
  • Moderate runtime overhead (mostly depends on the source language/runtime)
    • Small performance hit (~50% slowdown)
    • Moderate binary size increase
  • Highly portable

Example

$ make APP=rust
    Finished release [optimized] target(s) in 0.00s
$ pio run -e esp32 -t upload
$ pio device monitor
Initializing WebAssembly...
🦀 Rust is running!

$ make APP=assemblyscript
    > npm run asbuild:optimized
$ pio run -e esp32 -t upload
$ pio device monitor
Initializing WebAssembly...
🚀 AssemblyScript is running!

$ make APP=tinygo
$ pio run -e esp32 -t upload
$ pio device monitor
Initializing WebAssembly...
🤖 TinyGo is running!

Building WASM apps

Ensure WABT and Binaryen tools are in your PATH.

# AssemblyScript (needs Node.js)
cd apps/assemblyscript
npm install
cd ../..
make APP=assemblyscript

# Rust
rustup target add wasm32-unknown-unknown
make APP=rust

# C/C++ (needs wasienv)
make APP=cpp

# TinyGo (needs TinyGo v0.21.0 and Go v1.17.3)
make APP=tinygo

# Zig (needs Zig v0.9.0)
make APP=zig

Building and running with PlatformIO

# For ESP32:
pio run -e esp32 -t upload

# For ESP8266:
pio run -e esp8266 -t upload

# For Raspberry Pi Pico:
pio run -e rpi-pico -t upload

# Open serial monitor
pio device monitor --quiet

Building and running with Particle

Requires particle-cli. Should work on all Particle devices i.e. Spark Core, Photon, Electron, Argon, Boron:

particle flash MyDevice ./src/

# Open serial monitor
particle serial monitor --follow

License

This project is released under The MIT License (MIT)