From 9d6f56671492a896e72d3f2200e203c6f79dfc4c Mon Sep 17 00:00:00 2001 From: Chen Wang Date: Fri, 18 Apr 2025 12:02:59 +0800 Subject: [PATCH] bsp: cvitek: riscv: use marco for linker script Regarding link script, some memory offsets and sizes are different between the standard version and the smart version (such as "__STACKSIZE__", kernel start address, kernel memory size, etc.). Original solution is replacing link scripts and use INCLUDE, which is relatively complicated. This improvement uses macros to replace constants in the link script. The preprocessing mechanism provided by gcc is used to dynamically replace constant values during the build process. In addition, the kernel load address (the corresponding KERNEL_VADDR_START for smart) was originally configured as 0xFFFFFFC000200000, which is default value of riscv with kernelmap enabled (0xffffffc000000000) plus offset to skip over bootloader (0x200000). This caused a trouble: due to default bsp configuration is for smart, if we switched to the standard version and build, and then switched back to the smart version, the value of KERNEL_VADDR_START will be default back to 0xffffffc000000000, which is different from the original configuration value, resulting in the need to manually reconfigure it, which is easy to forget and cause problems. The current solution is to use the default value 0xffffffc000000000 in the configuration. Add offset to the code and link script when using it. This patch update the default .config and rtconfig.h for cv18xx_riscv. Signed-off-by: Chen Wang --- bsp/cvitek/README.md | 4 +- bsp/cvitek/cv18xx_risc-v/.config | 33 ++-- bsp/cvitek/cv18xx_risc-v/.gitignore | 4 +- bsp/cvitek/cv18xx_risc-v/SConstruct | 13 +- bsp/cvitek/cv18xx_risc-v/board/board.c | 17 +- bsp/cvitek/cv18xx_risc-v/board/board.h | 12 -- bsp/cvitek/cv18xx_risc-v/board/mem_layout.h | 22 +++ bsp/cvitek/cv18xx_risc-v/gen_ld.py | 27 +++ bsp/cvitek/cv18xx_risc-v/link.lds | 12 +- bsp/cvitek/cv18xx_risc-v/link_smart.lds | 200 -------------------- bsp/cvitek/cv18xx_risc-v/link_stacksize.lds | 1 - bsp/cvitek/cv18xx_risc-v/rtconfig.h | 20 +- bsp/cvitek/cv18xx_risc-v/rtconfig.py | 2 +- 13 files changed, 106 insertions(+), 261 deletions(-) create mode 100644 bsp/cvitek/cv18xx_risc-v/board/mem_layout.h create mode 100644 bsp/cvitek/cv18xx_risc-v/gen_ld.py delete mode 100644 bsp/cvitek/cv18xx_risc-v/link_smart.lds delete mode 100755 bsp/cvitek/cv18xx_risc-v/link_stacksize.lds diff --git a/bsp/cvitek/README.md b/bsp/cvitek/README.md index 65e09b0ae49..d045a325a8f 100644 --- a/bsp/cvitek/README.md +++ b/bsp/cvitek/README.md @@ -163,11 +163,11 @@ RT-Thread Kernel ---> [*] Enable RT-Thread Smart (microkernel on kernel/userland) ``` -**注意检查内核虚拟起始地址的配置,确保为 `0xFFFFFFC000200000`。** +**注意检查内核虚拟起始地址的配置,确保为 `0xFFFFFFC000000000`。** ```shell RT-Thread Kernel ---> -(0xFFFFFFC000200000) The virtural address of kernel start +(0xFFFFFFC000000000) The virtural address of kernel start RT-Thread Components ---> ``` diff --git a/bsp/cvitek/cv18xx_risc-v/.config b/bsp/cvitek/cv18xx_risc-v/.config index cbbcec3d3b2..e85a5287011 100644 --- a/bsp/cvitek/cv18xx_risc-v/.config +++ b/bsp/cvitek/cv18xx_risc-v/.config @@ -155,7 +155,6 @@ CONFIG_RT_DEBUGING_ASSERT=y CONFIG_RT_DEBUGING_COLOR=y CONFIG_RT_DEBUGING_CONTEXT=y # CONFIG_RT_DEBUGING_AUTO_INIT is not set -# CONFIG_RT_DEBUGING_PAGE_LEAK is not set # CONFIG_RT_USING_CI_ACTION is not set # @@ -173,7 +172,6 @@ CONFIG_RT_USING_MESSAGEQUEUE=y # # Memory Management # -CONFIG_RT_PAGE_MAX_ORDER=11 # CONFIG_RT_USING_MEMPOOL is not set # CONFIG_RT_USING_SMALL_MEM is not set CONFIG_RT_USING_SLAB=y @@ -195,7 +193,7 @@ CONFIG_RT_USING_DEVICE_OPS=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=256 CONFIG_RT_CONSOLE_DEVICE_NAME="uart0" -CONFIG_RT_VER_NUM=0x50200 +CONFIG_RT_VER_NUM=0x50201 CONFIG_RT_USING_STDC_ATOMIC=y CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 # end of RT-Thread Kernel @@ -203,7 +201,7 @@ CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 CONFIG_ARCH_CPU_64BIT=y CONFIG_RT_USING_CACHE=y CONFIG_ARCH_MM_MMU=y -CONFIG_KERNEL_VADDR_START=0xFFFFFFC000200000 +CONFIG_KERNEL_VADDR_START=0xffffffc000000000 CONFIG_ARCH_RISCV=y CONFIG_ARCH_RISCV_FPU=y CONFIG_ARCH_RISCV_FPU_D=y @@ -274,6 +272,7 @@ CONFIG_RT_DFS_ELM_MUTEX_TIMEOUT=3000 CONFIG_RT_USING_DFS_DEVFS=y CONFIG_RT_USING_DFS_ROMFS=y CONFIG_RT_USING_DFS_PTYFS=y +# CONFIG_RT_USING_DFS_PROCFS is not set # CONFIG_RT_USING_DFS_CROMFS is not set CONFIG_RT_USING_DFS_TMPFS=y # CONFIG_RT_USING_DFS_MQUEUE is not set @@ -533,9 +532,25 @@ CONFIG_RT_USING_ADT_REF=y # end of Utilities # CONFIG_RT_USING_VBUS is not set + +# +# Memory management +# +CONFIG_RT_PAGE_AFFINITY_BLOCK_SIZE=0x1000 +CONFIG_RT_PAGE_MAX_ORDER=11 +# CONFIG_RT_USING_MEMBLOCK is not set + +# +# Debugging +# +# CONFIG_RT_DEBUGGING_ALIASING is not set +# CONFIG_RT_DEBUGING_PAGE_LEAK is not set +# CONFIG_RT_DEBUGGING_PAGE_POISON is not set +# end of Debugging +# end of Memory management + CONFIG_RT_USING_LWP=y -CONFIG_LWP_DEBUG=y -# CONFIG_LWP_DEBUG_INIT is not set +# CONFIG_LWP_DEBUG is not set CONFIG_LWP_USING_RUNTIME=y CONFIG_RT_LWP_MAX_NR=30 CONFIG_LWP_TASK_STACK_SIZE=16384 @@ -548,12 +563,6 @@ CONFIG_RT_USING_LDSO=y CONFIG_LWP_USING_TERMINAL=y CONFIG_LWP_PTY_MAX_PARIS_LIMIT=64 -# -# Memory management -# -# CONFIG_RT_USING_MEMBLOCK is not set -# end of Memory management - # # Using USB legacy version # diff --git a/bsp/cvitek/cv18xx_risc-v/.gitignore b/bsp/cvitek/cv18xx_risc-v/.gitignore index 5a70c2b55ff..469e9f08d17 100755 --- a/bsp/cvitek/cv18xx_risc-v/.gitignore +++ b/bsp/cvitek/cv18xx_risc-v/.gitignore @@ -1,2 +1,4 @@ dtb/ -Image \ No newline at end of file +Image + +link.lds.generated \ No newline at end of file diff --git a/bsp/cvitek/cv18xx_risc-v/SConstruct b/bsp/cvitek/cv18xx_risc-v/SConstruct index 04a2682b35a..69100f10010 100755 --- a/bsp/cvitek/cv18xx_risc-v/SConstruct +++ b/bsp/cvitek/cv18xx_risc-v/SConstruct @@ -29,20 +29,11 @@ drivers_path_prefix = os.path.dirname(SDK_ROOT) + '/drivers' # prepare building environment objs = PrepareBuilding(env, RTT_ROOT, has_libcpu = False) -if GetDepend('RT_USING_SMART'): - # use smart link.lds - env['LINKFLAGS'] = env['LINKFLAGS'].replace('link.lds', 'link_smart.lds') - # include libraries objs.extend(SConscript(drivers_path_prefix + '/SConscript', variant_dir='build/drivers', duplicate=0)) -stack_size = 4096 - -stack_lds = open('link_stacksize.lds', 'w') -if GetDepend('__STACKSIZE__'): - stack_size = GetDepend('__STACKSIZE__') -stack_lds.write('__STACKSIZE__ = %d;\n' % stack_size) -stack_lds.close() +from gen_ld import * +generate_ldscript('link.lds', 'link.lds.generated') # make a building DoBuilding(TARGET, objs) diff --git a/bsp/cvitek/cv18xx_risc-v/board/board.c b/bsp/cvitek/cv18xx_risc-v/board/board.c index ab3a7178ed9..5d7432e5478 100755 --- a/bsp/cvitek/cv18xx_risc-v/board/board.c +++ b/bsp/cvitek/cv18xx_risc-v/board/board.c @@ -14,21 +14,32 @@ #include "sbi.h" +extern unsigned int __sram_end; +#define RAM_END (rt_size_t)((void *)&__sram_end) + +extern unsigned int __bss_start; +extern unsigned int __bss_end; + +#define RT_HW_HEAP_BEGIN ((void *)&__bss_end) +#define RT_HW_HEAP_END ((void *)((rt_size_t)RT_HW_HEAP_BEGIN + 8 * 1024 * 1024)) + +#define RT_HW_PAGE_START RT_HW_HEAP_END +#define RT_HW_PAGE_END ((void *)(RAM_END)) + #ifdef RT_USING_SMART #include "riscv_mmu.h" #include "mmu.h" #include "page.h" #include "lwp_arch.h" -/* respect to boot loader, must be 0xFFFFFFC000200000 */ -RT_STATIC_ASSERT(kmem_region, KERNEL_VADDR_START == 0xFFFFFFC000200000); +#include "mem_layout.h" rt_region_t init_page_region = {(rt_size_t)RT_HW_PAGE_START, (rt_size_t)RT_HW_PAGE_END}; extern size_t MMUTable[]; struct mem_desc platform_mem_desc[] = { - {KERNEL_VADDR_START, (rt_size_t)RT_HW_PAGE_END - 1, (rt_size_t)ARCH_MAP_FAILED, NORMAL_MEM}, + {KERNEL_START, (rt_size_t)RT_HW_PAGE_END - 1, (rt_size_t)ARCH_MAP_FAILED, NORMAL_MEM}, }; #define NUM_MEM_DESC (sizeof(platform_mem_desc) / sizeof(platform_mem_desc[0])) diff --git a/bsp/cvitek/cv18xx_risc-v/board/board.h b/bsp/cvitek/cv18xx_risc-v/board/board.h index 5f23ff4a6f9..07d559f3aa3 100755 --- a/bsp/cvitek/cv18xx_risc-v/board/board.h +++ b/bsp/cvitek/cv18xx_risc-v/board/board.h @@ -15,18 +15,6 @@ #include "drv_uart.h" #include "tick.h" -extern unsigned int __sram_end; -#define RAM_END (rt_size_t)((void *)&__sram_end) - -extern unsigned int __bss_start; -extern unsigned int __bss_end; - -#define RT_HW_HEAP_BEGIN ((void *)&__bss_end) -#define RT_HW_HEAP_END ((void *)((rt_size_t)RT_HW_HEAP_BEGIN + 8 * 1024 * 1024)) - -#define RT_HW_PAGE_START RT_HW_HEAP_END -#define RT_HW_PAGE_END ((void *)(RAM_END)) - void rt_hw_board_init(void); #endif diff --git a/bsp/cvitek/cv18xx_risc-v/board/mem_layout.h b/bsp/cvitek/cv18xx_risc-v/board/mem_layout.h new file mode 100644 index 00000000000..a9c13357232 --- /dev/null +++ b/bsp/cvitek/cv18xx_risc-v/board/mem_layout.h @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef MEMORY_LAYOUT_H__ +#define MEMORY_LAYOUT_H__ + +#include "../rtconfig.h" + +/* Real start address of kernel is located after bootloader */ +#define KERNEL_OFFSET 0x200000 + +#ifdef RT_USING_SMART +#define KERNEL_START (KERNEL_VADDR_START + KERNEL_OFFSET) +#define KERNEL_SIZE 64 * 1024 * 1024 +#else +#define KERNEL_START (0x80000000 + KERNEL_OFFSET) +#define KERNEL_SIZE 32 * 1024 * 1024 +#endif + +#endif // MEMORY_LAYOUT_H__ \ No newline at end of file diff --git a/bsp/cvitek/cv18xx_risc-v/gen_ld.py b/bsp/cvitek/cv18xx_risc-v/gen_ld.py new file mode 100644 index 00000000000..7a86f5737c3 --- /dev/null +++ b/bsp/cvitek/cv18xx_risc-v/gen_ld.py @@ -0,0 +1,27 @@ +import os +import rtconfig +import platform +import subprocess + +def generate_ldscript(input, output): + + if not os.path.exists(input): + print('Error: file', input, 'not found') + return + + if os.path.exists(output): + os.remove(output) + + if rtconfig.PLATFORM == 'gcc': + + gcc_cmd = os.path.join(rtconfig.EXEC_PATH, rtconfig.CC) + + # gcc -E -P -x c $input -o $output + if (platform.system() == 'Windows'): + child = subprocess.Popen([gcc_cmd, '-E', '-P', '-x', 'c', input, '-o', output], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) + else: + child = subprocess.Popen(gcc_cmd + f' -E -P -x c {input} -o {output}', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) + + child.communicate() + + print(output, 'is generated from', input) diff --git a/bsp/cvitek/cv18xx_risc-v/link.lds b/bsp/cvitek/cv18xx_risc-v/link.lds index 84581775040..e9810ec78a2 100755 --- a/bsp/cvitek/cv18xx_risc-v/link.lds +++ b/bsp/cvitek/cv18xx_risc-v/link.lds @@ -8,20 +8,13 @@ * 2020/12/12 bernard The first version */ -INCLUDE "link_stacksize.lds" +#include "board/mem_layout.h" OUTPUT_ARCH( "riscv" ) -/* - * Memory layout: - * 0x10200000 - 0x10201000: Bootloader - * 0x10201000 - 0x10A00000: Kernel - * 0x10A00000 - 0x11200000: Heap - */ - MEMORY { - SRAM(wx): ORIGIN = 0x80200000, LENGTH = 32M + SRAM(wx): ORIGIN = KERNEL_START, LENGTH = KERNEL_SIZE } ENTRY(_start) @@ -29,7 +22,6 @@ SECTIONS { . = ORIGIN(SRAM) ; - /* __STACKSIZE__ = 4096; */ __sram_base = ORIGIN(SRAM); __sram_size = LENGTH(SRAM); __sram_end = __sram_base + __sram_size; diff --git a/bsp/cvitek/cv18xx_risc-v/link_smart.lds b/bsp/cvitek/cv18xx_risc-v/link_smart.lds deleted file mode 100644 index 7dc21101f11..00000000000 --- a/bsp/cvitek/cv18xx_risc-v/link_smart.lds +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Copyright (c) 2006-2023, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2020/12/12 bernard The first version - */ - -INCLUDE "link_stacksize.lds" - -OUTPUT_ARCH( "riscv" ) - -/* - * Memory layout: - * 0x10200000 - 0x10201000: Bootloader - * 0x10201000 - 0x10A00000: Kernel - * 0x10A00000 - 0x11200000: Heap - */ - -MEMORY -{ - SRAM(wx): ORIGIN = 0xFFFFFFC000200000, LENGTH = 64M -} - -ENTRY(_start) -SECTIONS -{ - . = ORIGIN(SRAM) ; - - /* __STACKSIZE__ = 4096; */ - __sram_base = ORIGIN(SRAM); - __sram_size = LENGTH(SRAM); - __sram_end = __sram_base + __sram_size; - __text_start = .; - .start : - { - *(.start); - } > SRAM - - . = ALIGN(8); - - .text : - { - *(.text) /* remaining code */ - *(.text.*) /* remaining code */ - *(.rodata) /* read-only data (constants) */ - *(.rodata*) - *(.glue_7) - *(.glue_7t) - *(.gnu.linkonce.t*) - - /* section information for finsh shell */ - . = ALIGN(8); - __fsymtab_start = .; - KEEP(*(FSymTab)) - __fsymtab_end = .; - . = ALIGN(8); - __vsymtab_start = .; - KEEP(*(VSymTab)) - __vsymtab_end = .; - . = ALIGN(8); - - /* section information for initial. */ - . = ALIGN(8); - __rt_init_start = .; - KEEP(*(SORT(.rti_fn*))) - __rt_init_end = .; - . = ALIGN(8); - - __rt_utest_tc_tab_start = .; - KEEP(*(UtestTcTab)) - __rt_utest_tc_tab_end = .; - - . = ALIGN(8); - _etext = .; - } > SRAM - - .eh_frame_hdr : - { - *(.eh_frame_hdr) - *(.eh_frame_entry) - } > SRAM - .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } > SRAM - - . = ALIGN(8); - __text_end = .; - __text_size = __text_end - __text_start; - - .data : - { - *(.data) - *(.data.*) - - *(.data1) - *(.data1.*) - - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - - *(.sdata) - *(.sdata.*) - } > SRAM - - . = ALIGN(8); - .ctors : - { - PROVIDE(__ctors_start__ = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE(__ctors_end__ = .); - } > SRAM - - .dtors : - { - PROVIDE(__dtors_start__ = .); - KEEP(*(SORT(.fini_array.*))) - KEEP(*(.fini_array)) - PROVIDE(__dtors_end__ = .); - } > SRAM - - /* stack for dual core */ - .stack : - { - . = ALIGN(64); - __stack_start__ = .; - - . += __STACKSIZE__; - __stack_cpu0 = .; - - . += __STACKSIZE__; - __stack_cpu1 = .; - } > SRAM - - . = ALIGN(8); - - .osdebug : - { - _osdebug_start = .; - . += 87K; - _osdebug_end = .; - } > SRAM - - . = ALIGN(8); - - .sbss : - { - __bss_start = .; - *(.sbss) - *(.sbss.*) - *(.dynsbss) - *(.scommon) - } > SRAM - - .bss : - { - *(.bss) - *(.bss.*) - *(.dynbss) - *(COMMON) - __bss_end = .; - } > SRAM - - _end = .; - - /* Stabs debugging sections. */ - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - .stab.excl 0 : { *(.stab.excl) } - .stab.exclstr 0 : { *(.stab.exclstr) } - .stab.index 0 : { *(.stab.index) } - .stab.indexstr 0 : { *(.stab.indexstr) } - .comment 0 : { *(.comment) } - /* DWARF debug sections. - * Symbols in the DWARF debugging sections are relative to the beginning - * of the section so we begin them at 0. */ - /* DWARF 1 */ - .debug 0 : { *(.debug) } - .line 0 : { *(.line) } - /* GNU DWARF 1 extensions */ - .debug_srcinfo 0 : { *(.debug_srcinfo) } - .debug_sfnames 0 : { *(.debug_sfnames) } - /* DWARF 1.1 and DWARF 2 */ - .debug_aranges 0 : { *(.debug_aranges) } - .debug_pubnames 0 : { *(.debug_pubnames) } - /* DWARF 2 */ - .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } - .debug_abbrev 0 : { *(.debug_abbrev) } - .debug_line 0 : { *(.debug_line) } - .debug_frame 0 : { *(.debug_frame) } - .debug_str 0 : { *(.debug_str) } - .debug_loc 0 : { *(.debug_loc) } - .debug_macinfo 0 : { *(.debug_macinfo) } - /* SGI/MIPS DWARF 2 extensions */ - .debug_weaknames 0 : { *(.debug_weaknames) } - .debug_funcnames 0 : { *(.debug_funcnames) } - .debug_typenames 0 : { *(.debug_typenames) } - .debug_varnames 0 : { *(.debug_varnames) } -} diff --git a/bsp/cvitek/cv18xx_risc-v/link_stacksize.lds b/bsp/cvitek/cv18xx_risc-v/link_stacksize.lds deleted file mode 100755 index 38d573dcad8..00000000000 --- a/bsp/cvitek/cv18xx_risc-v/link_stacksize.lds +++ /dev/null @@ -1 +0,0 @@ -__STACKSIZE__ = 8192; diff --git a/bsp/cvitek/cv18xx_risc-v/rtconfig.h b/bsp/cvitek/cv18xx_risc-v/rtconfig.h index 41d38bea7a8..de3eba2aa2f 100755 --- a/bsp/cvitek/cv18xx_risc-v/rtconfig.h +++ b/bsp/cvitek/cv18xx_risc-v/rtconfig.h @@ -109,7 +109,6 @@ /* Memory Management */ -#define RT_PAGE_MAX_ORDER 11 #define RT_USING_SLAB #define RT_USING_SLAB_AS_HEAP #define RT_USING_HEAP @@ -119,14 +118,14 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 256 #define RT_CONSOLE_DEVICE_NAME "uart0" -#define RT_VER_NUM 0x50200 +#define RT_VER_NUM 0x50201 #define RT_USING_STDC_ATOMIC #define RT_BACKTRACE_LEVEL_MAX_NR 32 /* end of RT-Thread Kernel */ #define ARCH_CPU_64BIT #define RT_USING_CACHE #define ARCH_MM_MMU -#define KERNEL_VADDR_START 0xFFFFFFC000200000 +#define KERNEL_VADDR_START 0xffffffc000000000 #define ARCH_RISCV #define ARCH_RISCV_FPU #define ARCH_RISCV_FPU_D @@ -348,8 +347,17 @@ #define RT_USING_ADT_HASHMAP #define RT_USING_ADT_REF /* end of Utilities */ + +/* Memory management */ + +#define RT_PAGE_AFFINITY_BLOCK_SIZE 0x1000 +#define RT_PAGE_MAX_ORDER 11 + +/* Debugging */ + +/* end of Debugging */ +/* end of Memory management */ #define RT_USING_LWP -#define LWP_DEBUG #define LWP_USING_RUNTIME #define RT_LWP_MAX_NR 30 #define LWP_TASK_STACK_SIZE 16384 @@ -360,10 +368,6 @@ #define LWP_USING_TERMINAL #define LWP_PTY_MAX_PARIS_LIMIT 64 -/* Memory management */ - -/* end of Memory management */ - /* Using USB legacy version */ /* end of Using USB legacy version */ diff --git a/bsp/cvitek/cv18xx_risc-v/rtconfig.py b/bsp/cvitek/cv18xx_risc-v/rtconfig.py index 91ccaa795b2..18a281e125e 100755 --- a/bsp/cvitek/cv18xx_risc-v/rtconfig.py +++ b/bsp/cvitek/cv18xx_risc-v/rtconfig.py @@ -43,7 +43,7 @@ DEVICE = ' -mcmodel=medany -march=rv64imafdc -mabi=lp64' CFLAGS = DEVICE + ' -Wno-cpp -fvar-tracking -ffreestanding -fno-common -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -D_POSIX_SOURCE ' AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -D__ASSEMBLY__' - LFLAGS = DEVICE + ' -nostartfiles -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,_start -T link.lds' + ' -lsupc++ -lgcc -static' + LFLAGS = DEVICE + ' -nostartfiles -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,_start -T link.lds.generated' + ' -lsupc++ -lgcc -static' CPATH = '' LPATH = ''