#esp32 #wasm #hal #run-time #api #docker #idf

esp32-wasm-hal

ESP32 WASM环境的硬件抽象层(HAL)

1 个不稳定版本

0.1.0 2020年2月6日

#6 in #idf

GPL-3.0 许可证

5KB
95

帮助我摆脱编程语言工厂的困境

这是什么?

好吧,这是在 WebAssembly 上运行的 wasm3,在 esp32 上运行,并有一个API用于通过网络加载和执行实时应用程序,在运行时内部有与 embedded-hal 兼容的实现。

你可能还感兴趣

为什么,是这样?

这是一个非常好的问题。在我生活中,大多数ESP32设备运行的是几乎相同的固件,有一堆代码来管理wifi / mqtt / 文件和密钥存储等,然后是一小部分代码来与实际的传感器或执行器交互并发布该信息。此外,我希望能够在不真正思考的情况下通过网络部署更改,而且,我真的很喜欢嵌入式Rust...

目标是提供一个通用基础映像,它提供所有常用功能,并将任何有用的内容重新暴露给wasm运行时,以便用于应用程序代码、远程重新加载应用程序,以及一个硬件抽象层(HAL),这使得编写和部署应用程序变得非常容易。目前这主要针对Rust,然而,WASM API应该对其他语言有广泛的应用。请随意为您的最爱语言实现HAL!

状态/功能

这是一个绝对受诅咒的、大部分未经测试的工作进展。WASM和HTTP API需要定义/文档化,应用程序和参数的规范应扩展,还有许多组件尚未实现。

组件

  • WASM驱动程序
    • 延迟
    • 打印
    • spi
    • i2c(未经测试)
    • uart
  • 远程API
    • 读写文件
    • 读写密钥
    • 加载/卸载wasm
    • 启动/停止wasm
    • 获取/流式传输应用程序日志
  • CLI
    • 读写文件
    • 读写密钥
    • 加载/卸载wasm
    • 启动/停止wasm
    • 获取/流式传输应用程序日志
  • 杂项
    • 设备个性化(串行号,P/N等)
    • 基础映像OTA
    • mDNS设备发现

用法

您需要ESP32工具链和IDF来开发C项目。如果您使用Linux,可以使用预配置的Docker镜像,命令如下:docker run --rm -it -vpwd:/work --workdir=/work --device=/dev/ttyUSB0 espressif/idf。非Linux用户需要遵循ESP IDF入门指南

wasm API定义在wasm.c

  • 使用idf.py build进行构建
  • 使用idf.py flash进行烧录
  • 使用idf.py monitor连接到串行端口

通过串行终端(尝试help获取命令列表)或简单HTTP API支持运行和管理applet

  • 使用以下命令将二进制文件加载到设备中:curl "http://ESP_IP/fs?file=/spiffs/test.wasm" -X POST --data-binary @test.wasm
  • 使用以下命令将任务加载到内存中:curl "http://ESP_IP/app/cmd?cmd=load&name=test&file=/spiffs/test.wasm"
  • 使用以下命令执行任务:curl "http://ESP_IP/app/cmd?cmd=start"
  • 可选使用以下命令停止任务:curl "http://ESP_IP/app/cmd?cmd=stop"
  • 使用以下命令从内存中卸载任务:curl "http://ESP_IP/app/cmd?cmd=unload"

打算让此API)进行文档化,并(b)由esp32-wasm-cli取代

注意

  • 在编写C绑定函数时,必须使用m3ApiOffsetToPtr将缓冲区从偏移量解析为地址
  • 您需要最小化rustc堆栈大小"-C", "link-arg=-zstack-size=32768"否则rustc默认使用1MB的堆栈,这在没有SPIRAM的设备上无法运行。这里的权衡是您可能会耗尽堆栈空间,所以,情况各异。

我遇到问题/我能帮忙吗?

当然!打开一个问题或一个PR ^_^

依赖项

~93KB