From 5aab5811dab20f3caf63438962cc5a174edc4f1b Mon Sep 17 00:00:00 2001 From: zhangzheng <1358745329@qq.com> Date: Sun, 21 Jan 2024 00:11:06 +0800 Subject: [PATCH] =?UTF-8?q?libc=E5=BA=93=E5=A2=9E=E5=8A=A0tiny=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=EF=BC=8C=E6=9C=80=E5=B0=8F=E4=BD=93=E7=A7=AF=E6=9B=B4?= =?UTF-8?q?=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- configs/STM32F103ZET6_defconfig | 2 +- mkrtos_user/lib/mlibc/CMakeLists.txt | 2 + mkrtos_user/lib/mlibc/crt/crt1_tiny.c | 21 +++++++ mkrtos_user/lib/mlibc/crt/start_tiny.S | 61 +++++++++++++++++++ .../mlibc/src/env/__libc_start_main_tiny.c | 50 +++++++++++++++ mkrtos_user/server/fs/cpiofs/heap_stack.c | 2 +- mkrtos_user/server/fs/fatfs/CMakeLists.txt | 8 +-- mkrtos_user/server/hello/CMakeLists.txt | 2 +- mkrtos_user/server/hello/src/main.c | 29 ++++----- mkrtos_user/server/shell/src/heap_stack.c | 2 +- .../server/tinycc-arm-thumb/CMakeLists.txt | 8 +-- setting.cmake | 2 +- 12 files changed, 162 insertions(+), 27 deletions(-) create mode 100644 mkrtos_user/lib/mlibc/crt/crt1_tiny.c create mode 100644 mkrtos_user/lib/mlibc/crt/start_tiny.S create mode 100644 mkrtos_user/lib/mlibc/src/env/__libc_start_main_tiny.c diff --git a/configs/STM32F103ZET6_defconfig b/configs/STM32F103ZET6_defconfig index fe037a192..97a8fe7e8 100644 --- a/configs/STM32F103ZET6_defconfig +++ b/configs/STM32F103ZET6_defconfig @@ -110,4 +110,4 @@ CONFIG_RT_USING_PIN=y CONFIG_CPU_TYPE="stm32f1" CONFIG_RTT_DIR="./" CONFIG_ARCH="cortex-m3" -CONFIG_KNL_EXRAM=y +CONFIG_KNL_EXRAM=n diff --git a/mkrtos_user/lib/mlibc/CMakeLists.txt b/mkrtos_user/lib/mlibc/CMakeLists.txt index 99ac730ed..0062a3887 100644 --- a/mkrtos_user/lib/mlibc/CMakeLists.txt +++ b/mkrtos_user/lib/mlibc/CMakeLists.txt @@ -14,12 +14,14 @@ crt/*.S crt/*.s) list(REMOVE_ITEM deps ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/crt/start_init.S) list(REMOVE_ITEM deps ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/crt/start.S) +list(REMOVE_ITEM deps ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/crt/start_tiny.S) list(REMOVE_ITEM deps ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/ldso/dlstart.c) list(REMOVE_ITEM deps ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/ldso/dynlink.c) list(REMOVE_ITEM deps ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/crt/rcrt1.c) add_library(start_init ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/crt/start_init.S) add_library(start ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/crt/start.S) +add_library(start_tiny ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/crt/start_tiny.S) add_library(muslc ${deps}) target_link_libraries( diff --git a/mkrtos_user/lib/mlibc/crt/crt1_tiny.c b/mkrtos_user/lib/mlibc/crt/crt1_tiny.c new file mode 100644 index 000000000..b47439f14 --- /dev/null +++ b/mkrtos_user/lib/mlibc/crt/crt1_tiny.c @@ -0,0 +1,21 @@ +#include +#include "libc.h" + +#define START "_start" + +// #include "crt_arch.h" + +int main(); +weak void _init(); +weak void _fini(); +int __libc_start_main_tiny(int (*main)(int, char **, char **), int argc, char **argv, + void (*init_dummy)(), void (*fini_dummy)()); +extern void *app_start_addr; +void _start_tiny_init(long *p, void *start_addr) +{ + int argc = p[0]; + char **argv = (void *)(p + 1); + + app_start_addr = start_addr; // ATShining add. + __libc_start_main_tiny(main, argc, argv, _init, _fini); +} diff --git a/mkrtos_user/lib/mlibc/crt/start_tiny.S b/mkrtos_user/lib/mlibc/crt/start_tiny.S new file mode 100644 index 000000000..2ec6ab08f --- /dev/null +++ b/mkrtos_user/lib/mlibc/crt/start_tiny.S @@ -0,0 +1,61 @@ + .syntax unified + .section .first + + .globl reloc + + .align 2 + .globl _start_ + .type _start_, %function +_start_: + /*save r0 */ + mov r12, r0 + b __start + .SPACE 32 - (. - _start_) +_head_start: + .ascii "MKRTOS. " + .word __ram_size__ +heap_offset: .word __heap_start__ - _start_ +stack_offset: .word __stack_start__ - _start_ +heap_size: .word __heap_size__ +stack_size: .word __stack_size__ +data_offset: .word __data_start__ - _start_ + + .word __bss_start__ - _start_ +got_start: .word __got_start__ +got_end: .word __got_end__ +rel_start: .word __rel_start__ +rel_end: .word __rel_end__ +text_start: .word __text_start__ + .SPACE 128 - (. - _start_) + + .align +__start: + + movs r1, #0 + adr r2, _start_ + bic r2, r2, #1 + ldr r0, = __data_start__ + add r0, r0, r2 + ldr r3, = __data_end__ + add r3, r3, r2 + b LoopCopyDataInit +CopyDataInit: + ldr r2, [r0, r1] + str r2, [r9, r1] + adds r1, r1, #4 +LoopCopyDataInit: + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + + mov r0, r9 + adr r1, _start_ + bic r1, r1, #1 + bl _reloc + + @ pop {r0, r12} + mov r0, sp + adr r1, _start_ + bl _start_tiny_init + b . + .end diff --git a/mkrtos_user/lib/mlibc/src/env/__libc_start_main_tiny.c b/mkrtos_user/lib/mlibc/src/env/__libc_start_main_tiny.c new file mode 100644 index 000000000..99872f62f --- /dev/null +++ b/mkrtos_user/lib/mlibc/src/env/__libc_start_main_tiny.c @@ -0,0 +1,50 @@ +#include +#include +#include +#include +#include +#include "libc.h" + +static size_t fake_auxv[20]; +#define AUX_CNT 38 + +int __libc_start_main_tiny(int (*main)(int, char **, char **), int argc, char **argv, + void (*init_dummy)(), void (*fini_dummy)()) +{ + char **envp = argv + argc + 1; + + size_t i, *auxv, aux[AUX_CNT] = {0}; + for (i = 0; envp[i]; i++) + ; + libc.auxv = auxv = (void *)(envp + i + 1); + for (i = 0; auxv[i]; i += 2) + { + if (auxv[i] < AUX_CNT) + { + aux[auxv[i]] = auxv[i + 1]; + } + else if (auxv[i] == 0xfe) + { + extern void u_env_init(void **in_env); + + u_env_init((void *)auxv[i + 1]); + } + } + + libc.page_size = 512; + libc.auxv = fake_auxv; + __init_tls(fake_auxv); + + // _init(); + extern void *app_start_addr; + extern weak hidden void (*const __init_array_start)(void), (*const __init_array_end)(void); + + unsigned long start_addr = ((unsigned long)app_start_addr) & (~3UL); + + uintptr_t a = (uintptr_t)&__init_array_start; + for (; a < (uintptr_t)&__init_array_end; a += sizeof(void (*)())) + { + ((void (*)(void))((uintptr_t)(*((unsigned long *)a)) + start_addr | 0x1UL))(); + } + exit(main(0, NULL, 0)); +} \ No newline at end of file diff --git a/mkrtos_user/server/fs/cpiofs/heap_stack.c b/mkrtos_user/server/fs/cpiofs/heap_stack.c index dcc088c04..c3360ab74 100644 --- a/mkrtos_user/server/fs/cpiofs/heap_stack.c +++ b/mkrtos_user/server/fs/cpiofs/heap_stack.c @@ -1,6 +1,6 @@ #define HEAP_SIZE 512 -#define STACK_SIZE 1024 * 2 +#define STACK_SIZE (2048) #if defined(__CC_ARM) #define HEAP_ATTR SECTION("HEAP") __attribute__((zero_init)) diff --git a/mkrtos_user/server/fs/fatfs/CMakeLists.txt b/mkrtos_user/server/fs/fatfs/CMakeLists.txt index 79688cc5f..c454e1002 100644 --- a/mkrtos_user/server/fs/fatfs/CMakeLists.txt +++ b/mkrtos_user/server/fs/fatfs/CMakeLists.txt @@ -73,10 +73,10 @@ add_custom_target( ${CMAKE_SIZE} fatfs.elf COMMAND mkdir -p ${CMAKE_SOURCE_DIR}/build/output/cpio - COMMAND - cp fatfs.bin ${CMAKE_SOURCE_DIR}/build/output/cpio/fatfs - COMMAND - cp fatfs.elf ${CMAKE_SOURCE_DIR}/build/output/fatfs.elf + # COMMAND + # cp fatfs.bin ${CMAKE_SOURCE_DIR}/build/output/cpio/fatfs + # COMMAND + # cp fatfs.elf ${CMAKE_SOURCE_DIR}/build/output/fatfs.elf ) add_dependencies(fatfs_dump fatfs.elf) diff --git a/mkrtos_user/server/hello/CMakeLists.txt b/mkrtos_user/server/hello/CMakeLists.txt index 67ac35160..9d82b4483 100644 --- a/mkrtos_user/server/hello/CMakeLists.txt +++ b/mkrtos_user/server/hello/CMakeLists.txt @@ -11,7 +11,7 @@ add_executable(hello.elf ) target_link_libraries(hello.elf PUBLIC - start + start_tiny muslc sys sys_util diff --git a/mkrtos_user/server/hello/src/main.c b/mkrtos_user/server/hello/src/main.c index 4c7f91a73..d93f3c714 100644 --- a/mkrtos_user/server/hello/src/main.c +++ b/mkrtos_user/server/hello/src/main.c @@ -1,20 +1,21 @@ -#include - +// #include +#include int main(int argc, char *args[]) { - printf("print test0.\n"); - printf("print test1.\n"); - printf("print test2.\n"); - float a = 1.1; - float b = 1.2; - float c; + cons_write_str("Hello world.\n"); + // printf("print test0.\n"); + // printf("print test1.\n"); + // printf("print test2.\n"); + // float a = 1.1; + // float b = 1.2; + // float c; - while (1) - { - c = a + b; - printf("%c %d %f\n", 'a', 1234, 1.1); - printf("%c %d %lf\n", 'a', 1234, a * b); - } + // while (1) + // { + // c = a + b; + // printf("%c %d %f\n", 'a', 1234, 1.1); + // printf("%c %d %lf\n", 'a', 1234, a * b); + // } return 0; } diff --git a/mkrtos_user/server/shell/src/heap_stack.c b/mkrtos_user/server/shell/src/heap_stack.c index bc3b6f695..a1d6b5c73 100644 --- a/mkrtos_user/server/shell/src/heap_stack.c +++ b/mkrtos_user/server/shell/src/heap_stack.c @@ -1,6 +1,6 @@ #define HEAP_SIZE 2048 -#define STACK_SIZE 2048 +#define STACK_SIZE (1024 + 256) #if defined(__CC_ARM) #define HEAP_ATTR SECTION("HEAP") __attribute__((zero_init)) diff --git a/mkrtos_user/server/tinycc-arm-thumb/CMakeLists.txt b/mkrtos_user/server/tinycc-arm-thumb/CMakeLists.txt index 5e051cd53..b3bf55c7a 100644 --- a/mkrtos_user/server/tinycc-arm-thumb/CMakeLists.txt +++ b/mkrtos_user/server/tinycc-arm-thumb/CMakeLists.txt @@ -91,10 +91,10 @@ add_custom_target( ${CMAKE_SIZE} tcc.elf COMMAND mkdir -p ${CMAKE_SOURCE_DIR}/build/output/cpio - COMMAND - cp tcc.bin ${CMAKE_SOURCE_DIR}/build/output/cpio/tcc - COMMAND - cp tcc.elf ${CMAKE_SOURCE_DIR}/build/output/tcc.elf + # COMMAND + # cp tcc.bin ${CMAKE_SOURCE_DIR}/build/output/cpio/tcc + # COMMAND + # cp tcc.elf ${CMAKE_SOURCE_DIR}/build/output/tcc.elf ) add_dependencies(tcc_dump tcc.elf) diff --git a/setting.cmake b/setting.cmake index a177dc4c9..0746e96ef 100755 --- a/setting.cmake +++ b/setting.cmake @@ -34,7 +34,7 @@ endif() # -mfloat-abi=soft -u _printf_float -set(CMAKE_C_FLAGS "-mcpu=${CONFIG_ARCH} -O0 -g3 -lc -lrdimon -mfloat-abi=${FLOAT_TYPE} -u _printf_float -D=MKRTOS \ +set(CMAKE_C_FLAGS "-mcpu=${CONFIG_ARCH} -Os -g3 -lc -lrdimon -mfloat-abi=${FLOAT_TYPE} -u _printf_float -D=MKRTOS \ -std=gnu11 -ffunction-sections -fdata-sections -fno-builtin \ -nostartfiles -nodefaultlibs -nostdlib -nostdinc -Xlinker \ -fno-stack-protector -Wl,--gc-sections \