Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

wasm3/embedded-wasm-apps

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

64 Commits

Repository files navigation

SWUbanner

embedded-wasm-apps

Run native, statically-compiled apps on any platform, using WebAssembly.
Examples include AssemblyScript, Rust, C/C++, TinyGo, Zig, Virgil, WAT, 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 (~10-30% slowdown compared to native modules)
    • 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 the required tools are in your PATH:

# AssemblyScript v0.27 (needs Node.js)
make APP=assemblyscript
# Rust 1.80.1
rustup target add wasm32-unknown-unknown
make APP=rust
# C/C++ (needs Clang)
make APP=cpp
# C99 Coremark (needs Clang)
make APP=coremark
# TinyGo v0.33.0 + Go v1.23.0
make APP=tinygo
# Zig v0.13.0
make APP=zig
# Virgil (Aeneas III-7.1632)
make APP=virgil
# WAT
make APP=wat

Resulting WASM file comparison:

AS C/C++ Coremark Rust TinyGo Virgil WAT Zig
3951 864 10800 12264 1227 315 223 1057

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, P2 / Photon2:

particle flash MyDevice ./src/*
# Open serial monitor
particle serial monitor --follow

License

This project is released under The MIT License (MIT)

About

Run statically-compiled WebAssembly apps on any embedded platform

Topics

Resources

License

Stars

Watchers

Forks

Contributors 2

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /