diff --git a/bsp/abstract-machine/extra.ld b/bsp/abstract-machine/extra.ld index 071b247..b7e24cc 100644 --- a/bsp/abstract-machine/extra.ld +++ b/bsp/abstract-machine/extra.ld @@ -20,6 +20,26 @@ SECTIONS { __rt_utest_tc_tab_start = .; KEEP(*(UtestTcTab)) __rt_utest_tc_tab_end = .; + + . = ALIGN(8); + __am_apps_data_start = .; + *(__am_apps.data*) + *(__am_apps.sdata*) + __am_apps_data_end = .; + . = ALIGN(8); } } INSERT BEFORE .data; + +SECTIONS { + .bss.extra : { + . = ALIGN(8); + __am_apps_bss_start = .; + *(__am_apps.bss*) + *(__am_apps.sbss*) + *(__am_apps.scommon*) + __am_apps_bss_end = .; + . = ALIGN(8); + } +} +INSERT AFTER .bss; diff --git a/bsp/abstract-machine/integrate-am-apps.py b/bsp/abstract-machine/integrate-am-apps.py index 79f472f..2f7b326 100644 --- a/bsp/abstract-machine/integrate-am-apps.py +++ b/bsp/abstract-machine/integrate-am-apps.py @@ -49,7 +49,7 @@ def integrate(app_dir): redefine_sym_fp.write(f"__am_{app_name}_{f} {f}\n") redefine_sym_fp.close() for obj in objs: - os.system(f"objcopy --prefix-symbols=__am_{app_name}_ {str(obj)}") + os.system(f"objcopy --prefix-symbols=__am_{app_name}_ --prefix-sections=__am_apps {str(obj)}") os.system(f"objcopy --redefine-syms=redefine_sym.txt {str(obj)}") am_app_mk_fp.write("SRCS += " + str(obj.relative_to("build/" + ARCH)) + "\n") os.remove(redefine_sym_file) @@ -65,14 +65,18 @@ read_lib_symbols("klib") am_app_mk_fp.write("SRCS += build/am-apps.c\n") am_app_c_fp.write("""#include +#include #include -extern Area am_apps_heap; +extern Area am_apps_heap, am_apps_data, am_apps_bss; +extern uint8_t * am_apps_data_content; static void am_app_start_thread(void *args) { void (*fn)(const char *mainargs) = ((void **)args)[0]; const char *mainargs = ((void **)args)[1]; fn(mainargs); } static void am_app_start_wrapper(const char *app_name, void *app_main, int argc, char *argv[]) { + memcpy(am_apps_data.start, am_apps_data_content, am_apps_data.end - am_apps_data.start); + memset(am_apps_bss.start, 0, am_apps_bss.end - am_apps_bss.start); heap = am_apps_heap; void *args[2] = { app_main, (argc >= 2 ? argv[1] : "") }; rt_thread_t tid = rt_thread_create(app_name, am_app_start_thread, args, 0x4000, 0, 20); diff --git a/bsp/abstract-machine/src/init.c b/bsp/abstract-machine/src/init.c index 75bedb8..a49aac7 100644 --- a/bsp/abstract-machine/src/init.c +++ b/bsp/abstract-machine/src/init.c @@ -1,12 +1,14 @@ #include #include +#include #include #define AM_APPS_HEAP_SIZE 0x2000000 #define RT_HW_HEAP_BEGIN heap.start #define RT_HW_HEAP_END heap.end -Area am_apps_heap; +Area am_apps_heap = {}, am_apps_data = {}, am_apps_bss = {}; +uint8_t * am_apps_data_content = NULL; void rt_hw_board_init() { int rt_hw_uart_init(void); @@ -20,7 +22,17 @@ void rt_hw_board_init() { uint32_t size = AM_APPS_HEAP_SIZE; void *p = NULL; for (; p == NULL && size != 0; size /= 2) { p = rt_malloc(size); } - am_apps_heap = (Area) { .start = p, .end = p + size }; + am_apps_heap = RANGE(p, p + size); + + extern char __am_apps_data_start, __am_apps_data_end; + extern char __am_apps_bss_start, __am_apps_bss_end; + am_apps_data = RANGE(&__am_apps_data_start, &__am_apps_data_end); + am_apps_bss = RANGE(&__am_apps_bss_start, &__am_apps_bss_end); + + uint32_t data_size = am_apps_data.end - am_apps_data.start; + am_apps_data_content = rt_malloc(data_size); + assert(am_apps_data_content != NULL); + memcpy(am_apps_data_content, am_apps_data.start, data_size); #ifdef RT_USING_CONSOLE /* set console device */