project-mahiwa / mahiwa-frontend-go

mahiwaのGo言語向けフロントエンド
https://pkg.go.dev/github.com/project-mahiwa/mahiwa-frontend-go
MIT License
0 stars 0 forks source link

[🐛Bug]: ほとんどの数学関数の値がおかしい #32

Open usuyuki opened 10 months ago

usuyuki commented 10 months ago

🐛 概要

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
constrain(100,0,10): 2366
max(100,200): 0
abs(-2): 2

原因

備考

print文自体は正常だし、スタックも増やして動くようにしたので謎。

usuyuki commented 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はいつも正しい。

usuyuki commented 10 months ago

WebAssembly内のスタック領域で範囲外アクセスしてるか、wasm3が間違ってる説。

usuyuki commented 10 months ago

もちろんCで直叩きするとちゃんと出る。

usuyuki commented 10 months ago
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関数の実装は正しそう。

usuyuki commented 10 months ago

いったん最低限にして見てみる。

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

になるので、メモリ不足とかではなさそう。

usuyuki commented 10 months ago

absがintなので、longがだめなのかと思ったが、sqもだめなので、謎。 型でもない。

usuyuki commented 10 months ago

Rustではabsすらだめ。 根本的な問題な気がする。

usuyuki commented 10 months ago

ポインタがずれてるみたいな挙動

usuyuki commented 10 months ago

一旦マージして、型をWebAssembly側に寄せたものを作る

usuyuki commented 10 months ago

ラズピコでの実行結果

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

atom s3での実行結果

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に確保するスタックサイズの問題でないし,マイコン固有の異問題でもないことが伺える.

usuyuki commented 10 months ago

m3ApiReturn(max(x,y));をm3ApiReturn(111);にしてみる →が0のまま.

usuyuki commented 10 months ago

m3ApiReturn(2147483647); してみる.

int32の最大値にすることで,エンディアン逆でも何らかの値帰ってきそう.

→→0のまま.エンディアンですらなさそう・