bsp,am,integrate-am-apps: reset data and bss section before running
This commit is contained in:
parent
3975a30198
commit
911638c7f5
3 changed files with 40 additions and 4 deletions
|
@ -20,6 +20,26 @@ SECTIONS {
|
||||||
__rt_utest_tc_tab_start = .;
|
__rt_utest_tc_tab_start = .;
|
||||||
KEEP(*(UtestTcTab))
|
KEEP(*(UtestTcTab))
|
||||||
__rt_utest_tc_tab_end = .;
|
__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;
|
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;
|
||||||
|
|
|
@ -49,7 +49,7 @@ def integrate(app_dir):
|
||||||
redefine_sym_fp.write(f"__am_{app_name}_{f} {f}\n")
|
redefine_sym_fp.write(f"__am_{app_name}_{f} {f}\n")
|
||||||
redefine_sym_fp.close()
|
redefine_sym_fp.close()
|
||||||
for obj in objs:
|
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)}")
|
os.system(f"objcopy --redefine-syms=redefine_sym.txt {str(obj)}")
|
||||||
am_app_mk_fp.write("SRCS += " + str(obj.relative_to("build/" + ARCH)) + "\n")
|
am_app_mk_fp.write("SRCS += " + str(obj.relative_to("build/" + ARCH)) + "\n")
|
||||||
os.remove(redefine_sym_file)
|
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_mk_fp.write("SRCS += build/am-apps.c\n")
|
||||||
am_app_c_fp.write("""#include <am.h>
|
am_app_c_fp.write("""#include <am.h>
|
||||||
|
#include <klib.h>
|
||||||
#include <rtthread.h>
|
#include <rtthread.h>
|
||||||
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) {
|
static void am_app_start_thread(void *args) {
|
||||||
void (*fn)(const char *mainargs) = ((void **)args)[0];
|
void (*fn)(const char *mainargs) = ((void **)args)[0];
|
||||||
const char *mainargs = ((void **)args)[1];
|
const char *mainargs = ((void **)args)[1];
|
||||||
fn(mainargs);
|
fn(mainargs);
|
||||||
}
|
}
|
||||||
static void am_app_start_wrapper(const char *app_name, void *app_main, int argc, char *argv[]) {
|
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;
|
heap = am_apps_heap;
|
||||||
void *args[2] = { app_main, (argc >= 2 ? argv[1] : "") };
|
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);
|
rt_thread_t tid = rt_thread_create(app_name, am_app_start_thread, args, 0x4000, 0, 20);
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
#include <am.h>
|
#include <am.h>
|
||||||
#include <rtthread.h>
|
#include <rtthread.h>
|
||||||
|
#include <klib.h>
|
||||||
#include <klib-macros.h>
|
#include <klib-macros.h>
|
||||||
|
|
||||||
#define AM_APPS_HEAP_SIZE 0x2000000
|
#define AM_APPS_HEAP_SIZE 0x2000000
|
||||||
#define RT_HW_HEAP_BEGIN heap.start
|
#define RT_HW_HEAP_BEGIN heap.start
|
||||||
#define RT_HW_HEAP_END heap.end
|
#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() {
|
void rt_hw_board_init() {
|
||||||
int rt_hw_uart_init(void);
|
int rt_hw_uart_init(void);
|
||||||
|
@ -20,7 +22,17 @@ void rt_hw_board_init() {
|
||||||
uint32_t size = AM_APPS_HEAP_SIZE;
|
uint32_t size = AM_APPS_HEAP_SIZE;
|
||||||
void *p = NULL;
|
void *p = NULL;
|
||||||
for (; p == NULL && size != 0; size /= 2) { p = rt_malloc(size); }
|
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
|
#ifdef RT_USING_CONSOLE
|
||||||
/* set console device */
|
/* set console device */
|
||||||
|
|
Loading…
Add table
Reference in a new issue