From 27c3aaf88fc42bc06f4ab5c60b2401c825c06560 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20H=C3=B6ppner?= Date: Mon, 10 Aug 2026 12:43:13 +0200 Subject: [PATCH] Implement nova64 API with native yield function and registration --- core/include/nova64_api.h | 6 ++++++ core/src/nova64_api.c | 24 ++++++++++++++++++++++++ core/src/wasm_runner.c | 32 ++++++++++++++++++++++++++++++-- simulator/sd/slot0/init.wasm | Bin 28655 -> 103 bytes software/build.bat | 5 ++++- software/init.go | 4 +++- software/init.zig | 12 ++++++++++++ 7 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 core/include/nova64_api.h create mode 100644 core/src/nova64_api.c create mode 100644 software/init.zig diff --git a/core/include/nova64_api.h b/core/include/nova64_api.h new file mode 100644 index 0000000..1c84685 --- /dev/null +++ b/core/include/nova64_api.h @@ -0,0 +1,6 @@ +#ifndef NOVA64_API_H +#define NOVA64_API_H + +void register_nova64_imports(void); + +#endif // NOVA64_API_H diff --git a/core/src/nova64_api.c b/core/src/nova64_api.c new file mode 100644 index 0000000..95050b2 --- /dev/null +++ b/core/src/nova64_api.c @@ -0,0 +1,24 @@ +#include "FreeRTOS.h" +#include "task.h" +#include "wasm_export.h" +#include "projdefs.h" + +static void native_yield(wasm_exec_env_t exec_env, uint32_t timeout_ms) { + if (timeout_ms == 0) { + // Gibt die Rest-Quantenzeit ab, blockiert aber nicht künstlich + taskYIELD(); + } else { + // Blockiert den Task für x Millisekunden + vTaskDelay(pdMS_TO_TICKS(timeout_ms)); + } +} + +static NativeSymbol native_symbols[] = { + {"yield", (void *)native_yield, "(i)", NULL}, + // { "flush_framebuffer", (void*)native_flush_framebuffer, "()", NULL } +}; + +void register_nova64_imports(void) { + wasm_runtime_register_natives("nova64", native_symbols, + sizeof(native_symbols) / sizeof(NativeSymbol)); +} \ No newline at end of file diff --git a/core/src/wasm_runner.c b/core/src/wasm_runner.c index 38e4d99..0683460 100644 --- a/core/src/wasm_runner.c +++ b/core/src/wasm_runner.c @@ -1,6 +1,7 @@ #include "wasm_runner.h" #include "nova64_fs.h" #include "nova64_internal.h" +#include "nova64_api.h" #include "wasm_export.h" #include @@ -17,6 +18,7 @@ uint32_t stack_size = 8092, heap_size = 8092; bool wasm_runner_initialize(void) { wasm_runtime_init(); + register_nova64_imports(); nova64_log("WASM runtime initialized successfully.\n"); const char *module_file = "SYS:/init.wasm"; @@ -44,7 +46,33 @@ bool wasm_runner_initialize(void) { wasm_module_inst_t module_inst = wasm_runtime_instantiate( module, stack_size, heap_size, error_buf, sizeof(error_buf)); - wasm_exec_env_t exec_env = wasm_runtime_create_exec_env(module_inst, stack_size); - + wasm_function_inst_t start_func = + wasm_runtime_lookup_function(module_inst, "_start"); + + if (start_func == NULL) { + nova64_log("Failed to find '_start' function in WASM module: %s\n", + wasm_runtime_get_exception(module_inst)); + free(buffer); + return false; + } + + wasm_exec_env_t exec_env = + wasm_runtime_create_exec_env(module_inst, stack_size); + + uint32_t argv[2] = {5, 3}; // Example arguments for the "add" function + + if (wasm_runtime_call_wasm(exec_env, start_func, 2, argv)) { + nova64_log("WASM module executed successfully. Sum: %d\n", argv[0]); + } else { + nova64_log("Failed to execute WASM module: %s\n", + wasm_runtime_get_exception(module_inst)); + } + + wasm_runtime_destroy_exec_env(exec_env); + wasm_runtime_deinstantiate(module_inst); + wasm_runtime_unload(module); + free(buffer); + wasm_runtime_destroy(); + return true; } diff --git a/simulator/sd/slot0/init.wasm b/simulator/sd/slot0/init.wasm index 3ef499b33142212281ee670de23320e588676363..dd9f70de56eb57ccffe9aacdbb29602dac20aa38 100644 GIT binary patch literal 103 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 nAkZ&VI@B<