For the complete documentation index, see llms.txt. This page is also available as Markdown.

ESP32

Learn how BoxLang can be deployed to ESP32 devices.

Building for ESP32

MatchBox supports building and flashing BoxLang scripts directly to ESP32 microcontrollers. This is achieved by cross-compiling a specialized MatchBox runner for the Xtensa or RISC-V architectures and deploying your compiled bytecode to a dedicated flash partition.

Prerequisites

To build for ESP32, you must have the following installed on your development machine:

  1. Rust ESP32 Toolchain: Install using espup:

    cargo install espup
    espup install
    # Follow instructions to source the export-esp.sh script
  2. espflash: For flashing the binary to the device. Version 3.3.0+ is required.

  3. ESP-IDF Prerequisites: Standard C build tools, Python, and CMake (required for the esp-idf-sys crate).

WSL Users (USB Access)

If you are using Windows Subsystem for Linux (WSL), you must "attach" your USB device to the Linux instance using usbipd-win.

From a Windows Administrator PowerShell:

usbipd list
usbipd attach --busid <BUSID> --auto-attach

Building and Flashing

Use the --target esp32 flag to trigger an ESP32 build. You should always specify your chip type via --chip (e.g., esp32, esp32s3, esp32c3).

1. Initial Setup (Full Flash)

The first time you flash a device, you must perform a "Full Flash." This installs the MatchBox Runner firmware and the custom partition table required for BoxLang.

Note: --full-flash implicitly triggers the flash process.

2. Fast Deployment (Default)

Once the Runner is on the device, you only need to update the BoxLang bytecode. This takes ~1 second and does not require re-flashing the firmware.

Watch Mode (Live Coding)

MatchBox features a built-in watch mode that provides a "Hot Reload" experience for physical hardware.

What Watch Mode does:

  1. Initial Flash: Performs a fast-deploy of your script.

  2. Integrated Monitor: Automatically opens espflash monitor and performs a hardware reset.

  3. Auto-Update: Watches your directory for .bxs changes. Upon save, it kills the monitor, flashes the new bytecode in 1s, and restarts the monitor/reset cycle.

How it Works

  1. Compilation: Your .bxs script is compiled into .bxb bytecode using the Postcard serialization format, ensuring 64-bit to 32-bit architecture compatibility.

  2. Partitioning: MatchBox uses a custom partition table (partitions.csv) that reserves a 1MB storage partition at offset 0x110000 for bytecode.

  3. Runtime: The ESP32 Runner starts a dedicated FreeRTOS task with a 48KB stack to host the MatchBox VM.

  4. Environment Awareness: The BoxLang server scope is automatically populated with hardware information (e.g., server.os.arch will return xtensa or riscv).

Memory and Performance

  • SRAM: ESP32 devices have limited memory (usually 520KB). The VM is configured with a large stack to prevent overflows, but you should still be mindful of creating massive arrays.

  • Flash: The VM and runtime add roughly 800KB - 1.2MB to the firmware size. The bytecode is stored separately in the 1MB storage partition.

Native Hardware Access

Standard BoxLang BIFs (Built-in Functions) like println are mapped to the ESP32's serial console. To access hardware pins (GPIO, I2C, WiFi), you can use Native Fusion or use a BoxLang module that provides hardware wrappers.

Last updated

Was this helpful?