ESP IDF fixes (#927)
Various fixes and beautifications coordinated with @1c3t3a, fixes 2 of the 3 all remaining issues from #892: - enable to os_mmap executable memory - fix os_malloc/os_realloc/os_free issues - implement os_thread_get_stack_boundary - add build scripts to include with esp-idf to use wamr as an ESP-IDF component - update sample and document
This commit is contained in:
committed by
GitHub
parent
2c3f284b85
commit
78414b627c
154
product-mini/platforms/esp-idf/main/main.c
Normal file
154
product-mini/platforms/esp-idf/main/main.c
Normal file
@ -0,0 +1,154 @@
|
||||
/*
|
||||
* Copyright (C) 2019-21 Intel Corporation and others. All rights reserved.
|
||||
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
#include "wasm_export.h"
|
||||
#include "bh_platform.h"
|
||||
#include "test_wasm.h"
|
||||
|
||||
#include "esp_log.h"
|
||||
|
||||
#define LOG_TAG "wamr"
|
||||
|
||||
static void *
|
||||
app_instance_main(wasm_module_inst_t module_inst)
|
||||
{
|
||||
const char *exception;
|
||||
|
||||
wasm_application_execute_main(module_inst, 0, NULL);
|
||||
if ((exception = wasm_runtime_get_exception(module_inst)))
|
||||
printf("%s\n", exception);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void *
|
||||
iwasm_main(void *arg)
|
||||
{
|
||||
(void)arg; /* unused */
|
||||
/* setup variables for instantiating and running the wasm module */
|
||||
uint8_t *wasm_file_buf = NULL;
|
||||
unsigned wasm_file_buf_size = 0;
|
||||
wasm_module_t wasm_module = NULL;
|
||||
wasm_module_inst_t wasm_module_inst = NULL;
|
||||
char error_buf[128];
|
||||
void *ret;
|
||||
RuntimeInitArgs init_args;
|
||||
|
||||
/* configure memory allocation */
|
||||
memset(&init_args, 0, sizeof(RuntimeInitArgs));
|
||||
init_args.mem_alloc_type = Alloc_With_Allocator;
|
||||
init_args.mem_alloc_option.allocator.malloc_func = (void *)os_malloc;
|
||||
init_args.mem_alloc_option.allocator.realloc_func = (void *)os_realloc;
|
||||
init_args.mem_alloc_option.allocator.free_func = (void *)os_free;
|
||||
|
||||
ESP_LOGI(LOG_TAG, "Initialize WASM runtime");
|
||||
/* initialize runtime environment */
|
||||
if (!wasm_runtime_full_init(&init_args)) {
|
||||
ESP_LOGE(LOG_TAG, "Init runtime failed.");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#if WASM_ENABLE_INTERP != 0
|
||||
ESP_LOGI(LOG_TAG, "Run wamr with interpreter");
|
||||
|
||||
wasm_file_buf = (uint8_t *)wasm_test_file_interp;
|
||||
wasm_file_buf_size = sizeof(wasm_test_file_interp);
|
||||
|
||||
/* load WASM module */
|
||||
if (!(wasm_module = wasm_runtime_load(wasm_file_buf, wasm_file_buf_size,
|
||||
error_buf, sizeof(error_buf)))) {
|
||||
ESP_LOGE(LOG_TAG, "Error in wasm_runtime_load: %s", error_buf);
|
||||
goto fail1interp;
|
||||
}
|
||||
|
||||
ESP_LOGI(LOG_TAG, "Instantiate WASM runtime");
|
||||
if (!(wasm_module_inst =
|
||||
wasm_runtime_instantiate(wasm_module, 32 * 1024, // stack size
|
||||
32 * 1024, // heap size
|
||||
error_buf, sizeof(error_buf)))) {
|
||||
ESP_LOGE(LOG_TAG, "Error while instantiating: %s", error_buf);
|
||||
goto fail2interp;
|
||||
}
|
||||
|
||||
ESP_LOGI(LOG_TAG, "run main() of the application");
|
||||
ret = app_instance_main(wasm_module_inst);
|
||||
assert(!ret);
|
||||
|
||||
/* destroy the module instance */
|
||||
ESP_LOGI(LOG_TAG, "Deinstantiate WASM runtime");
|
||||
wasm_runtime_deinstantiate(wasm_module_inst);
|
||||
|
||||
fail2interp:
|
||||
/* unload the module */
|
||||
ESP_LOGI(LOG_TAG, "Unload WASM module");
|
||||
wasm_runtime_unload(wasm_module);
|
||||
|
||||
fail1interp:
|
||||
#endif
|
||||
#if WASM_ENABLE_AOT != 0
|
||||
ESP_LOGI(LOG_TAG, "Run wamr with AoT");
|
||||
|
||||
wasm_file_buf = (uint8_t *)wasm_test_file_aot;
|
||||
wasm_file_buf_size = sizeof(wasm_test_file_aot);
|
||||
|
||||
/* load WASM module */
|
||||
if (!(wasm_module = wasm_runtime_load(wasm_file_buf, wasm_file_buf_size,
|
||||
error_buf, sizeof(error_buf)))) {
|
||||
ESP_LOGE(LOG_TAG, "Error in wasm_runtime_load: %s", error_buf);
|
||||
goto fail1aot;
|
||||
}
|
||||
|
||||
ESP_LOGI(LOG_TAG, "Instantiate WASM runtime");
|
||||
if (!(wasm_module_inst =
|
||||
wasm_runtime_instantiate(wasm_module, 32 * 1024, // stack size
|
||||
32 * 1024, // heap size
|
||||
error_buf, sizeof(error_buf)))) {
|
||||
ESP_LOGE(LOG_TAG, "Error while instantiating: %s", error_buf);
|
||||
goto fail2aot;
|
||||
}
|
||||
|
||||
ESP_LOGI(LOG_TAG, "run main() of the application");
|
||||
ret = app_instance_main(wasm_module_inst);
|
||||
assert(!ret);
|
||||
|
||||
/* destroy the module instance */
|
||||
ESP_LOGI(LOG_TAG, "Deinstantiate WASM runtime");
|
||||
wasm_runtime_deinstantiate(wasm_module_inst);
|
||||
|
||||
fail2aot:
|
||||
/* unload the module */
|
||||
ESP_LOGI(LOG_TAG, "Unload WASM module");
|
||||
wasm_runtime_unload(wasm_module);
|
||||
fail1aot:
|
||||
#endif
|
||||
|
||||
/* destroy runtime environment */
|
||||
ESP_LOGI(LOG_TAG, "Destroy WASM runtime");
|
||||
wasm_runtime_destroy();
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
app_main(void)
|
||||
{
|
||||
pthread_t t;
|
||||
int res;
|
||||
|
||||
pthread_attr_t tattr;
|
||||
pthread_attr_init(&tattr);
|
||||
pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_JOINABLE);
|
||||
pthread_attr_setstacksize(&tattr, 4096);
|
||||
|
||||
res = pthread_create(&t, &tattr, iwasm_main, (void *)NULL);
|
||||
assert(res == 0);
|
||||
|
||||
res = pthread_join(t, NULL);
|
||||
assert(res == 0);
|
||||
|
||||
ESP_LOGI(LOG_TAG, "Exiting...");
|
||||
}
|
||||
Reference in New Issue
Block a user