提交 a89e8072 编写于 作者: chai2010's avatar chai2010

本地增加 arduino 模拟执行

上级 42a5c407
...@@ -12,8 +12,12 @@ build-wasm: ...@@ -12,8 +12,12 @@ build-wasm:
win-exe-icon: win-exe-icon:
windres -o main_rc_windows.syso main.rc windres -o main_rc_windows.syso main.rc
arduino: arduino-run:
go run main.go -target=arduino arduino.wa
arduino-build:
go run main.go build -target=arduino arduino.wa go run main.go build -target=arduino arduino.wa
wat2wasm a.out.wat -o a.out.wasm wat2wasm a.out.wat -o a.out.wasm
xxd -i a.out.wasm > app.wasm.h
clean: clean:
...@@ -6,7 +6,7 @@ var LED = arduino.GetPinLED() ...@@ -6,7 +6,7 @@ var LED = arduino.GetPinLED()
fn init() { fn init() {
arduino.PinMode(LED, 1) arduino.PinMode(LED, 1)
arduino.Println("Wa is running 😎") arduino.Println("Wa/Arduino is running 😎")
} }
fn main() { fn main() {
......
...@@ -41,9 +41,25 @@ func RunWasm(cfg *config.Config, filename string) (stdoutStderr []byte, err erro ...@@ -41,9 +41,25 @@ func RunWasm(cfg *config.Config, filename string) (stdoutStderr []byte, err erro
r := wazero.NewRuntime(ctx) r := wazero.NewRuntime(ctx)
defer r.Close(ctx) defer r.Close(ctx)
switch cfg.WaOS {
case config.WaOS_Arduino:
if _, err = waruntime.ArduinoInstantiate(ctx, r); err != nil {
return nil, err
}
case config.WaOS_Chrome:
if _, err = waruntime.ChromeInstantiate(ctx, r); err != nil {
return nil, err
}
case config.WaOS_Walang:
if _, err = waruntime.WalangInstantiate(ctx, r); err != nil { if _, err = waruntime.WalangInstantiate(ctx, r); err != nil {
return nil, err return nil, err
} }
case config.WaOS_Wasi:
if _, err = waruntime.WasiInstantiate(ctx, r); err != nil {
return nil, err
}
}
_, err = r.InstantiateModuleFromBinary(ctx, wasmBytes) _, err = r.InstantiateModuleFromBinary(ctx, wasmBytes)
if err != nil { if err != nil {
......
...@@ -4,12 +4,62 @@ package waruntime ...@@ -4,12 +4,62 @@ package waruntime
import ( import (
"context" "context"
"fmt"
"time"
"github.com/tetratelabs/wazero" "github.com/tetratelabs/wazero"
"github.com/tetratelabs/wazero/api" "github.com/tetratelabs/wazero/api"
"github.com/wa-lang/wa/internal/config" "github.com/wa-lang/wa/internal/config"
) )
func ArduinoInstantiate(ctx context.Context, rt wazero.Runtime) (api.Module, error) { func ArduinoInstantiate(ctx context.Context, rt wazero.Runtime) (api.Closer, error) {
return rt.NewHostModuleBuilder(config.WaOS_Arduino).Instantiate(ctx, rt) startTime := time.Now()
return rt.NewHostModuleBuilder(config.WaOS_Arduino).
NewFunctionBuilder().
WithFunc(func(ctx context.Context, m api.Module) int32 {
t := time.Now().Sub(startTime).Milliseconds()
fmt.Printf("arduino.millis(): %v\n", t)
return int32(t)
}).
WithParameterNames().
Export("millis").
NewFunctionBuilder().
WithFunc(func(ctx context.Context, ms uint32) {
fmt.Printf("arduino.delay(%d)...\n", ms)
time.Sleep(time.Millisecond * time.Duration(ms))
}).
WithParameterNames("ms").
Export("delay").
NewFunctionBuilder().
WithFunc(func(ctx context.Context, pin, mode int32) {
if mode == 0 {
fmt.Printf("arduino.pinMode(%d, %s)\n", pin, "LOW")
} else {
fmt.Printf("arduino.pinMode(%d, %s)\n", pin, "HIGH")
}
}).
WithParameterNames("pin", "mode").
Export("pinMode").
NewFunctionBuilder().
WithFunc(func(ctx context.Context, pin, value int32) {
fmt.Printf("arduino.digitalWrite(%d, %d)\n", pin, value)
}).
WithParameterNames("pin", "value").
Export("digitalWrite").
NewFunctionBuilder().
WithFunc(func(ctx context.Context) int32 {
const pin = 13
fmt.Printf("arduino.getPinLED(): %v\n", pin)
return pin
}).
WithParameterNames().
Export("getPinLED").
NewFunctionBuilder().
WithFunc(func(ctx context.Context, m api.Module, ptr, len uint32) {
bytes, _ := m.Memory().Read(ctx, ptr, len)
fmt.Printf("arduino.print(%q)\n", string(bytes))
}).
WithParameterNames("ptr", "len").
Export("print").
Instantiate(ctx, rt)
} }
...@@ -10,6 +10,6 @@ import ( ...@@ -10,6 +10,6 @@ import (
"github.com/wa-lang/wa/internal/config" "github.com/wa-lang/wa/internal/config"
) )
func ChromeInstantiate(ctx context.Context, rt wazero.Runtime) (api.Module, error) { func ChromeInstantiate(ctx context.Context, rt wazero.Runtime) (api.Closer, error) {
return rt.NewHostModuleBuilder(config.WaOS_Chrome).Instantiate(ctx, rt) return rt.NewHostModuleBuilder(config.WaOS_Chrome).Instantiate(ctx, rt)
} }
...@@ -12,7 +12,7 @@ import ( ...@@ -12,7 +12,7 @@ import (
const envWalang = "wa_js_env" const envWalang = "wa_js_env"
func WalangInstantiate(ctx context.Context, rt wazero.Runtime) (api.Module, error) { func WalangInstantiate(ctx context.Context, rt wazero.Runtime) (api.Closer, error) {
return rt.NewHostModuleBuilder(envWalang). return rt.NewHostModuleBuilder(envWalang).
NewFunctionBuilder(). NewFunctionBuilder().
WithFunc(func(ctx context.Context, m api.Module, pos, len uint32) { WithFunc(func(ctx context.Context, m api.Module, pos, len uint32) {
......
...@@ -6,9 +6,10 @@ import ( ...@@ -6,9 +6,10 @@ import (
"context" "context"
"github.com/tetratelabs/wazero" "github.com/tetratelabs/wazero"
"github.com/tetratelabs/wazero/api"
"github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1" "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1"
) )
func WasiInstantiate(ctx context.Context, rt wazero.Runtime) { func WasiInstantiate(ctx context.Context, rt wazero.Runtime) (api.Closer, error) {
wasi_snapshot_preview1.MustInstantiate(ctx, rt) return wasi_snapshot_preview1.Instantiate(ctx, rt)
} }
# 版权 @2022 凹语言 作者。保留所有权利。 # 版权 @2022 凹语言 作者。保留所有权利。
import "syscall/arduino"
var WAOS = "arduino" var WAOS = "arduino"
#wa:linkname $runtime.waPrintI32 #wa:linkname $runtime.waPrintI32
...@@ -9,4 +11,6 @@ fn waPrintI32(i: i32) {} ...@@ -9,4 +11,6 @@ fn waPrintI32(i: i32) {}
fn waPrintRune(ch: i32) {} fn waPrintRune(ch: i32) {}
#wa:linkname $runtime.waPuts #wa:linkname $runtime.waPuts
fn waPuts(ptr: i32, len: i32) {} fn waPuts(ptr: i32, len: i32) {
arduino.PrintRawString(ptr, len)
}
...@@ -10,49 +10,27 @@ var ( ...@@ -10,49 +10,27 @@ var (
) )
#wa:import arduino millis #wa:import arduino millis
#wa:linkname $waMillis
fn Millis() => i32 fn Millis() => i32
#wa:import arduino delay #wa:import arduino delay
#wa:linkname $waDelay
fn Delay(ms: i32) fn Delay(ms: i32)
#wa:import arduino pinMode #wa:import arduino pinMode
#wa:linkname $waPinMode
fn PinMode(pin, mode: i32) fn PinMode(pin, mode: i32)
#wa:import arduino digitalWrite #wa:import arduino digitalWrite
#wa:linkname $waDigitalWrite
fn DigitalWrite(pin, value: i32) fn DigitalWrite(pin, value: i32)
#wa:import arduino getPinLED #wa:import arduino getPinLED
#wa:linkname $waGetPinLED
fn GetPinLED() => i32 fn GetPinLED() => i32
#wa:import arduino print #wa:import arduino print
#wa:linkname $waPrint fn PrintRawString(ptr: i32, len: i32)
fn Print(s: string)
#wa:import arduino getGreeting fn Print(s: string) {
#wa:linkname $waGetGreeting print(s)
fn _getGreeting(buf: *byte, maxlen: i32)
fn Println(s: string) {
Print(s)
Print("\n")
}
#wa:linkname $waPrintI32
fn waPrintI32(i: i32) {
# TODO
} }
#wa:linkname $waPrintRune fn Println(s: string) {
fn waPrintRune(ch: i32) { println(s)
# TODO
}
#wa:linkname $waPuts
fn waPuts(ptr: i32, len: i32) {
# TODO
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册