Open usuyuki opened 10 months ago
毎回同じ値になるが、WebAssemblyを変えると変わる
abs(-2): 2
constrain(100,0,10): 21
max(100,200): 14
min(100,200): 14
pow(2,3): 0.000000
sq(4): 0
sqrt(4): 0.000000
abs(-8): 8
absはいつも正しい。
WebAssembly内のスタック領域で範囲外アクセスしてるか、wasm3が間違ってる説。
もちろんCで直叩きするとちゃんと出る。
m3ApiRawFunction(m3_max)
{
m3ApiGetArg(long, x);
m3ApiGetArg(long, y);
m3ApiReturnType(long);
Serial.print("max:");
Serial.println(max(x, y));
m3ApiReturn(max(x, y));
m3ApiSuccess();
}
にしてみると、やっぱりC上ではちゃんと出てる。
max(100,200): max:100
14
Arduino関数の実装は正しそう。
いったん最低限にして見てみる。
package main
import (
"github.com/project-mahiwa/mahiwa-frontend-go/arduino"
"github.com/project-mahiwa/mahiwa-frontend-go/serial"
)
// mainはtarget wasiのときに絶対に必要
func main() {
serial.Print("Hello mahiwa written in Go language")
serial.Print("max(100,200): ")
serial.PrintLong(arduino.Max(100, 200))
serial.Println("")
}
結果
Hello mahiwa written in Go languagemax(100,200): max:100
0
になるので、メモリ不足とかではなさそう。
absがintなので、longがだめなのかと思ったが、sqもだめなので、謎。 型でもない。
Rustではabsすらだめ。 根本的な問題な気がする。
ポインタがずれてるみたいな挙動
一旦マージして、型をWebAssembly側に寄せたものを作る
Project Mahiwa started🎉
Project Mahiwa : WebAssembly launch
Hello mahiwa written in Go languageprintLong test
307163591
==seed1==
1481765933
1085377743
Cos(0.0): 1.000000
Cos(1.0): 0.540302
Sin(1.0): 0.841471
Sin(0.0): 0.000000
Tan(1.0): 1.557408
Tan(1.1): 1.964760
abs(-2): 2
constrain(100,0,10): 21
max(100,200): max:100
14
min(100,200): 14
pow(2,3): 0.000000
sq(4): 0
sqrt(4): 0.000000
abs(-2): 8
Project Mahiwa : WebAssembly done
Project Mahiwa started🎉
ESP32 Mode
CPU Frequency:240 MHz
Project Mahiwa : WebAssembly launch
Hello mahiwa written in Go languageprintLong test
307163591
==seed1==
1481765933
1085377743
Cos(0.0): 1.000000
Cos(1.0): 0.540302
Sin(1.0): 0.841471
Sin(0.0): 0.000000
Tan(1.0): 1.557408
Tan(1.1): 1.964760
abs(-2): 2
constrain(100,0,10): 21
max(100,200): max:100
14
min(100,200): 14
pow(2,3): 0.000000
sq(4): 0
sqrt(4): 0.000000
abs(-2): 8
Project Mahiwa : WebAssembly done
このことから,FreeRTOSに確保するスタックサイズの問題でないし,マイコン固有の異問題でもないことが伺える.
m3ApiReturn(max(x,y));をm3ApiReturn(111);にしてみる →が0のまま.
m3ApiReturn(2147483647); してみる.
int32の最大値にすることで,エンディアン逆でも何らかの値帰ってきそう.
→→0のまま.エンディアンですらなさそう・
🐛 概要
原因
備考
print文自体は正常だし、スタックも増やして動くようにしたので謎。