mirror of
				https://github.com/bytecodealliance/wasm-micro-runtime.git
				synced 2025-10-31 13:17:31 +00:00 
			
		
		
		
	Port WAMR to ESP-IDF (#892)
This PR introduces an implementation of the WAMR platform APIs for ESP-IDF and enables support for Espressif microcontrollers, and adds the documentation around how to build WAMR for ESP-IDF. This PR is related to the following issues at WAMR: closes #883, #628, #449 and #668 as well as [#4735](https://github.com/espressif/esp-idf/issues/4735) at the esp-idf repo. It implements most functions required by [platform_api_vmcore.h](https://github.com/bytecodealliance/wasm-micro-runtime/blob/main/core/shared/platform/include/platform_api_vmcore.h). The PR works in interpreter mode on Esp32c3 and Esp32. For the AOT mode, currently errors occur on both platforms with `Guru Meditation Error`. It seems that the AOT code isn't run with shared memory as os_mmap() allocates memory with malloc() API, it is to be fixed in the future.
This commit is contained in:
		
							parent
							
								
									5be427bfa2
								
							
						
					
					
						commit
						a9f1c2b64a
					
				
							
								
								
									
										72
									
								
								core/shared/platform/esp-idf/espidf_malloc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								core/shared/platform/esp-idf/espidf_malloc.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,72 @@ | |||
| /*
 | ||||
|  * Copyright (C) 2019 Intel Corporation.  All rights reserved. | ||||
|  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||||
|  */ | ||||
| 
 | ||||
| #include "platform_api_vmcore.h" | ||||
| #include "platform_api_extension.h" | ||||
| 
 | ||||
| void * | ||||
| os_malloc(unsigned size) | ||||
| { | ||||
|     void *buf_origin; | ||||
|     void *buf_fixed; | ||||
|     uintptr_t *addr_field; | ||||
| 
 | ||||
|     buf_origin = malloc(size + 8 + sizeof(uintptr_t)); | ||||
|     buf_fixed = buf_origin + sizeof(void *); | ||||
|     if ((uintptr_t)buf_fixed & (uintptr_t)0x7) { | ||||
|         buf_fixed = (void *)((uintptr_t)(buf_fixed + 8) & (~(uintptr_t)7)); | ||||
|     } | ||||
| 
 | ||||
|     addr_field = buf_fixed - sizeof(uintptr_t); | ||||
|     *addr_field = (uintptr_t)buf_origin; | ||||
| 
 | ||||
|     return buf_fixed; | ||||
| } | ||||
| 
 | ||||
| void * | ||||
| os_realloc(void *ptr, unsigned size) | ||||
| { | ||||
|     void *mem_origin; | ||||
|     void *mem_new; | ||||
|     void *mem_new_fixed; | ||||
|     uintptr_t *addr_field; | ||||
| 
 | ||||
|     if (!ptr) { | ||||
|         return NULL; | ||||
|     } | ||||
| 
 | ||||
|     addr_field = ptr - sizeof(uintptr_t); | ||||
|     mem_origin = (void *)(*addr_field); | ||||
|     mem_new = realloc(mem_origin, size + 8 + sizeof(uintptr_t)); | ||||
| 
 | ||||
|     if (mem_origin != mem_new) { | ||||
|         mem_new_fixed = mem_new + sizeof(uintptr_t); | ||||
|         if ((uint32)mem_new_fixed & 0x7) { | ||||
|             mem_new_fixed = | ||||
|                 (void *)((uintptr_t)(mem_new + 8) & (~(uintptr_t)7)); | ||||
|         } | ||||
| 
 | ||||
|         addr_field = mem_new_fixed - sizeof(uintptr_t); | ||||
|         *addr_field = (uintptr_t)mem_new; | ||||
| 
 | ||||
|         return mem_new_fixed; | ||||
|     } | ||||
| 
 | ||||
|     return ptr; | ||||
| } | ||||
| 
 | ||||
| void | ||||
| os_free(void *ptr) | ||||
| { | ||||
|     void *mem_origin; | ||||
|     uintptr *addr_field; | ||||
| 
 | ||||
|     if (ptr) { | ||||
|         addr_field = ptr - sizeof(uintptr_t); | ||||
|         mem_origin = (void *)(*addr_field); | ||||
| 
 | ||||
|         free(mem_origin); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										29
									
								
								core/shared/platform/esp-idf/espidf_memmap.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								core/shared/platform/esp-idf/espidf_memmap.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,29 @@ | |||
| /*
 | ||||
|  * Copyright (C) 2019 Intel Corporation.  All rights reserved. | ||||
|  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||||
|  */ | ||||
| 
 | ||||
| #include "platform_api_vmcore.h" | ||||
| #include "platform_api_extension.h" | ||||
| 
 | ||||
| void * | ||||
| os_mmap(void *hint, size_t size, int prot, int flags) | ||||
| { | ||||
|     return os_malloc((int)size); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| os_munmap(void *addr, size_t size) | ||||
| { | ||||
|     return os_free(addr); | ||||
| } | ||||
| 
 | ||||
| int | ||||
| os_mprotect(void *addr, size_t size, int prot) | ||||
| { | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| void | ||||
| os_dcache_flush() | ||||
| {} | ||||
|  | @ -6,25 +6,15 @@ | |||
| #include "platform_api_vmcore.h" | ||||
| #include "platform_api_extension.h" | ||||
| 
 | ||||
| int errno = 0; | ||||
| 
 | ||||
| int | ||||
| os_thread_sys_init(); | ||||
| 
 | ||||
| void | ||||
| os_thread_sys_destroy(); | ||||
| 
 | ||||
| int | ||||
| bh_platform_init() | ||||
| { | ||||
|     return os_thread_sys_init(); | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| void | ||||
| bh_platform_destroy() | ||||
| { | ||||
|     os_thread_sys_destroy(); | ||||
| } | ||||
| {} | ||||
| 
 | ||||
| int | ||||
| os_printf(const char *format, ...) | ||||
|  | @ -45,76 +35,20 @@ os_vprintf(const char *format, va_list ap) | |||
|     return vprintf(format, ap); | ||||
| } | ||||
| 
 | ||||
| void * | ||||
| os_mmap(void *hint, size_t size, int prot, int flags) | ||||
| uint64 | ||||
| os_time_get_boot_microsecond(void) | ||||
| { | ||||
| 
 | ||||
|     return BH_MALLOC(size); | ||||
|     return (uint64)esp_timer_get_time(); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| os_munmap(void *addr, size_t size) | ||||
| uint8 * | ||||
| os_thread_get_stack_boundary(void) | ||||
| { | ||||
|     BH_FREE(addr); | ||||
|     return NULL; | ||||
| } | ||||
| 
 | ||||
| int | ||||
| os_mprotect(void *addr, size_t size, int prot) | ||||
| os_usleep(uint32 usec) | ||||
| { | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| void | ||||
| os_dcache_flush() | ||||
| {} | ||||
| 
 | ||||
| int | ||||
| atoi(const char *nptr) | ||||
| { | ||||
|     bool is_negative = false; | ||||
|     int total = 0; | ||||
|     const char *p = nptr; | ||||
|     char temp = '0'; | ||||
| 
 | ||||
|     if (NULL == p) { | ||||
|         os_printf("invlaid atoi input\n"); | ||||
|         return 0; | ||||
|     } | ||||
| 
 | ||||
|     if (*p == '-') { | ||||
|         is_negative = true; | ||||
|         p++; | ||||
|     } | ||||
| 
 | ||||
|     while ((temp = *p++) != '\0') { | ||||
|         if (temp > '9' || temp < '0') { | ||||
|             continue; | ||||
|         } | ||||
| 
 | ||||
|         total = total * 10 + (int)(temp - '0'); | ||||
|     } | ||||
| 
 | ||||
|     if (is_negative) | ||||
|         total = 0 - total; | ||||
| 
 | ||||
|     return total; | ||||
| } | ||||
| 
 | ||||
| void * | ||||
| memmove(void *dest, const void *src, size_t n) | ||||
| { | ||||
|     char *d = dest; | ||||
|     const char *s = src; | ||||
| 
 | ||||
|     if (d < s) { | ||||
|         while (n--) | ||||
|             *d++ = *s++; | ||||
|     } | ||||
|     else { | ||||
|         const char *lasts = s + (n - 1); | ||||
|         char *lastd = d + (n - 1); | ||||
|         while (n--) | ||||
|             *lastd-- = *lasts--; | ||||
|     } | ||||
|     return dest; | ||||
|     return usleep(usec); | ||||
| } | ||||
|  |  | |||
|  | @ -3,12 +3,204 @@ | |||
|  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _GNU_SOURCE | ||||
| #define _GNU_SOURCE | ||||
| #endif | ||||
| 
 | ||||
| #include "platform_api_vmcore.h" | ||||
| #include "platform_api_extension.h" | ||||
| 
 | ||||
| uint8 * | ||||
| os_thread_get_stack_boundary() | ||||
| typedef struct { | ||||
|     thread_start_routine_t start; | ||||
|     void *arg; | ||||
| } thread_wrapper_arg; | ||||
| 
 | ||||
| static void * | ||||
| os_thread_wrapper(void *arg) | ||||
| { | ||||
|     /* TODO: implement os_thread_get_stack_boundary */ | ||||
|     thread_wrapper_arg *targ = arg; | ||||
|     thread_start_routine_t start_func = targ->start; | ||||
|     void *thread_arg = targ->arg; | ||||
| 
 | ||||
|     os_printf("THREAD CREATED %jx\n", (uintmax_t)(uintptr_t)pthread_self()); | ||||
|     BH_FREE(targ); | ||||
|     start_func(thread_arg); | ||||
|     return NULL; | ||||
| } | ||||
| 
 | ||||
| korp_tid | ||||
| os_self_thread(void) | ||||
| { | ||||
|     /* only allowed if this is a thread, xTaskCreate is not enough look at
 | ||||
|      * product_mini for how to use this*/ | ||||
|     return pthread_self(); | ||||
| } | ||||
| 
 | ||||
| int | ||||
| os_mutex_init(korp_mutex *mutex) | ||||
| { | ||||
|     return pthread_mutex_init(mutex, NULL); | ||||
| } | ||||
| 
 | ||||
| int | ||||
| os_mutex_destroy(korp_mutex *mutex) | ||||
| { | ||||
|     return pthread_mutex_destroy(mutex); | ||||
| } | ||||
| 
 | ||||
| int | ||||
| os_mutex_lock(korp_mutex *mutex) | ||||
| { | ||||
|     return pthread_mutex_lock(mutex); | ||||
| } | ||||
| 
 | ||||
| int | ||||
| os_mutex_unlock(korp_mutex *mutex) | ||||
| { | ||||
|     return pthread_mutex_unlock(mutex); | ||||
| } | ||||
| 
 | ||||
| int | ||||
| os_thread_create_with_prio(korp_tid *tid, thread_start_routine_t start, | ||||
|                            void *arg, unsigned int stack_size, int prio) | ||||
| { | ||||
|     pthread_attr_t tattr; | ||||
|     thread_wrapper_arg *targ; | ||||
| 
 | ||||
|     assert(stack_size > 0); | ||||
|     assert(tid); | ||||
|     assert(start); | ||||
| 
 | ||||
|     pthread_attr_init(&tattr); | ||||
|     pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_JOINABLE); | ||||
|     if (pthread_attr_setstacksize(&tattr, stack_size) != 0) { | ||||
|         os_printf("Invalid thread stack size %u. Min stack size = %u", | ||||
|                   stack_size, PTHREAD_STACK_MIN); | ||||
|         pthread_attr_destroy(&tattr); | ||||
|         return BHT_ERROR; | ||||
|     } | ||||
| 
 | ||||
|     targ = (thread_wrapper_arg *)BH_MALLOC(sizeof(*targ)); | ||||
|     if (!targ) { | ||||
|         pthread_attr_destroy(&tattr); | ||||
|         return BHT_ERROR; | ||||
|     } | ||||
| 
 | ||||
|     targ->start = start; | ||||
|     targ->arg = arg; | ||||
| 
 | ||||
|     if (pthread_create(tid, &tattr, os_thread_wrapper, targ) != 0) { | ||||
|         pthread_attr_destroy(&tattr); | ||||
|         os_free(targ); | ||||
|         return BHT_ERROR; | ||||
|     } | ||||
| 
 | ||||
|     pthread_attr_destroy(&tattr); | ||||
|     return BHT_OK; | ||||
| } | ||||
| 
 | ||||
| int | ||||
| os_thread_create(korp_tid *tid, thread_start_routine_t start, void *arg, | ||||
|                  unsigned int stack_size) | ||||
| { | ||||
|     return os_thread_create_with_prio(tid, start, arg, stack_size, | ||||
|                                       BH_THREAD_DEFAULT_PRIORITY); | ||||
| } | ||||
| 
 | ||||
| int | ||||
| os_thread_join(korp_tid thread, void **retval) | ||||
| { | ||||
|     return pthread_join(thread, retval); | ||||
| } | ||||
| 
 | ||||
| int | ||||
| os_thread_detach(korp_tid tid) | ||||
| { | ||||
|     return pthread_detach(tid); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| os_thread_exit(void *retval) | ||||
| { | ||||
|     pthread_exit(retval); | ||||
| } | ||||
| 
 | ||||
| int | ||||
| os_cond_init(korp_cond *cond) | ||||
| { | ||||
|     return pthread_cond_init(cond, NULL); | ||||
| } | ||||
| 
 | ||||
| int | ||||
| os_cond_destroy(korp_cond *cond) | ||||
| { | ||||
|     return pthread_cond_destroy(cond); | ||||
| } | ||||
| 
 | ||||
| int | ||||
| os_cond_wait(korp_cond *cond, korp_mutex *mutex) | ||||
| { | ||||
|     return pthread_cond_wait(cond, mutex); | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| msec_nsec_to_abstime(struct timespec *ts, uint64 usec) | ||||
| { | ||||
|     struct timeval tv; | ||||
|     time_t tv_sec_new; | ||||
|     long int tv_nsec_new; | ||||
| 
 | ||||
|     gettimeofday(&tv, NULL); | ||||
| 
 | ||||
|     tv_sec_new = (time_t)(tv.tv_sec + usec / 1000000); | ||||
|     if (tv_sec_new >= tv.tv_sec) { | ||||
|         ts->tv_sec = tv_sec_new; | ||||
|     } | ||||
|     else { | ||||
|         /* integer overflow */ | ||||
|         ts->tv_sec = BH_TIME_T_MAX; | ||||
|         os_printf("Warning: os_cond_reltimedwait exceeds limit, " | ||||
|                   "set to max timeout instead\n"); | ||||
|     } | ||||
| 
 | ||||
|     tv_nsec_new = (long int)(tv.tv_usec * 1000 + (usec % 1000000) * 1000); | ||||
|     if (tv.tv_usec * 1000 >= tv.tv_usec && tv_nsec_new >= tv.tv_usec * 1000) { | ||||
|         ts->tv_nsec = tv_nsec_new; | ||||
|     } | ||||
|     else { | ||||
|         /* integer overflow */ | ||||
|         ts->tv_nsec = LONG_MAX; | ||||
|         os_printf("Warning: os_cond_reltimedwait exceeds limit, " | ||||
|                   "set to max timeout instead\n"); | ||||
|     } | ||||
| 
 | ||||
|     if (ts->tv_nsec >= 1000000000L && ts->tv_sec < BH_TIME_T_MAX) { | ||||
|         ts->tv_sec++; | ||||
|         ts->tv_nsec -= 1000000000L; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| int | ||||
| os_cond_reltimedwait(korp_cond *cond, korp_mutex *mutex, uint64 useconds) | ||||
| { | ||||
|     int ret; | ||||
|     struct timespec abstime; | ||||
| 
 | ||||
|     if (useconds == BHT_WAIT_FOREVER) | ||||
|         ret = pthread_cond_wait(cond, mutex); | ||||
|     else { | ||||
|         msec_nsec_to_abstime(&abstime, useconds); | ||||
|         ret = pthread_cond_timedwait(cond, mutex, &abstime); | ||||
|     } | ||||
| 
 | ||||
|     if (ret != BHT_OK && ret != ETIMEDOUT) | ||||
|         return BHT_ERROR; | ||||
| 
 | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| int | ||||
| os_cond_signal(korp_cond *cond) | ||||
| { | ||||
|     return pthread_cond_signal(cond); | ||||
| } | ||||
|  |  | |||
|  | @ -14,88 +14,35 @@ | |||
| #include <stdlib.h> | ||||
| #include <ctype.h> | ||||
| #include <errno.h> | ||||
| #include <math.h> | ||||
| #include <unistd.h> | ||||
| #include <pthread.h> | ||||
| 
 | ||||
| #include <FreeRTOS.h> | ||||
| #include <semphr.h> | ||||
| #include <task.h> | ||||
| #include <os_api.h> | ||||
| #include "esp_pthread.h" | ||||
| #include "esp_timer.h" | ||||
| #include "freertos/FreeRTOS.h" | ||||
| #include "freertos/task.h" | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| #ifndef BH_PLATFORM_ESP_IDF | ||||
| #define BH_PLATFORM_ESP_IDF | ||||
| #endif | ||||
| 
 | ||||
| typedef pthread_t korp_tid; | ||||
| typedef pthread_mutex_t korp_mutex; | ||||
| typedef pthread_cond_t korp_cond; | ||||
| typedef pthread_t korp_thread; | ||||
| 
 | ||||
| #define BH_APPLET_PRESERVED_STACK_SIZE (2 * BH_KB) | ||||
| 
 | ||||
| /* Default thread priority */ | ||||
| #define BH_THREAD_DEFAULT_PRIORITY 5 | ||||
| 
 | ||||
| extern int errno; | ||||
| 
 | ||||
| typedef TaskHandle_t korp_thread; | ||||
| typedef korp_thread korp_tid; | ||||
| typedef struct { | ||||
|     bool is_recursive; | ||||
|     SemaphoreHandle_t sem; | ||||
| } korp_mutex; | ||||
| 
 | ||||
| struct os_thread_wait_node; | ||||
| typedef struct os_thread_wait_node *os_thread_wait_list; | ||||
| typedef struct korp_cond { | ||||
|     SemaphoreHandle_t wait_list_lock; | ||||
|     os_thread_wait_list thread_wait_list; | ||||
| } korp_cond; | ||||
| 
 | ||||
| int | ||||
| os_printf(const char *format, ...); | ||||
| int | ||||
| os_vprintf(const char *format, va_list ap); | ||||
| 
 | ||||
| /* clang-format off */ | ||||
| /* math functions which are not provided by os */ | ||||
| double sqrt(double x); | ||||
| double floor(double x); | ||||
| double ceil(double x); | ||||
| double fmin(double x, double y); | ||||
| double fmax(double x, double y); | ||||
| double rint(double x); | ||||
| double fabs(double x); | ||||
| double trunc(double x); | ||||
| float floorf(float x); | ||||
| float ceilf(float x); | ||||
| float fminf(float x, float y); | ||||
| float fmaxf(float x, float y); | ||||
| float rintf(float x); | ||||
| float truncf(float x); | ||||
| int signbit(double x); | ||||
| int isnan(double x); | ||||
| 
 | ||||
| int atoi(const char *s); | ||||
| int strncasecmp(const char *s1, const char *s2, size_t n); | ||||
| long int strtol(const char *str, char **endptr, int base); | ||||
| unsigned long int strtoul(const char *str, char **endptr, int base); | ||||
| unsigned long long int strtoull(const char *nptr, char **endptr, int base); | ||||
| double strtod(const char *nptr, char **endptr); | ||||
| float strtof(const char *nptr, char **endptr); | ||||
| char *strstr(const char *haystack, const char *needle); | ||||
| size_t strspn(const char *s, const char *accept); | ||||
| size_t strcspn(const char *s, const char *reject); | ||||
| void *memchr(const void *s, int c, size_t n); | ||||
| int isalnum(int c); | ||||
| int isxdigit(int c); | ||||
| int isdigit(int c); | ||||
| int isprint(int c); | ||||
| int isgraph(int c); | ||||
| int isspace(int c); | ||||
| int isalpha(int c); | ||||
| int isupper(int c); | ||||
| int toupper(int c); | ||||
| int tolower(int c); | ||||
| void *memmove(void *dest, const void *src, size_t n); | ||||
| 
 | ||||
| uint32_t htonl(uint32_t hostlong); | ||||
| uint16_t htons(uint16_t hostshort); | ||||
| uint32_t ntohl(uint32_t netlong); | ||||
| uint16_t ntohs(uint16_t netshort); | ||||
| /* clang-format on */ | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
|  | @ -8,12 +8,6 @@ add_definitions(-DBH_PLATFORM_ESP_IDF) | |||
| include_directories(${PLATFORM_SHARED_DIR}) | ||||
| include_directories(${PLATFORM_SHARED_DIR}/../include) | ||||
| 
 | ||||
| include (${CMAKE_CURRENT_LIST_DIR}/../common/freertos/platform_api_freertos.cmake) | ||||
| include (${CMAKE_CURRENT_LIST_DIR}/../common/math/platform_api_math.cmake) | ||||
| 
 | ||||
| file (GLOB_RECURSE source_all ${PLATFORM_SHARED_DIR}/*.c) | ||||
| 
 | ||||
| set (PLATFORM_SHARED_SOURCE ${source_all} | ||||
|                             ${PLATFORM_COMMON_MATH_SOURCE} | ||||
|                             ${PLATFORM_COMMON_FREERTOS_SOURCE}) | ||||
| 
 | ||||
| set (PLATFORM_SHARED_SOURCE ${source_all} ${PLATFORM_COMMON_MATH_SOURCE}) | ||||
|  |  | |||
|  | @ -31,7 +31,7 @@ extern "C" { | |||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * Ceates a thread | ||||
|  * Creates a thread | ||||
|  * | ||||
|  * @param p_tid  [OUTPUT] the pointer of tid | ||||
|  * @param start  main routine of the thread | ||||
|  |  | |||
|  | @ -176,6 +176,9 @@ cmake .. -DCMAKE_TOOLCHAIN_FILE=$TOOL_CHAIN_FILE  \ | |||
| 
 | ||||
| Refer to toolchain sample file [`samples/simple/profiles/arm-interp/toolchain.cmake`](../samples/simple/profiles/arm-interp/toolchain.cmake) for how to build mini product for ARM target architecture. | ||||
| 
 | ||||
| If you compile for ESP-IDF, make sure to set the right toolchain file for the chip you're using (e.g. `$IDF_PATH/tools/cmake/toolchain-esp32c3.cmake`). | ||||
| Note that all ESP-IDF toolchain files live under `$IDF_PATH/tools/cmake/`. | ||||
| 
 | ||||
| Linux | ||||
| ------------------------- | ||||
| First of all please install the dependent packages. | ||||
|  | @ -457,6 +460,18 @@ NuttX | |||
| ------------------------- | ||||
| WAMR is intergrated with NuttX, just enable the WAMR in Kconfig option (Application Configuration/Interpreters). | ||||
| 
 | ||||
| ESP-IDF | ||||
| ------------------------- | ||||
| WAMR integrates with ESP-IDF both for the XTENSA and RISC-V chips (esp32x and esp32c3 respectively).  | ||||
| 
 | ||||
| In order to use this, you need at least version 4.3.1 of ESP-IDF. | ||||
| If you don't have it installed, follow the instructions [here](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/#get-started-get-prerequisites). | ||||
| ESP-IDF also installs the toolchains needed for compiling WAMR and ESP-IDF. | ||||
| A small demonstration of how to use WAMR and ESP-IDF can be found under [product_mini](/product-mini/platforms/esp-idf). | ||||
| The demo builds WAMR for ESP-IDF and runs a small wasm program.  | ||||
| In order to run it for your specific Espressif chip, edit the ['build.sh'](/product-mini/platforms/esp-idf/build.sh) file and put the correct toolchain file (see #Cross-compilation) and `IDF_TARGET`. | ||||
| Before compiling it is also necessary to call ESP-IDF's `export.sh` script to bring all compile time relevant information in scope. | ||||
| 
 | ||||
| Docker | ||||
| ------------------------- | ||||
| [Docker](https://www.docker.com/) will download all the dependencies and build WAMR Core on your behalf. | ||||
|  |  | |||
|  | @ -3,53 +3,75 @@ | |||
| 
 | ||||
| # from ESP-IDF 4.0 examples/build_system/cmake/idf_as_lib | ||||
| cmake_minimum_required(VERSION 3.5) | ||||
| project(wamr_on_esp32c3) | ||||
| 
 | ||||
| project(wamr_esp_idf C) | ||||
| enable_language(ASM) | ||||
| 
 | ||||
| enable_language (ASM) | ||||
| if (NOT CMAKE_BUILD_TYPE) | ||||
|   set(CMAKE_BUILD_TYPE Release) | ||||
| endif () | ||||
| 
 | ||||
| if("${IDF_TARGET}" STREQUAL "") | ||||
|     message(FATAL_ERROR "You need to set IDF_TARGET to your target string") | ||||
| endif() | ||||
| 
 | ||||
| # Include for ESP-IDF build system functions | ||||
| include($ENV{IDF_PATH}/tools/cmake/idf.cmake) | ||||
| # Create idf::esp32c3 and idf::freertos static libraries | ||||
| idf_build_process(${IDF_TARGET} | ||||
|                 # try and trim the build; additional components | ||||
|                 # will be included as needed based on dependency tree | ||||
|                 # | ||||
|                 # although esptool_py does not generate static library, | ||||
|                 # processing the component is needed for flashing related | ||||
|                 # targets and file generation | ||||
|                 COMPONENTS ${IDF_TARGET} freertos esptool_py | ||||
|                 SDKCONFIG ${CMAKE_BINARY_DIR}/sdkconfig | ||||
|                 BUILD_DIR ${CMAKE_BINARY_DIR}) | ||||
| 
 | ||||
| # Create idf::esp32 and idf::freertos static libraries | ||||
| idf_build_process(esp32 | ||||
|                   # try and trim the build; additional components | ||||
|                   # will be included as needed based on dependency tree | ||||
|                   # | ||||
|                   # although esptool_py does not generate static library, | ||||
|                   # processing the component is needed for flashing related | ||||
|                   # targets and file generation | ||||
|                   COMPONENTS esp32 freertos esptool_py | ||||
|                   SDKCONFIG ${CMAKE_BINARY_DIR}/sdkconfig | ||||
|                   BUILD_DIR ${CMAKE_BINARY_DIR}) | ||||
| 
 | ||||
| include_directories(build/config | ||||
|                     xtensa/include | ||||
|                     $ENV{IDF_PATH}/components/esp32/include | ||||
|                     $ENV{IDF_PATH}/components/esp_common/include | ||||
|                     $ENV{IDF_PATH}/components/esp_rom/include | ||||
|                     $ENV{IDF_PATH}/components/freertos/include | ||||
|                     $ENV{IDF_PATH}/components/heap/include | ||||
|                     $ENV{IDF_PATH}/components/soc/esp32/include | ||||
|                     $ENV{IDF_PATH}/components/xtensa/include | ||||
|                     $ENV{IDF_PATH}/components/xtensa/esp32/include) | ||||
| # Set WAMR's build options | ||||
| if("${IDF_TARGET}" STREQUAL "esp32c3") | ||||
|     set(WAMR_BUILD_TARGET "RISCV32") | ||||
| else() | ||||
|     set(WAMR_BUILD_TARGET "XTENSA") | ||||
|     add_compile_options(-DWAMR_BUILD_TARGET_XTENSA=1) | ||||
| endif() | ||||
| 
 | ||||
| set(WAMR_BUILD_PLATFORM "esp-idf") | ||||
| set(WAMR_BUILD_TARGET "XTENSA") | ||||
| set(WAMR_BUILD_INTERP 1) | ||||
| set(WAMR_BUILD_FAST_INTERP 1) | ||||
| set(WAMR_BUILD_AOT 1) | ||||
| set(WAMR_BUILD_LIBC_BUILTIN 1) | ||||
| set(WAMR_BUILD_LIBC_WASI 0) | ||||
| 
 | ||||
| if (NOT DEFINED WAMR_BUILD_INTERP) | ||||
|   set (WAMR_BUILD_INTERP 0) | ||||
| endif () | ||||
| 
 | ||||
| if (NOT DEFINED WAMR_BUILD_FAST_INTERP) | ||||
|   set (WAMR_BUILD_FAST_INTERP 0) | ||||
| endif () | ||||
| 
 | ||||
| if (NOT DEFINED WAMR_BUILD_AOT) | ||||
|   set (WAMR_BUILD_AOT 1) | ||||
| endif () | ||||
| 
 | ||||
| if (NOT DEFINED WAMR_BUILD_LIBC_BUILTIN) | ||||
|   set (WAMR_BUILD_LIBC_BUILTIN 1) | ||||
| endif () | ||||
| 
 | ||||
| if (NOT DEFINED WAMR_BUILD_APP_FRAMEWORK) | ||||
|   set (WAMR_BUILD_APP_FRAMEWORK 0) | ||||
| endif () | ||||
| 
 | ||||
| 
 | ||||
| # Set the compile time variable so that the right binary is selected | ||||
| add_compile_options(-DWAMR_BUILD_INTERP=${WAMR_BUILD_INTERP}) | ||||
| 
 | ||||
| set(WAMR_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../..) | ||||
| 
 | ||||
| include(${WAMR_ROOT_DIR}/build-scripts/runtime_lib.cmake) | ||||
| 
 | ||||
| # define WAMR as library and provide it the esp-idf srcs | ||||
| add_library(vmlib ${WAMR_RUNTIME_LIB_SOURCE}) | ||||
| target_link_libraries(vmlib PUBLIC idf::pthread idf::${IDF_TARGET} idf::freertos) | ||||
| 
 | ||||
| # Define the final executable | ||||
| set(elf_file ${CMAKE_PROJECT_NAME}.elf) | ||||
| add_executable(${elf_file} main.c iwasm_main.c) | ||||
| 
 | ||||
| # Link the static libraries to the executable | ||||
| target_link_libraries(${elf_file} idf::esp32 idf::freertos idf::spi_flash vmlib) | ||||
| 
 | ||||
| add_executable(${elf_file} main.c test_wasm.h) | ||||
| target_link_libraries(${elf_file} idf::${IDF_TARGET} idf::freertos idf::spi_flash vmlib) | ||||
| idf_build_executable(${elf_file}) | ||||
|  |  | |||
							
								
								
									
										4
									
								
								product-mini/platforms/esp-idf/build.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										4
									
								
								product-mini/platforms/esp-idf/build.sh
									
									
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,4 @@ | |||
| rm -rf build && mkdir build && cd build | ||||
| cmake .. -DCMAKE_TOOLCHAIN_FILE=$IDF_PATH/tools/cmake/toolchain-esp32c3.cmake -DIDF_TARGET=esp32c3 -DCMAKE_BUILD_TYPE=Release -GNinja | ||||
| cmake --build . | ||||
| ninja flash | ||||
|  | @ -1,105 +0,0 @@ | |||
| /*
 | ||||
|  * Copyright (C) 2019 Intel Corporation.  All rights reserved. | ||||
|  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||||
|  */ | ||||
| 
 | ||||
| #include "bh_platform.h" | ||||
| #include "wasm_export.h" | ||||
| #include "test_wasm.h" | ||||
| 
 | ||||
| #define CONFIG_GLOBAL_HEAP_BUF_SIZE 131072 | ||||
| #define CONFIG_APP_STACK_SIZE 8192 | ||||
| #define CONFIG_APP_HEAP_SIZE 8192 | ||||
| 
 | ||||
| static int app_argc; | ||||
| static char **app_argv; | ||||
| 
 | ||||
| static void * | ||||
| app_instance_main(wasm_module_inst_t module_inst) | ||||
| { | ||||
|     const char *exception; | ||||
| 
 | ||||
|     wasm_application_execute_main(module_inst, app_argc, app_argv); | ||||
|     if ((exception = wasm_runtime_get_exception(module_inst))) | ||||
|         os_printf("%s\n", exception); | ||||
|     return NULL; | ||||
| } | ||||
| 
 | ||||
| static char global_heap_buf[CONFIG_GLOBAL_HEAP_BUF_SIZE] = { 0 }; | ||||
| 
 | ||||
| void | ||||
| iwasm_main(void) | ||||
| { | ||||
|     uint8 *wasm_file_buf = NULL; | ||||
|     uint32 wasm_file_size; | ||||
|     wasm_module_t wasm_module = NULL; | ||||
|     wasm_module_inst_t wasm_module_inst = NULL; | ||||
|     RuntimeInitArgs init_args; | ||||
|     char error_buf[128]; | ||||
| #if WASM_ENABLE_LOG != 0 | ||||
|     int log_verbose_level = 2; | ||||
| #endif | ||||
| 
 | ||||
|     os_printf("### iwasm main begin\n"); | ||||
| 
 | ||||
|     memset(&init_args, 0, sizeof(RuntimeInitArgs)); | ||||
| 
 | ||||
|     init_args.mem_alloc_type = Alloc_With_Pool; | ||||
|     init_args.mem_alloc_option.pool.heap_buf = global_heap_buf; | ||||
|     init_args.mem_alloc_option.pool.heap_size = sizeof(global_heap_buf); | ||||
| 
 | ||||
|     /* initialize runtime environment */ | ||||
|     if (!wasm_runtime_full_init(&init_args)) { | ||||
|         os_printf("Init runtime environment failed.\n"); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     os_printf("### wasm runtime initialized.\n"); | ||||
| 
 | ||||
| #if WASM_ENABLE_LOG != 0 | ||||
|     bh_log_set_verbose_level(log_verbose_level); | ||||
| #endif | ||||
| 
 | ||||
|     /* load WASM byte buffer from byte buffer of include file */ | ||||
|     wasm_file_buf = (uint8 *)wasm_test_file; | ||||
|     wasm_file_size = sizeof(wasm_test_file); | ||||
| 
 | ||||
|     /* load WASM module */ | ||||
|     if (!(wasm_module = wasm_runtime_load(wasm_file_buf, wasm_file_size, | ||||
|                                           error_buf, sizeof(error_buf)))) { | ||||
|         os_printf("%s\n", error_buf); | ||||
|         goto fail1; | ||||
|     } | ||||
| 
 | ||||
|     os_printf("### wasm runtime load module success.\n"); | ||||
| 
 | ||||
|     /* instantiate the module */ | ||||
|     if (!(wasm_module_inst = wasm_runtime_instantiate( | ||||
|               wasm_module, CONFIG_APP_STACK_SIZE, CONFIG_APP_HEAP_SIZE, | ||||
|               error_buf, sizeof(error_buf)))) { | ||||
|         os_printf("%s\n", error_buf); | ||||
|         goto fail2; | ||||
|     } | ||||
| 
 | ||||
|     os_printf("### wasm runtime instantiate module success.\n"); | ||||
| 
 | ||||
|     /* invoke the main function */ | ||||
|     app_instance_main(wasm_module_inst); | ||||
| 
 | ||||
|     os_printf("### wasm runtime execute app's main function success.\n"); | ||||
| 
 | ||||
|     /* destroy the module instance */ | ||||
|     wasm_runtime_deinstantiate(wasm_module_inst); | ||||
| 
 | ||||
|     os_printf("### wasm runtime deinstantiate module success.\n"); | ||||
| 
 | ||||
| fail2: | ||||
|     /* unload the module */ | ||||
|     wasm_runtime_unload(wasm_module); | ||||
| 
 | ||||
|     os_printf("### wasm runtime unload module success.\n"); | ||||
| fail1: | ||||
|     /* destroy runtime environment */ | ||||
|     wasm_runtime_destroy(); | ||||
|     os_printf("### wasm runtime destroy success.\n"); | ||||
| } | ||||
|  | @ -2,38 +2,104 @@ | |||
|  * Copyright (C) 2019 Intel Corporation.  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" | ||||
| 
 | ||||
| extern void | ||||
| iwasm_main(void); | ||||
| 
 | ||||
| static void | ||||
| wamr_task(void *param) | ||||
| static void * | ||||
| app_instance_main(wasm_module_inst_t module_inst) | ||||
| { | ||||
|     os_printf("WAMR task started\n"); | ||||
|     const char *exception; | ||||
| 
 | ||||
|     iwasm_main(); | ||||
|     wasm_application_execute_main(module_inst, 0, NULL); | ||||
|     if ((exception = wasm_runtime_get_exception(module_inst))) | ||||
|         printf("%s\n", exception); | ||||
|     return NULL; | ||||
| } | ||||
| 
 | ||||
|     while (1) { | ||||
|         task_sleep(1000); | ||||
|         /*os_printf("Hello WAMR\n");*/ | ||||
| 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; | ||||
| 
 | ||||
|     printf("wasm_runtime_full_init\n"); | ||||
|     /* initialize runtime environment */ | ||||
|     if (!wasm_runtime_full_init(&init_args)) { | ||||
|         printf("Init runtime failed.\n"); | ||||
|         return NULL; | ||||
|     } | ||||
|     (void)param; | ||||
| 
 | ||||
|     /* load WASM byte buffer from byte buffer of include file */ | ||||
|     printf("use an internal test file, that's going to output Hello World\n"); | ||||
|     wasm_file_buf = (uint8_t *)wasm_test_file; | ||||
|     wasm_file_buf_size = sizeof(wasm_test_file); | ||||
| 
 | ||||
|     /* load WASM module */ | ||||
|     if (!(wasm_module = wasm_runtime_load(wasm_file_buf, wasm_file_buf_size, | ||||
|                                           error_buf, sizeof(error_buf)))) { | ||||
|         printf("Error in wasm_runtime_load: %s\n", error_buf); | ||||
|         goto fail1; | ||||
|     } | ||||
| 
 | ||||
|     printf("about to call wasm_runtime_instantiate\n"); | ||||
|     if (!(wasm_module_inst = | ||||
|               wasm_runtime_instantiate(wasm_module, 32 * 1024, // stack size
 | ||||
|                                        32 * 1024,              // heap size
 | ||||
|                                        error_buf, sizeof(error_buf)))) { | ||||
|         printf("Error while instantiating: %s\n", error_buf); | ||||
|         goto fail2; | ||||
|     } | ||||
| 
 | ||||
|     printf("run main() of the application\n"); | ||||
|     ret = app_instance_main(wasm_module_inst); | ||||
|     assert(!ret); | ||||
| 
 | ||||
|     /* destroy the module instance */ | ||||
|     printf("wasm_runtime_deinstantiate\n"); | ||||
|     wasm_runtime_deinstantiate(wasm_module_inst); | ||||
| 
 | ||||
| fail2: | ||||
|     /* unload the module */ | ||||
|     printf("wasm_runtime_unload\n"); | ||||
|     wasm_runtime_unload(wasm_module); | ||||
| 
 | ||||
| fail1: | ||||
|     /* destroy runtime environment */ | ||||
|     printf("wasm_runtime_destroy\n"); | ||||
|     wasm_runtime_destroy(); | ||||
| 
 | ||||
|     return NULL; | ||||
| } | ||||
| 
 | ||||
| static bool | ||||
| app_init(uint32_t id) | ||||
| void | ||||
| app_main(void) | ||||
| { | ||||
|     os_printf("WAMR init, id: %d\n", id); | ||||
|     task_start("wamr_task", 8192, 4, wamr_task, NULL); | ||||
|     return true; | ||||
| } | ||||
|     pthread_t t; | ||||
|     int res; | ||||
| 
 | ||||
| static void | ||||
| app_exit(uint32_t id) | ||||
| { | ||||
|     os_printf("WAMR exit, id: %d\n", id); | ||||
| } | ||||
|     res = pthread_create(&t, NULL, iwasm_main, (void *)NULL); | ||||
|     assert(res == 0); | ||||
| 
 | ||||
| INTERNAL_APP_DEFINE("WAMR", APP_VERSION(0, 0, 0, 1), 0, app_init, app_exit); | ||||
|     res = pthread_join(t, NULL); | ||||
|     assert(res == 0); | ||||
| 
 | ||||
|     printf("Exiting... \n"); | ||||
| } | ||||
|  |  | |||
|  | @ -1,56 +0,0 @@ | |||
| # TODO: set WAMR root dir
 | ||||
| WAMR_ROOT := ../../.. | ||||
| 
 | ||||
| override PROJECT_CFLAGS := $(PROJECT_CFLAGS) -Wno-unused-parameter -Wno-pedantic | ||||
| 
 | ||||
| override PROJECT_CFLAGS := $(PROJECT_CFLAGS) -I$(PROJECTS_SRC_ROOT)/include | ||||
| 
 | ||||
| override PROJECT_CFLAGS := $(PROJECT_CFLAGS) \ | ||||
|                            -I$(WAMR_INC_ROOT)/core \
 | ||||
|                            -I$(WAMR_INC_ROOT)/core/iwasm/include \
 | ||||
|                            -I$(WAMR_INC_ROOT)/core/iwasm/common \
 | ||||
|                            -I$(WAMR_INC_ROOT)/core/shared/utils \
 | ||||
|                            -I$(WAMR_INC_ROOT)/core/shared/mem-alloc \
 | ||||
|                            -I$(WAMR_INC_ROOT)/core/shared/platform/include \
 | ||||
|                            -I$(WAMR_INC_ROOT)/core/shared/platform/esp-idf \
 | ||||
|                            -I$(WAMR_INC_ROOT)/core/iwasm/interpreter | ||||
| 
 | ||||
| override PROJECT_CFLAGS := $(PROJECT_CFLAGS) \ | ||||
|                            -DBH_PLATFORM_ESP_IDF \
 | ||||
|                            -DBH_MALLOC=wasm_runtime_malloc \
 | ||||
|                            -DBH_FREE=wasm_runtime_free \
 | ||||
|                            -DBUILD_TARGET_X86_32 \
 | ||||
|                            -DWASM_ENABLE_INTERP=1 \
 | ||||
|                            -DWASM_ENABLE_FAST_INTERP=0 \
 | ||||
|                            -DWASM_ENABLE_LIBC_BUILTIN=1 | ||||
| 
 | ||||
| override PROJECT_CSRC := $(PROJECT_CSRC) \ | ||||
|                          $(WAMR_SRC_ROOT)/core/shared/platform/esp-idf/espidf_platform.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/shared/platform/esp-idf/espidf_thread.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/shared/platform/common/freertos/freertos_malloc.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/shared/platform/common/freertos/freertos_thread.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/shared/platform/common/freertos/freertos_time.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/shared/mem-alloc/mem_alloc.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/shared/mem-alloc/ems/ems_kfc.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/shared/mem-alloc/ems/ems_hmu.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/shared/mem-alloc/ems/ems_alloc.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/shared/utils/bh_assert.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/shared/utils/bh_common.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/shared/utils/bh_hashmap.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/shared/utils/bh_list.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/shared/utils/bh_log.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/shared/utils/bh_vector.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/iwasm/libraries/libc-builtin/libc_builtin_wrapper.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/iwasm/common/wasm_application.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/iwasm/common/wasm_runtime_common.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/iwasm/common/wasm_exec_env.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/iwasm/common/wasm_native.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/iwasm/common/wasm_memory.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/iwasm/common/wasm_shared_memory.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/iwasm/common/wasm_c_api.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/iwasm/common/arch/invokeNative_ia32.s \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/iwasm/interpreter/wasm_interp_classic.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/iwasm/interpreter/wasm_loader.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/core/iwasm/interpreter/wasm_runtime.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/product-mini/platforms/esp-idf/iwasm_main.c \
 | ||||
|                          $(WAMR_SRC_ROOT)/product-mini/platforms/esp-idf/main.c | ||||
|  | @ -9,6 +9,8 @@ | |||
|  *   product-mini/app-samples/hello-world/main.c. | ||||
|  */ | ||||
| unsigned char __aligned(4) wasm_test_file[] = { | ||||
| // binary for the interpreter
 | ||||
| #if WAMR_BUILD_INTERP != 0 | ||||
|     0x00, 0x61, 0x73, 0x6D, 0x01, 0x00, 0x00, 0x00, 0x01, 0x10, 0x03, 0x60, | ||||
|     0x01, 0x7F, 0x01, 0x7F, 0x60, 0x02, 0x7F, 0x7F, 0x01, 0x7F, 0x60, 0x01, | ||||
|     0x7F, 0x00, 0x02, 0x31, 0x04, 0x03, 0x65, 0x6E, 0x76, 0x04, 0x70, 0x75, | ||||
|  | @ -43,4 +45,242 @@ unsigned char __aligned(4) wasm_test_file[] = { | |||
|     0x3A, 0x20, 0x25, 0x73, 0x00, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x77, | ||||
|     0x6F, 0x72, 0x6C, 0x64, 0x21, 0x00, 0x6D, 0x61, 0x6C, 0x6C, 0x6F, 0x63, | ||||
|     0x20, 0x62, 0x75, 0x66, 0x20, 0x66, 0x61, 0x69, 0x6C, 0x65, 0x64, 0x00 | ||||
| // binary for the xtensa aot compiler
 | ||||
| #elif WAMR_BUILD_TARGET_XTENSA != 0 | ||||
|     0x00, 0x61, 0x6F, 0x74, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5E, 0x00, | ||||
|     0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x78, 0x74, 0x65, 0x6E, 0x73, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x38, 0x01, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x40, 0x14, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, | ||||
|     0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x41, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, | ||||
|     0x39, 0x00, 0x00, 0x00, 0x62, 0x75, 0x66, 0x20, 0x70, 0x74, 0x72, 0x3A, | ||||
|     0x20, 0x25, 0x70, 0x0A, 0x00, 0x31, 0x32, 0x33, 0x34, 0x0A, 0x00, 0x62, | ||||
|     0x75, 0x66, 0x3A, 0x20, 0x25, 0x73, 0x00, 0x48, 0x65, 0x6C, 0x6C, 0x6F, | ||||
|     0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x21, 0x00, 0x6D, 0x61, 0x6C, 0x6C, | ||||
|     0x6F, 0x63, 0x20, 0x62, 0x75, 0x66, 0x20, 0x66, 0x61, 0x69, 0x6C, 0x65, | ||||
|     0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, | ||||
|     0x01, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, | ||||
|     0x01, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x00, 0x01, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x03, 0x00, 0x00, 0x00, 0x7F, 0x01, 0x41, 0x00, 0x40, 0x14, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x3A, 0x04, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x40, 0x14, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, | ||||
|     0x65, 0x6E, 0x76, 0x00, 0x04, 0x00, 0x70, 0x75, 0x74, 0x73, 0x00, 0x00, | ||||
|     0x03, 0x00, 0x65, 0x6E, 0x76, 0x00, 0x06, 0x00, 0x6D, 0x61, 0x6C, 0x6C, | ||||
|     0x6F, 0x63, 0x01, 0x00, 0x03, 0x00, 0x65, 0x6E, 0x76, 0x00, 0x06, 0x00, | ||||
|     0x70, 0x72, 0x69, 0x6E, 0x74, 0x66, 0x02, 0x00, 0x03, 0x00, 0x65, 0x6E, | ||||
|     0x76, 0x00, 0x04, 0x00, 0x66, 0x72, 0x65, 0x65, 0x01, 0x00, 0x00, 0x00, | ||||
|     0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, | ||||
|     0x02, 0x00, 0x00, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x40, 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x02, 0x00, 0x00, 0x00, 0x70, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0xC1, 0x00, 0x98, | ||||
|     0x62, 0x78, 0x22, 0x82, 0x27, 0x6A, 0x32, 0xC8, 0xE0, 0x0C, 0xD4, 0x37, | ||||
|     0xB9, 0x08, 0xA8, 0x72, 0x0C, 0xEB, 0x37, 0xBA, 0x0F, 0x4D, 0x0B, 0x81, | ||||
|     0xFF, 0xFF, 0xAD, 0x07, 0xBD, 0x04, 0xE0, 0x08, 0x00, 0x0C, 0x02, 0x1D, | ||||
|     0xF0, 0xB9, 0x51, 0x49, 0x81, 0xA9, 0x61, 0x99, 0x91, 0x89, 0xC1, 0x68, | ||||
|     0x32, 0x82, 0x27, 0x64, 0x89, 0xB1, 0x82, 0x27, 0x62, 0x89, 0x71, 0x82, | ||||
|     0x27, 0x56, 0x89, 0xA1, 0x0C, 0x05, 0x32, 0x67, 0x6A, 0x52, 0x46, 0x03, | ||||
|     0x52, 0x46, 0x02, 0x0C, 0x48, 0x89, 0xE1, 0x82, 0x46, 0x01, 0x1C, 0xB8, | ||||
|     0x82, 0x46, 0x00, 0x0C, 0x1C, 0x41, 0xFF, 0xFF, 0xAD, 0x02, 0xBD, 0x05, | ||||
|     0xDD, 0x06, 0xE0, 0x04, 0x00, 0x92, 0xA0, 0xFF, 0x90, 0x8A, 0x10, 0x16, | ||||
|     0xA8, 0x1E, 0x0C, 0x05, 0x52, 0x46, 0x03, 0x52, 0x46, 0x02, 0x88, 0xE1, | ||||
|     0x82, 0x46, 0x01, 0x52, 0x46, 0x00, 0x0C, 0x1B, 0xAD, 0x02, 0xCD, 0x0B, | ||||
|     0x99, 0xD1, 0xDD, 0x06, 0xE0, 0x04, 0x00, 0x98, 0xD1, 0x90, 0x8A, 0x10, | ||||
|     0x16, 0x58, 0x1C, 0x49, 0x41, 0xE8, 0x06, 0x16, 0xCE, 0x17, 0x88, 0xC1, | ||||
|     0x82, 0xC8, 0xF0, 0x0C, 0x24, 0x37, 0xB8, 0x02, 0xC6, 0xDB, 0xFF, 0x98, | ||||
|     0xB1, 0x87, 0xB9, 0x02, 0xC6, 0xD9, 0xFF, 0x98, 0xA1, 0x8A, 0x99, 0x1C, | ||||
|     0x8B, 0x00, 0x0B, 0x40, 0xE0, 0xA0, 0x91, 0xA2, 0x49, 0x03, 0x1C, 0x0C, | ||||
|     0x00, 0x0C, 0x40, 0xE0, 0xA0, 0x91, 0xA2, 0x49, 0x02, 0xE0, 0xA8, 0x41, | ||||
|     0xA9, 0x01, 0xA2, 0x49, 0x01, 0xE2, 0x49, 0x00, 0xC9, 0x11, 0x00, 0x0C, | ||||
|     0x40, 0x80, 0x90, 0x91, 0x92, 0x46, 0x06, 0xB9, 0x21, 0x00, 0x0B, 0x40, | ||||
|     0x80, 0x90, 0x91, 0x92, 0x46, 0x07, 0x82, 0x46, 0x04, 0x80, 0x88, 0x41, | ||||
|     0x82, 0x46, 0x05, 0x0C, 0x05, 0x52, 0x46, 0x02, 0x52, 0x46, 0x03, 0x52, | ||||
|     0x46, 0x00, 0x88, 0xE1, 0x82, 0x46, 0x01, 0x0C, 0x24, 0xAD, 0x02, 0xBD, | ||||
|     0x04, 0xCD, 0x04, 0xDD, 0x06, 0x88, 0x41, 0xE9, 0x31, 0xE0, 0x08, 0x00, | ||||
|     0x88, 0xD1, 0x80, 0x8A, 0x10, 0x16, 0xC8, 0x13, 0xF8, 0x31, 0x4B, 0x8F, | ||||
|     0x98, 0x71, 0x87, 0xB9, 0x02, 0x86, 0xBB, 0xFF, 0x92, 0xA4, 0x11, 0xD8, | ||||
|     0xA1, 0x9A, 0x9D, 0x92, 0x09, 0x00, 0x8A, 0x8D, 0xA2, 0xA4, 0x12, 0xAA, | ||||
|     0xAD, 0xA2, 0x0A, 0x00, 0xA2, 0x48, 0x01, 0x92, 0x48, 0x00, 0xE8, 0xB1, | ||||
|     0xF7, 0xBE, 0x02, 0x06, 0xB3, 0xFF, 0x82, 0xA4, 0x0E, 0x8A, 0x8D, 0x82, | ||||
|     0x08, 0x00, 0x92, 0xA4, 0x0D, 0x9A, 0x9D, 0x92, 0x09, 0x00, 0xA2, 0xA4, | ||||
|     0x10, 0xAA, 0xAD, 0xA2, 0x0A, 0x00, 0xFA, 0xBD, 0xC2, 0xA4, 0x0F, 0xCA, | ||||
|     0xCD, 0xC2, 0x0C, 0x00, 0xC2, 0x4B, 0x02, 0xA2, 0x4B, 0x03, 0x92, 0x4B, | ||||
|     0x00, 0x82, 0x4B, 0x01, 0x37, 0xBE, 0x02, 0x06, 0xA6, 0xFF, 0x88, 0xA1, | ||||
|     0x3A, 0x88, 0xA8, 0x21, 0x00, 0x0A, 0x40, 0xF0, 0x90, 0x91, 0x92, 0x48, | ||||
|     0x03, 0x98, 0x11, 0x00, 0x09, 0x40, 0xF0, 0x90, 0x91, 0x92, 0x48, 0x02, | ||||
|     0x98, 0x01, 0x92, 0x48, 0x01, 0xF2, 0x48, 0x00, 0x30, 0x80, 0x91, 0x82, | ||||
|     0x46, 0x06, 0x00, 0x0A, 0x40, 0x30, 0x80, 0x91, 0x82, 0x46, 0x07, 0x32, | ||||
|     0x46, 0x04, 0x30, 0x88, 0x41, 0x82, 0x46, 0x05, 0x0C, 0x05, 0x52, 0x46, | ||||
|     0x02, 0x52, 0x46, 0x03, 0x1C, 0x38, 0x82, 0x46, 0x00, 0x88, 0xE1, 0x82, | ||||
|     0x46, 0x01, 0x0C, 0x2B, 0xAD, 0x02, 0xCD, 0x0B, 0xDD, 0x06, 0x48, 0x41, | ||||
|     0x3D, 0x0F, 0xE0, 0x04, 0x00, 0x98, 0xD1, 0x90, 0x8A, 0x10, 0x16, 0x78, | ||||
|     0x07, 0x32, 0x46, 0x00, 0x88, 0x21, 0x00, 0x08, 0x40, 0x30, 0x80, 0x91, | ||||
|     0x82, 0x46, 0x03, 0x88, 0x11, 0x00, 0x08, 0x40, 0x30, 0x80, 0x91, 0x82, | ||||
|     0x46, 0x02, 0x88, 0x01, 0x82, 0x46, 0x01, 0x0C, 0x3B, 0x0C, 0x1C, 0xAD, | ||||
|     0x02, 0x5D, 0x09, 0xDD, 0x06, 0xE0, 0x04, 0x00, 0x50, 0x8A, 0x10, 0x0C, | ||||
|     0x05, 0x56, 0xB8, 0x02, 0x46, 0x10, 0x00, 0x0C, 0x05, 0x52, 0x46, 0x03, | ||||
|     0x52, 0x46, 0x02, 0x88, 0xE1, 0x82, 0x46, 0x01, 0x2C, 0x88, 0x82, 0x46, | ||||
|     0x00, 0x0C, 0x1C, 0xAD, 0x02, 0xBD, 0x05, 0x4D, 0x09, 0xDD, 0x06, 0x88, | ||||
|     0x41, 0xE0, 0x08, 0x00, 0x40, 0x8A, 0x10, 0x16, 0xA8, 0x01, 0x7C, 0xF5, | ||||
|     0x48, 0x81, 0x88, 0xC1, 0x98, 0x91, 0x87, 0x39, 0x02, 0x86, 0x72, 0xFF, | ||||
|     0x48, 0x51, 0x98, 0x61, 0x87, 0xB9, 0x02, 0x06, 0x70, 0xFF, 0x82, 0x67, | ||||
|     0x6A, 0x2D, 0x05, 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, | ||||
|     0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, | ||||
|     0x04, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x00, 0x6D, 0x65, 0x6D, 0x6F, | ||||
|     0x72, 0x79, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, | ||||
|     0x6D, 0x61, 0x69, 0x6E, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0A, 0x00, | ||||
|     0x5F, 0x5F, 0x64, 0x61, 0x74, 0x61, 0x5F, 0x65, 0x6E, 0x64, 0x00, 0x00, | ||||
|     0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0B, 0x00, 0x5F, 0x5F, 0x68, 0x65, | ||||
|     0x61, 0x70, 0x5F, 0x62, 0x61, 0x73, 0x65, 0x00, 0x05, 0x00, 0x00, 0x00, | ||||
|     0xC8, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x0C, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, | ||||
|     0x3A, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x2E, 0x72, | ||||
|     0x65, 0x6C, 0x61, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x08, 0x00, 0x2E, 0x6C, | ||||
|     0x69, 0x74, 0x65, 0x72, 0x61, 0x6C, 0x0D, 0x00, 0x2E, 0x72, 0x65, 0x6C, | ||||
|     0x61, 0x2E, 0x6C, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6C, 0x00, 0x11, 0x00, | ||||
|     0x61, 0x6F, 0x74, 0x5F, 0x69, 0x6E, 0x76, 0x6F, 0x6B, 0x65, 0x5F, 0x6E, | ||||
|     0x61, 0x74, 0x69, 0x76, 0x65, 0x00, 0x19, 0x00, 0x61, 0x6F, 0x74, 0x5F, | ||||
|     0x73, 0x65, 0x74, 0x5F, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6F, | ||||
|     0x6E, 0x5F, 0x77, 0x69, 0x74, 0x68, 0x5F, 0x69, 0x64, 0x00, 0x00, 0x00, | ||||
|     0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, | ||||
|     0x1B, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, | ||||
|     0x01, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, | ||||
|     0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00 | ||||
| // binary for the riscv aot compiler
 | ||||
| #else | ||||
|     0x00, 0x61, 0x6F, 0x74, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xF3, 0x00, | ||||
|     0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x72, 0x69, 0x73, 0x63, 0x76, 0x33, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x38, 0x01, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x40, 0x14, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, | ||||
|     0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x41, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, | ||||
|     0x39, 0x00, 0x00, 0x00, 0x62, 0x75, 0x66, 0x20, 0x70, 0x74, 0x72, 0x3A, | ||||
|     0x20, 0x25, 0x70, 0x0A, 0x00, 0x31, 0x32, 0x33, 0x34, 0x0A, 0x00, 0x62, | ||||
|     0x75, 0x66, 0x3A, 0x20, 0x25, 0x73, 0x00, 0x48, 0x65, 0x6C, 0x6C, 0x6F, | ||||
|     0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x21, 0x00, 0x6D, 0x61, 0x6C, 0x6C, | ||||
|     0x6F, 0x63, 0x20, 0x62, 0x75, 0x66, 0x20, 0x66, 0x61, 0x69, 0x6C, 0x65, | ||||
|     0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, | ||||
|     0x01, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, | ||||
|     0x01, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x00, 0x01, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x03, 0x00, 0x00, 0x00, 0x7F, 0x01, 0x41, 0x00, 0x40, 0x14, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x3A, 0x04, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x40, 0x14, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, | ||||
|     0x65, 0x6E, 0x76, 0x00, 0x04, 0x00, 0x70, 0x75, 0x74, 0x73, 0x00, 0x00, | ||||
|     0x03, 0x00, 0x65, 0x6E, 0x76, 0x00, 0x06, 0x00, 0x6D, 0x61, 0x6C, 0x6C, | ||||
|     0x6F, 0x63, 0x01, 0x00, 0x03, 0x00, 0x65, 0x6E, 0x76, 0x00, 0x06, 0x00, | ||||
|     0x70, 0x72, 0x69, 0x6E, 0x74, 0x66, 0x02, 0x00, 0x03, 0x00, 0x65, 0x6E, | ||||
|     0x76, 0x00, 0x04, 0x00, 0x66, 0x72, 0x65, 0x65, 0x01, 0x00, 0x00, 0x00, | ||||
|     0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, | ||||
|     0x02, 0x00, 0x00, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x40, 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x02, 0x00, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x13, 0x01, 0x01, 0xFC, 0x23, 0x2E, 0x11, 0x02, 0x23, 0x2C, 0x81, 0x02, | ||||
|     0x23, 0x2A, 0x91, 0x02, 0x23, 0x28, 0x21, 0x03, 0x23, 0x26, 0x31, 0x03, | ||||
|     0x23, 0x24, 0x41, 0x03, 0x23, 0x22, 0x51, 0x03, 0x23, 0x20, 0x61, 0x03, | ||||
|     0x23, 0x2E, 0x71, 0x01, 0x23, 0x2C, 0x81, 0x01, 0x23, 0x2A, 0x91, 0x01, | ||||
|     0x23, 0x28, 0xA1, 0x01, 0x23, 0x26, 0xB1, 0x01, 0x83, 0x29, 0x85, 0x00, | ||||
|     0x03, 0xAA, 0x89, 0x1A, 0x83, 0x2A, 0x85, 0x01, 0x93, 0x0B, 0x0A, 0xFE, | ||||
|     0x13, 0x04, 0xD0, 0x00, 0x63, 0xFA, 0x7A, 0x01, 0x93, 0x04, 0x05, 0x00, | ||||
|     0x03, 0x2B, 0xC5, 0x01, 0x13, 0x04, 0xE0, 0x00, 0x63, 0x7A, 0x7B, 0x05, | ||||
|     0x13, 0x85, 0x09, 0x00, 0x93, 0x05, 0x04, 0x00, 0x97, 0x00, 0x00, 0x00, | ||||
|     0xE7, 0x80, 0x00, 0x00, 0x13, 0x05, 0x00, 0x00, 0x83, 0x2D, 0xC1, 0x00, | ||||
|     0x03, 0x2D, 0x01, 0x01, 0x83, 0x2C, 0x41, 0x01, 0x03, 0x2C, 0x81, 0x01, | ||||
|     0x83, 0x2B, 0xC1, 0x01, 0x03, 0x2B, 0x01, 0x02, 0x83, 0x2A, 0x41, 0x02, | ||||
|     0x03, 0x2A, 0x81, 0x02, 0x83, 0x29, 0xC1, 0x02, 0x03, 0x29, 0x01, 0x03, | ||||
|     0x83, 0x24, 0x41, 0x03, 0x03, 0x24, 0x81, 0x03, 0x83, 0x20, 0xC1, 0x03, | ||||
|     0x13, 0x01, 0x01, 0x04, 0x67, 0x80, 0x00, 0x00, 0x03, 0xA9, 0xC4, 0x00, | ||||
|     0x03, 0xAC, 0x89, 0x15, 0x83, 0xAD, 0x89, 0x18, 0x83, 0xAC, 0x09, 0x19, | ||||
|     0x23, 0xA4, 0x79, 0x1B, 0xA3, 0x01, 0x09, 0x00, 0x23, 0x01, 0x09, 0x00, | ||||
|     0x13, 0x04, 0x40, 0x00, 0xA3, 0x00, 0x89, 0x00, 0x13, 0x05, 0xB0, 0x01, | ||||
|     0x23, 0x00, 0xA9, 0x00, 0x13, 0x06, 0x10, 0x00, 0x13, 0x85, 0x04, 0x00, | ||||
|     0x93, 0x05, 0x00, 0x00, 0x93, 0x06, 0x09, 0x00, 0x97, 0x00, 0x00, 0x00, | ||||
|     0xE7, 0x80, 0x00, 0x00, 0x13, 0x75, 0xF5, 0x0F, 0xE3, 0x0C, 0x05, 0xF6, | ||||
|     0xA3, 0x01, 0x09, 0x00, 0x23, 0x01, 0x09, 0x00, 0xA3, 0x00, 0x89, 0x00, | ||||
|     0x23, 0x00, 0x09, 0x00, 0x93, 0x05, 0x10, 0x00, 0x13, 0x06, 0x10, 0x00, | ||||
|     0x13, 0x85, 0x04, 0x00, 0x93, 0x06, 0x09, 0x00, 0x97, 0x00, 0x00, 0x00, | ||||
|     0xE7, 0x80, 0x00, 0x00, 0x13, 0x75, 0xF5, 0x0F, 0xE3, 0x04, 0x05, 0xF4, | ||||
|     0x03, 0x2D, 0x09, 0x00, 0x63, 0x08, 0x0D, 0x18, 0x13, 0x05, 0x0A, 0xFF, | ||||
|     0xB3, 0x35, 0x75, 0x01, 0x33, 0xB6, 0xAC, 0x00, 0xB3, 0xE5, 0xC5, 0x00, | ||||
|     0x13, 0x04, 0x20, 0x00, 0xE3, 0x9C, 0x05, 0xF0, 0xB3, 0x05, 0xAC, 0x00, | ||||
|     0x13, 0x56, 0x8D, 0x01, 0x23, 0x24, 0xC1, 0x00, 0xA3, 0x81, 0xC5, 0x00, | ||||
|     0x13, 0x56, 0x0D, 0x01, 0x23, 0x22, 0xC1, 0x00, 0x23, 0x81, 0xC5, 0x00, | ||||
|     0x13, 0x56, 0x8D, 0x00, 0x23, 0x20, 0xC1, 0x00, 0xA3, 0x80, 0xC5, 0x00, | ||||
|     0x23, 0x80, 0xA5, 0x01, 0x23, 0x01, 0x09, 0x00, 0xA3, 0x01, 0x09, 0x00, | ||||
|     0x23, 0x00, 0x09, 0x00, 0x93, 0x05, 0x40, 0x00, 0xA3, 0x00, 0xB9, 0x00, | ||||
|     0x93, 0x55, 0x05, 0x01, 0x23, 0x03, 0xB9, 0x00, 0x93, 0x55, 0x85, 0x01, | ||||
|     0xA3, 0x03, 0xB9, 0x00, 0x23, 0x02, 0xA9, 0x00, 0x13, 0x55, 0x85, 0x00, | ||||
|     0xA3, 0x02, 0xA9, 0x00, 0x93, 0x05, 0x20, 0x00, 0x13, 0x06, 0x20, 0x00, | ||||
|     0x13, 0x04, 0x20, 0x00, 0x13, 0x85, 0x04, 0x00, 0x93, 0x06, 0x09, 0x00, | ||||
|     0x97, 0x00, 0x00, 0x00, 0xE7, 0x80, 0x00, 0x00, 0x13, 0x75, 0xF5, 0x0F, | ||||
|     0xE3, 0x04, 0x05, 0xEA, 0x13, 0x05, 0x4D, 0x00, 0xE3, 0xE8, 0xAD, 0xE8, | ||||
|     0x83, 0x05, 0x2C, 0x41, 0x03, 0x46, 0x1C, 0x41, 0x33, 0x05, 0xAC, 0x00, | ||||
|     0xA3, 0x00, 0xB5, 0x00, 0x23, 0x00, 0xC5, 0x00, 0xE3, 0xEC, 0xAC, 0xE7, | ||||
|     0x03, 0x45, 0xEC, 0x40, 0x83, 0x45, 0xFC, 0x40, 0x03, 0x46, 0x0C, 0x41, | ||||
|     0x83, 0x46, 0xDC, 0x40, 0x33, 0x07, 0xAC, 0x01, 0x23, 0x01, 0xB7, 0x00, | ||||
|     0xA3, 0x01, 0xC7, 0x00, 0x23, 0x00, 0xD7, 0x00, 0xA3, 0x00, 0xA7, 0x00, | ||||
|     0xE3, 0xE8, 0x7C, 0xE5, 0x33, 0x05, 0x7C, 0x01, 0x03, 0x24, 0x81, 0x00, | ||||
|     0xA3, 0x01, 0x85, 0x00, 0x03, 0x2C, 0x41, 0x00, 0x23, 0x01, 0x85, 0x01, | ||||
|     0x83, 0x2C, 0x01, 0x00, 0xA3, 0x00, 0x95, 0x01, 0x23, 0x00, 0xA5, 0x01, | ||||
|     0x23, 0x01, 0x09, 0x00, 0xA3, 0x01, 0x09, 0x00, 0x13, 0x05, 0x30, 0x01, | ||||
|     0x23, 0x00, 0xA9, 0x00, 0x13, 0x05, 0x40, 0x00, 0xA3, 0x00, 0xA9, 0x00, | ||||
|     0x13, 0xD5, 0x0B, 0x01, 0x23, 0x03, 0xA9, 0x00, 0x13, 0xD5, 0x8B, 0x01, | ||||
|     0xA3, 0x03, 0xA9, 0x00, 0x23, 0x02, 0x79, 0x01, 0x13, 0xD5, 0x8B, 0x00, | ||||
|     0xA3, 0x02, 0xA9, 0x00, 0x93, 0x05, 0x20, 0x00, 0x13, 0x06, 0x20, 0x00, | ||||
|     0x13, 0x85, 0x04, 0x00, 0x93, 0x06, 0x09, 0x00, 0x97, 0x00, 0x00, 0x00, | ||||
|     0xE7, 0x80, 0x00, 0x00, 0x13, 0x75, 0xF5, 0x0F, 0xE3, 0x06, 0x05, 0xDE, | ||||
|     0x23, 0x00, 0xA9, 0x01, 0xA3, 0x01, 0x89, 0x00, 0x23, 0x01, 0x89, 0x01, | ||||
|     0xA3, 0x00, 0x99, 0x01, 0x93, 0x05, 0x30, 0x00, 0x13, 0x06, 0x10, 0x00, | ||||
|     0x13, 0x85, 0x04, 0x00, 0x93, 0x06, 0x09, 0x00, 0x97, 0x00, 0x00, 0x00, | ||||
|     0xE7, 0x80, 0x00, 0x00, 0x93, 0x75, 0xF5, 0x0F, 0x13, 0x05, 0x00, 0x00, | ||||
|     0x63, 0x92, 0x05, 0x04, 0x6F, 0xF0, 0x9F, 0xDB, 0xA3, 0x01, 0x09, 0x00, | ||||
|     0x23, 0x01, 0x09, 0x00, 0x13, 0x05, 0x40, 0x00, 0xA3, 0x00, 0xA9, 0x00, | ||||
|     0x13, 0x05, 0x80, 0x02, 0x23, 0x00, 0xA9, 0x00, 0x13, 0x06, 0x10, 0x00, | ||||
|     0x13, 0x85, 0x04, 0x00, 0x93, 0x05, 0x00, 0x00, 0x93, 0x06, 0x09, 0x00, | ||||
|     0x97, 0x00, 0x00, 0x00, 0xE7, 0x80, 0x00, 0x00, 0x93, 0x75, 0xF5, 0x0F, | ||||
|     0x13, 0x05, 0xF0, 0xFF, 0xE3, 0x8C, 0x05, 0xD6, 0x13, 0x04, 0xD0, 0x00, | ||||
|     0xE3, 0xF0, 0x4A, 0xD7, 0x13, 0x04, 0xE0, 0x00, 0xE3, 0x6C, 0x4B, 0xD5, | ||||
|     0x23, 0xA4, 0x49, 0x1B, 0x6F, 0xF0, 0x5F, 0xD6, 0x03, 0x00, 0x00, 0x00, | ||||
|     0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, | ||||
|     0x04, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x00, 0x6D, 0x65, 0x6D, 0x6F, | ||||
|     0x72, 0x79, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, | ||||
|     0x6D, 0x61, 0x69, 0x6E, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0A, 0x00, | ||||
|     0x5F, 0x5F, 0x64, 0x61, 0x74, 0x61, 0x5F, 0x65, 0x6E, 0x64, 0x00, 0x00, | ||||
|     0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0B, 0x00, 0x5F, 0x5F, 0x68, 0x65, | ||||
|     0x61, 0x70, 0x5F, 0x62, 0x61, 0x73, 0x65, 0x00, 0x05, 0x00, 0x00, 0x00, | ||||
|     0xCC, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x0C, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, | ||||
|     0x0A, 0x00, 0x2E, 0x72, 0x65, 0x6C, 0x61, 0x2E, 0x74, 0x65, 0x78, 0x74, | ||||
|     0x19, 0x00, 0x61, 0x6F, 0x74, 0x5F, 0x73, 0x65, 0x74, 0x5F, 0x65, 0x78, | ||||
|     0x63, 0x65, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x5F, 0x77, 0x69, 0x74, 0x68, | ||||
|     0x5F, 0x69, 0x64, 0x00, 0x11, 0x00, 0x61, 0x6F, 0x74, 0x5F, 0x69, 0x6E, | ||||
|     0x76, 0x6F, 0x6B, 0x65, 0x5F, 0x6E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x00, | ||||
|     0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, | ||||
|     0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, | ||||
|     0x01, 0x00, 0x00, 0x00, 0xEC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x13, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x01, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, | ||||
|     0xBC, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, | ||||
|     0x02, 0x00, 0x00, 0x00, 0x78, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x13, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xA8, 0x02, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, | ||||
|     0xE8, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, | ||||
|     0x02, 0x00, 0x00, 0x00 | ||||
| #endif | ||||
| }; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Bastian Kersting
						Bastian Kersting