From 6ee0deb01065cfc62856fd60d522806f95ac20a0 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 22 Aug 2023 00:26:34 +0800 Subject: [PATCH] support application. --- .vscode/launch.json | 2 +- .vscode/settings.json | 5 +- mkrtos_knl/CMakeLists.txt | 17 ++++-- mkrtos_knl/arch/armv7m/CMakeLists.txt | 2 +- mkrtos_knl/arch/armv7m/arch.c | 3 +- mkrtos_knl/arch/armv7m/thread_m.S | 4 +- mkrtos_knl/drivers/CMakeLists.txt | 2 +- mkrtos_knl/drivers/uart/stm32f2_uart.c | 11 ++-- mkrtos_knl/inc/knl/app.h | 31 ++++++++++ mkrtos_knl/inc/knl/config.h | 2 +- mkrtos_knl/inc/knl/globals.h | 1 + mkrtos_knl/inc/knl/init.h | 23 ++++--- mkrtos_knl/inc/knl/mm_wrap.h | 2 + mkrtos_knl/inc/knl/obj_space.h | 2 + mkrtos_knl/inc/knl/prot.h | 2 + mkrtos_knl/inc/knl/scheduler.h | 4 +- mkrtos_knl/inc/knl/syscall.h | 6 +- mkrtos_knl/inc/knl/task.h | 1 + mkrtos_knl/inc/knl/thread_armv7m.h | 3 + mkrtos_knl/inc/knl/util.h | 2 + mkrtos_knl/knl/CMakeLists.txt | 2 +- mkrtos_knl/knl/app.c | 7 +++ mkrtos_knl/knl/factory.c | 10 +-- mkrtos_knl/knl/globals.c | 12 +++- mkrtos_knl/knl/init.c | 2 +- mkrtos_knl/knl/ipc.c | 3 +- mkrtos_knl/knl/log.c | 9 ++- mkrtos_knl/knl/mm_wrap.c | 22 +++++++ mkrtos_knl/knl/scheduler.c | 30 +++++++-- mkrtos_knl/knl/syscall.c | 34 +++++++++++ mkrtos_knl/knl/task.c | 5 +- mkrtos_knl/knl/thread.c | 9 +-- mkrtos_knl/knl/thread_armv7m.c | 20 ++++-- mkrtos_knl/knl/thread_knl.c | 61 +++++++++++++++++-- mkrtos_knl/lib/CMakeLists.txt | 2 +- mkrtos_knl/lib/xprintf.c | 5 +- mkrtos_knl/stm32f205rft6_link.lds | 2 +- mkrtos_knl/stm32f205rft6_link.lds.S | 2 +- mkrtos_user/CMakeLists.txt | 1 + mkrtos_user/lib/dietlibc/CMakeLists.txt | 39 +++++++----- mkrtos_user/lib/dietlibc/src/CMakeLists.txt | 2 +- mkrtos_user/lib/dietlibc/src/__main.c | 2 +- .../src/dietlibc-0.34/arm/__testandset.S | 3 + mkrtos_user/lib/dietlibc/src/dummy.c | 0 mkrtos_user/lib/dietlibc/src/reloc.c | 2 +- mkrtos_user/lib/dietlibc/src/start.S | 9 +-- mkrtos_user/lib/sys/CMakeLists.txt | 31 ++++++++++ mkrtos_user/lib/sys/inc/u_prot.h | 3 + mkrtos_user/lib/sys/src/u_factory.c | 2 + mkrtos_user/lib/sys/src/u_log.c | 2 + mkrtos_user/server/CMakeLists.txt | 8 ++- mkrtos_user/server/init/CMakeLists.txt | 1 + mkrtos_user/server/init/src/heap_stack.c | 17 ++++++ mkrtos_user/server/init/src/main.c | 20 ++++++ mkrtos_user/server/init/src/syscall.S | 19 ++++++ setting.cmake | 15 +++-- 56 files changed, 440 insertions(+), 98 deletions(-) create mode 100644 mkrtos_knl/inc/knl/app.h create mode 100644 mkrtos_knl/inc/knl/thread_armv7m.h create mode 100644 mkrtos_knl/knl/app.c create mode 100644 mkrtos_knl/knl/syscall.c create mode 100644 mkrtos_user/lib/dietlibc/src/dummy.c create mode 100644 mkrtos_user/lib/sys/CMakeLists.txt create mode 100644 mkrtos_user/lib/sys/inc/u_prot.h create mode 100644 mkrtos_user/lib/sys/src/u_factory.c create mode 100644 mkrtos_user/server/init/src/heap_stack.c create mode 100644 mkrtos_user/server/init/src/syscall.S diff --git a/.vscode/launch.json b/.vscode/launch.json index f47e91dee..8d541bba5 100755 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -10,7 +10,7 @@ "cwd": "${fileDirname}", "environment": [], "externalConsole": false, - "miDebuggerPath": "/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gdb", + "miDebuggerPath": "/home/zhangzheng/gcc-arm-none-eabi-4_9-2014q4/bin/arm-none-eabi-gdb", "miDebuggerServerAddress": "127.0.0.1:3333", "MIMode": "gdb", "setupCommands": [ diff --git a/.vscode/settings.json b/.vscode/settings.json index a16ebbb62..0e36fecac 100755 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -96,7 +96,10 @@ "ratio": "c", "log.h": "c", "syscall.h": "c", - "scheduler.h": "c" + "scheduler.h": "c", + "thread_armv7m.h": "c", + "printk.h": "c", + "obj_space.h": "c" }, "cortex-debug.showRTOS": false, "editor.formatOnSave": true diff --git a/mkrtos_knl/CMakeLists.txt b/mkrtos_knl/CMakeLists.txt index 9f1dd6354..058b5be79 100755 --- a/mkrtos_knl/CMakeLists.txt +++ b/mkrtos_knl/CMakeLists.txt @@ -4,12 +4,14 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \ -Werror \ -D__MPU_PRESENT=1 -DUSE_STDPERIPH_DRIVER=1 \ -DKNL_OFFSET=$ENV{KEN_OFFSET} \ +-DKNL_TEXT=$ENV{KNL_TEXT} \ +-DINIT_OFFSET=$ENV{INIT_OFFSET} \ -DSMP=1 \ -Wno-unused-parameter \ -Wno-unused-function \ -Wno-unused-variable \ ") - +set(CMAKE_ASM_FLAGS ${CMAKE_C_FLAGS}) message(编译参数:${CMAKE_C_FLAGS}) add_subdirectory(arch) add_subdirectory(drivers) @@ -23,11 +25,16 @@ add_executable(mkrtos.elf target_link_libraries( mkrtos.elf PUBLIC - $ - $ - $ - $ + knl + arch + drv + lib ) +add_dependencies(mkrtos.elf arch) +add_dependencies(mkrtos.elf drv) +add_dependencies(mkrtos.elf knl) +add_dependencies(mkrtos.elf lib) + set_target_properties(mkrtos.elf PROPERTIES LINK_FLAGS "-T ${CMAKE_CURRENT_SOURCE_DIR}/stm32f205rft6_link.lds -z max-page-size=0x1000") diff --git a/mkrtos_knl/arch/armv7m/CMakeLists.txt b/mkrtos_knl/arch/armv7m/CMakeLists.txt index df6d15d98..64291bcc7 100755 --- a/mkrtos_knl/arch/armv7m/CMakeLists.txt +++ b/mkrtos_knl/arch/armv7m/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.13) file(GLOB_RECURSE deps *.c *.S) -add_library(arch OBJECT ${deps}) +add_library(arch STATIC ${deps}) target_include_directories( arch PUBLIC diff --git a/mkrtos_knl/arch/armv7m/arch.c b/mkrtos_knl/arch/armv7m/arch.c index ca28cbcb7..8e394c8b9 100644 --- a/mkrtos_knl/arch/armv7m/arch.c +++ b/mkrtos_knl/arch/armv7m/arch.c @@ -38,7 +38,8 @@ void sys_startup(void) // 初始化systick时钟 SysTick_Config(SystemCoreClock / SYS_SCHE_HZ); } -INIT_LOW_HARD void arch_init(void) +void arch_init(void) { SystemInit(); } +INIT_LOW_HARD(arch_init); diff --git a/mkrtos_knl/arch/armv7m/thread_m.S b/mkrtos_knl/arch/armv7m/thread_m.S index 90f782f80..28e64361a 100755 --- a/mkrtos_knl/arch/armv7m/thread_m.S +++ b/mkrtos_knl/arch/armv7m/thread_m.S @@ -2,7 +2,7 @@ .cpu cortex-m3 .thumb - +.global syscall_handler_get /** * @brief syscall结束时到这儿 */ @@ -75,7 +75,7 @@ SYS_CALL: mov r1, r7 //获得需要调用的syscall函数的地址 push {r0-r2,lr} - blx get_syscall_handler + blx syscall_handler_get mov r3,r0 pop {r0-r2,lr} diff --git a/mkrtos_knl/drivers/CMakeLists.txt b/mkrtos_knl/drivers/CMakeLists.txt index 892773301..be60382eb 100755 --- a/mkrtos_knl/drivers/CMakeLists.txt +++ b/mkrtos_knl/drivers/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.13) file(GLOB_RECURSE deps *.c *.S) -add_library(drv OBJECT ${deps}) +add_library(drv STATIC ${deps}) target_include_directories( drv PUBLIC diff --git a/mkrtos_knl/drivers/uart/stm32f2_uart.c b/mkrtos_knl/drivers/uart/stm32f2_uart.c index 09ebbb693..e4dd80eaf 100755 --- a/mkrtos_knl/drivers/uart/stm32f2_uart.c +++ b/mkrtos_knl/drivers/uart/stm32f2_uart.c @@ -122,12 +122,13 @@ static void uart_hardware_flow_rts(USART_TypeDef *USARTx, uint16_t flow) /* Write to USART CR3 */ USARTx->CR3 = (uint16_t)tmpreg; } -static uart_t uart; +static uart_t uart = { + .baud = 115200}; uart_t *uart_get_global(void) { return &uart; } -INIT_HIGH_HAD void uart_init(uart_t *uart) +void uart_init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; @@ -158,7 +159,7 @@ INIT_HIGH_HAD void uart_init(uart_t *uart) GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); - USART_InitStructure.USART_BaudRate = uart->baud; + USART_InitStructure.USART_BaudRate = uart.baud; USART_InitStructure.USART_WordLength = USART_WordLength_8b /*TODO:*/; USART_InitStructure.USART_StopBits = USART_StopBits_1 /*TODO:*/; USART_InitStructure.USART_Parity = USART_Parity_No /*TODO:*/; @@ -167,9 +168,9 @@ INIT_HIGH_HAD void uart_init(uart_t *uart) USART_Init(USART1, &USART_InitStructure); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); USART_Cmd(USART1, ENABLE); - - // reg_isr_func(USART1_IRQHandler, USART1_IRQn + 1, 0); } +INIT_HIGH_HAD(uart_init); + void uart_set(uart_t *uart) { uart_set_baud(USART1, uart->baud); diff --git a/mkrtos_knl/inc/knl/app.h b/mkrtos_knl/inc/knl/app.h new file mode 100644 index 000000000..6e40528df --- /dev/null +++ b/mkrtos_knl/inc/knl/app.h @@ -0,0 +1,31 @@ +#pragma once + +#include "types.h" + +typedef struct app_info +{ + const char d[32]; + const char magic[8]; + union + { + struct exec_head_info + { + umword_t ram_size; + umword_t heap_offset; + umword_t stack_offset; + umword_t heap_size; + umword_t stack_size; + umword_t data_offset; + umword_t bss_offset; + umword_t got_start; + umword_t got_end; + umword_t rel_start; + umword_t rel_end; + umword_t text_start; + } i; + const char d1[128]; + }; + const char dot_text[]; +} app_info_t; + +app_info_t *app_info_get(void *addr); \ No newline at end of file diff --git a/mkrtos_knl/inc/knl/config.h b/mkrtos_knl/inc/knl/config.h index 18aa92a50..cd09ea97c 100644 --- a/mkrtos_knl/inc/knl/config.h +++ b/mkrtos_knl/inc/knl/config.h @@ -1,3 +1,3 @@ #pragma once -#define SYS_SCHE_HZ 1000 //!< 系统调度频率 +#define SYS_SCHE_HZ 100 //!< 系统调度频率 diff --git a/mkrtos_knl/inc/knl/globals.h b/mkrtos_knl/inc/knl/globals.h index 222141cff..832f3e36a 100755 --- a/mkrtos_knl/inc/knl/globals.h +++ b/mkrtos_knl/inc/knl/globals.h @@ -14,3 +14,4 @@ mem_t *mm_get_global(void); void global_reg_kobj(kobject_t *kobj, int inx); +kobject_t *global_get_kobj(int inx); diff --git a/mkrtos_knl/inc/knl/init.h b/mkrtos_knl/inc/knl/init.h index 888b02ce7..97a16d750 100755 --- a/mkrtos_knl/inc/knl/init.h +++ b/mkrtos_knl/inc/knl/init.h @@ -1,11 +1,20 @@ #pragma once +typedef void (*init_func)(void); + void sys_call_init(void); -#define INIT_LOW_HARD __attribute__((constructor(101))) -#define INIT_HIGH_HAD __attribute__((constructor(102))) -#define INIT_MEM __attribute__((constructor(103))) -#define INIT_KOBJ_MEM __attribute__((constructor(104))) -#define INIT_KOBJ __attribute__((constructor(105))) -#define INIT_STAGE1 __attribute__((constructor(106))) -#define INIT_STAGE2 __attribute__((constructor(107))) +#define INIT_LOW_HARD(f) __attribute__((__section__(".init_array." \ + "102"))) init_func init_##f = f +#define INIT_HIGH_HAD(f) __attribute__((__section__(".init_array." \ + "103"))) init_func init_##f = f +#define INIT_MEM(f) __attribute__((__section__(".init_array." \ + "104"))) init_func init_##f = f +#define INIT_KOBJ_MEM(f) __attribute__((__section__(".init_array." \ + "105"))) init_func init_##f = f +#define INIT_KOBJ(f) __attribute__((__section__(".init_array." \ + "106"))) init_func init_##f = f +#define INIT_STAGE1(f) __attribute__((__section__(".init_array." \ + "107"))) init_func init_##f = f +#define INIT_STAGE2(f) __attribute__((__section__(".init_array." \ + "108"))) init_func init_##f = f diff --git a/mkrtos_knl/inc/knl/mm_wrap.h b/mkrtos_knl/inc/knl/mm_wrap.h index a9168ed26..330a288de 100755 --- a/mkrtos_knl/inc/knl/mm_wrap.h +++ b/mkrtos_knl/inc/knl/mm_wrap.h @@ -4,3 +4,5 @@ void *mm_limit_alloc(ram_limit_t *limit, size_t size); void mm_limit_free(ram_limit_t *limit, void *mem); +void *mm_limit_alloc_align(ram_limit_t *limit, size_t size, size_t align); +void mm_limit_free_align(ram_limit_t *limit, void *mem, size_t size); diff --git a/mkrtos_knl/inc/knl/obj_space.h b/mkrtos_knl/inc/knl/obj_space.h index 01dc0c45c..a4ae06e17 100755 --- a/mkrtos_knl/inc/knl/obj_space.h +++ b/mkrtos_knl/inc/knl/obj_space.h @@ -25,6 +25,8 @@ typedef struct obj_map_entry slist_head_t node; } obj_map_entry_t; +#define obj_map_kobj_get(kobj) ((kobject_t *)((((umword_t)(kobj)) >> 2) << 2)) + static inline void obj_map_entry_init(obj_map_entry_t *entry, kobject_t *obj) { slist_init(&entry->node); diff --git a/mkrtos_knl/inc/knl/prot.h b/mkrtos_knl/inc/knl/prot.h index 0be86d9d2..a0840daf2 100755 --- a/mkrtos_knl/inc/knl/prot.h +++ b/mkrtos_knl/inc/knl/prot.h @@ -17,7 +17,9 @@ #define LOG_PROT 4 #define IPC_PROT 5 +#define FACTORY_PORT_START FACTORY_PROT #define FACTORY_FUNC_MAX (IPC_PROT + 1) +#define FACTORY_PORT_END FACTORY_FUNC_MAX typedef union msg_tag { diff --git a/mkrtos_knl/inc/knl/scheduler.h b/mkrtos_knl/inc/knl/scheduler.h index e0e577bcb..a0ac1d783 100755 --- a/mkrtos_knl/inc/knl/scheduler.h +++ b/mkrtos_knl/inc/knl/scheduler.h @@ -33,6 +33,6 @@ typedef struct scheduler scheduler_t *scheduler_get_current(void); void scheduler_init(void); -sched_t *scheduler_next(sched_t *cur); -void scheduler_add(scheduler_t *sched, sched_t *node); +sched_t *scheduler_next(void); +void scheduler_add(sched_t *node); void scheduler_del(sched_t *node); diff --git a/mkrtos_knl/inc/knl/syscall.h b/mkrtos_knl/inc/knl/syscall.h index d4a39999e..9293a1b6d 100755 --- a/mkrtos_knl/inc/knl/syscall.h +++ b/mkrtos_knl/inc/knl/syscall.h @@ -1,7 +1,11 @@ #pragma once #include "types.h" + typedef struct entry_frame { - mword_t r[6]; + mword_t r[8]; } entry_frame_t; + +typedef int (*syscall_entry_func)(entry_frame_t entry); +int syscall_entry(entry_frame_t entry); diff --git a/mkrtos_knl/inc/knl/task.h b/mkrtos_knl/inc/knl/task.h index d5cccc387..d6c0bcff8 100755 --- a/mkrtos_knl/inc/knl/task.h +++ b/mkrtos_knl/inc/knl/task.h @@ -15,3 +15,4 @@ typedef struct task task_t *thread_get_current_task(void); void task_init(task_t *task, ram_limit_t *ram); +task_t *task_create(ram_limit_t *lim); diff --git a/mkrtos_knl/inc/knl/thread_armv7m.h b/mkrtos_knl/inc/knl/thread_armv7m.h new file mode 100644 index 000000000..9917250b7 --- /dev/null +++ b/mkrtos_knl/inc/knl/thread_armv7m.h @@ -0,0 +1,3 @@ +#pragma once + +void thread_user_pf_set(thread_t *cur_th, void *pc, void *user_sp, void *ram); \ No newline at end of file diff --git a/mkrtos_knl/inc/knl/util.h b/mkrtos_knl/inc/knl/util.h index 166d382ae..3f93d6749 100755 --- a/mkrtos_knl/inc/knl/util.h +++ b/mkrtos_knl/inc/knl/util.h @@ -25,3 +25,5 @@ #define container_of(ptr, type, member) \ ((type *)(((umword_t)(ptr)) - ((umword_t)(&(((type *)0)->member))))) + +#define USED __attribute__((used)) diff --git a/mkrtos_knl/knl/CMakeLists.txt b/mkrtos_knl/knl/CMakeLists.txt index 07b26deda..c83db9a37 100755 --- a/mkrtos_knl/knl/CMakeLists.txt +++ b/mkrtos_knl/knl/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.13) file(GLOB_RECURSE deps *.c *.S) -add_library(knl OBJECT ${deps}) +add_library(knl STATIC ${deps}) target_include_directories( knl PUBLIC diff --git a/mkrtos_knl/knl/app.c b/mkrtos_knl/knl/app.c new file mode 100644 index 000000000..d6b6b0abf --- /dev/null +++ b/mkrtos_knl/knl/app.c @@ -0,0 +1,7 @@ +#include "types.h" +#include "app.h" + +app_info_t *app_info_get(void *addr) +{ + return (app_info_t *)addr; +} diff --git a/mkrtos_knl/knl/factory.c b/mkrtos_knl/knl/factory.c index d6bace1b3..4d46b6760 100755 --- a/mkrtos_knl/knl/factory.c +++ b/mkrtos_knl/knl/factory.c @@ -22,11 +22,11 @@ static factory_func factory_func_list[FACTORY_FUNC_MAX]; * @brief 在系统初始化时调用 * */ -INIT_KOBJ_MEM void factory_mem_init(void) +void factory_mem_init(void) { // Nothing. } - +INIT_KOBJ_MEM(factory_mem_init); void factory_register(factory_func func, int inx) { assert(inx >= 0); @@ -135,11 +135,12 @@ static kobject_t *factory_create_func(ram_limit_t *lim, umword_t arg0, umword_t return &kobj->kobj; } -INIT_KOBJ static void root_factory_init(void) +static void root_factory_init(void) { factory_init(&root_factory, 0); global_reg_kobj(&root_factory.kobj, FACTORY_PROT); } +INIT_KOBJ(root_factory_init); factory_t *root_factory_get(void) { return &root_factory; @@ -148,7 +149,8 @@ factory_t *root_factory_get(void) * @brief 工厂注册函数 * */ -INIT_KOBJ static void factory_factory_register(void) +static void factory_factory_register(void) { factory_register(factory_create_func, FACTORY_PROT); } +INIT_KOBJ(factory_factory_register); diff --git a/mkrtos_knl/knl/globals.c b/mkrtos_knl/knl/globals.c index acd37983e..af4295959 100755 --- a/mkrtos_knl/knl/globals.c +++ b/mkrtos_knl/knl/globals.c @@ -23,14 +23,22 @@ void global_reg_kobj(kobject_t *kobj, int inx) assert(inx < FACTORY_FUNC_MAX); kobj_ls[inx - 1] = kobj; } +kobject_t *global_get_kobj(int inx) +{ + assert(inx >= 0); + assert(inx < FACTORY_FUNC_MAX); + return kobj_ls[inx - 1]; +} mem_t *mm_get_global(void) { return &global_mem; } - -INIT_MEM static void mem_sys_init(umword_t st_addr, size_t size) +extern void log_dump(void); +static void mem_sys_init(void) { + log_dump(); mem_init(&global_mem); mem_heap_add(mm_get_global(), mem_block, sizeof(mem_block)); } +INIT_MEM(mem_sys_init); diff --git a/mkrtos_knl/knl/init.c b/mkrtos_knl/knl/init.c index 503453a0a..cba8b0698 100755 --- a/mkrtos_knl/knl/init.c +++ b/mkrtos_knl/knl/init.c @@ -9,5 +9,5 @@ void sys_call_init(void) uintptr_t a = (uintptr_t)&__init_array_start; for (; a < (uintptr_t)&__init_array_end; a += sizeof(void (*)())) - (*(void (**)(void))a)(); + ((init_func)(*(uintptr_t *)a))(); } diff --git a/mkrtos_knl/knl/ipc.c b/mkrtos_knl/knl/ipc.c index fbf0bd549..509f263a9 100755 --- a/mkrtos_knl/knl/ipc.c +++ b/mkrtos_knl/knl/ipc.c @@ -143,7 +143,8 @@ static kobject_t *ipc_create_func(ram_limit_t *lim, umword_t arg0, umword_t arg1 * @brief 工厂注册函数 * */ -INIT_KOBJ static void ipc_factory_register(void) +static void ipc_factory_register(void) { factory_register(ipc_create_func, IPC_PROT); } +INIT_KOBJ(ipc_factory_register); diff --git a/mkrtos_knl/knl/log.c b/mkrtos_knl/knl/log.c index d641191a6..618bb9af2 100755 --- a/mkrtos_knl/knl/log.c +++ b/mkrtos_knl/knl/log.c @@ -10,8 +10,8 @@ #include "log.h" #include "factory.h" #include "kobject.h" -#include "init.h" #include "globals.h" +#include "init.h" #include "printk.h" static log_t log; @@ -24,12 +24,13 @@ enum log_op static msg_tag_t log_syscall(kobject_t *kobj, ram_limit_t *ram, entry_frame_t *f); -INIT_KOBJ static void log_reg(void) +static void log_reg(void) { kobject_init(&log.kobj); log.kobj.invoke_func = log_syscall; global_reg_kobj(&log.kobj, LOG_PROT); } +INIT_KOBJ(log_reg); static msg_tag_t log_write_data(log_t *log, const char *data, int len) { for (int i = 0; i < len; i++) @@ -64,4 +65,8 @@ log_syscall(kobject_t *kobj, ram_limit_t *ram, entry_frame_t *f) } return tag; +} + +void log_dump(void) +{ } \ No newline at end of file diff --git a/mkrtos_knl/knl/mm_wrap.c b/mkrtos_knl/knl/mm_wrap.c index 85470f5c5..588c1fad4 100755 --- a/mkrtos_knl/knl/mm_wrap.c +++ b/mkrtos_knl/knl/mm_wrap.c @@ -28,3 +28,25 @@ void mm_limit_free(ram_limit_t *limit, void *mem) mem_free(mm_get_global(), (char *)mem - sizeof(size_t)); ram_limit_free(limit, size); } +void *mm_limit_alloc_align(ram_limit_t *limit, size_t size, size_t align) +{ + if (ram_limit_alloc(limit, size) == FALSE) + { + return NULL; + } + void *new_mem = mem_alloc_align(mm_get_global(), size + sizeof(size_t), align); + + if (!new_mem) + { + ram_limit_free(limit, size); + return NULL; + } + + return (char *)new_mem; +} +void mm_limit_free_align(ram_limit_t *limit, void *mem, size_t size) +{ + + mem_free_align(mm_get_global(), (char *)mem - sizeof(size_t)); + ram_limit_free(limit, size); +} \ No newline at end of file diff --git a/mkrtos_knl/knl/scheduler.c b/mkrtos_knl/knl/scheduler.c index 15f69119d..ea34e03df 100755 --- a/mkrtos_knl/knl/scheduler.c +++ b/mkrtos_knl/knl/scheduler.c @@ -18,39 +18,59 @@ scheduler_t *scheduler_get_current(void) return &scheduler; } -INIT_HIGH_HAD void scheduler_init(void) +void scheduler_init(void) { for (int i = 0; i < PRIO_MAX; i++) { slist_init(&scheduler.prio_list[i]); } } -void scheduler_add(scheduler_t *sched, sched_t *node) +INIT_HIGH_HAD(scheduler_init); +void scheduler_add(sched_t *node) { + scheduler_t *sched = scheduler_get_current(); assert(node->prio >= 0); assert(node->prio < PRIO_MAX); + if (node->prio != sched->max_prio) + { + sched->max_prio = node->prio; + } + slist_add(&sched->prio_list[node->prio], &node->node); } void scheduler_del(sched_t *node) { + scheduler_t *sched = scheduler_get_current(); assert(node->prio >= 0); assert(node->prio < PRIO_MAX); slist_del(&node->node); + if (slist_is_empty(&sched->prio_list[node->prio])) + { + /*TODO:更新最大优先级,这里可以用位图优化*/ + for (mword_t i = node->prio - 1; i >= 0; i--) + { + if (slist_is_empty(&sched->prio_list[i])) + { + sched->max_prio = i; + break; + } + } + } } -sched_t *scheduler_next(sched_t *cur) +sched_t *scheduler_next(void) { scheduler_t *sche = scheduler_get_current(); sched_t *next_sch = NULL; slist_head_t *next = NULL; - if (cur == NULL) + if (sche->cur_sche == NULL) { next = slist_first(&sche->prio_list[sche->max_prio]); } else { - next = cur->node.next; + next = sche->cur_sche->node.next; if (next == &sche->prio_list[sche->max_prio]) { next = slist_first(&sche->prio_list[sche->max_prio]); diff --git a/mkrtos_knl/knl/syscall.c b/mkrtos_knl/knl/syscall.c new file mode 100644 index 000000000..d99df817c --- /dev/null +++ b/mkrtos_knl/knl/syscall.c @@ -0,0 +1,34 @@ +#include "types.h" +#include "syscall.h" +#include "thread.h" +#include "task.h" +#include "obj_space.h" +#include "err.h" +int syscall_entry(entry_frame_t entry) +{ + msg_tag_t tag = msg_tag_init3(0, 0, -1); + thread_t *th = thread_get_current(); + task_t *tk = thread_get_current_task(); + + obj_map_entry_t *entry_obj = + obj_space_lookup(&tk->obj_space, entry.r[7]); + + if (!entry_obj) + { + tag = msg_tag_init3(0, 0, -ENOENT); + return tag.raw; + } + if (!entry_obj->kobj.obj) + { + tag = msg_tag_init3(0, 0, -ENOENT); + return tag.raw; + } + kobject_t *kobj = obj_map_kobj_get(entry_obj->kobj.obj); + + if (kobj->invoke_func) + { + kobj->invoke_func(kobj, NULL, &entry); + } + + return tag.raw; +} diff --git a/mkrtos_knl/knl/task.c b/mkrtos_knl/knl/task.c index 1db9aefcb..4774e016e 100755 --- a/mkrtos_knl/knl/task.c +++ b/mkrtos_knl/knl/task.c @@ -39,7 +39,7 @@ void task_init(task_t *task, ram_limit_t *ram) obj_space_init(&task->obj_space, ram); } -static task_t *task_create(ram_limit_t *lim) +task_t *task_create(ram_limit_t *lim) { task_t *tk = mm_limit_alloc(lim, sizeof(task_t)); @@ -74,7 +74,8 @@ static kobject_t *task_create_func(ram_limit_t *lim, umword_t arg0, umword_t arg * @brief 工厂注册函数 TODO: * */ -INIT_KOBJ void task_factory_register(void) +void task_factory_register(void) { factory_register(task_create_func, TASK_PROT); } +INIT_KOBJ(task_factory_register); diff --git a/mkrtos_knl/knl/thread.c b/mkrtos_knl/knl/thread.c index c20e6d499..ce4899dab 100755 --- a/mkrtos_knl/knl/thread.c +++ b/mkrtos_knl/knl/thread.c @@ -71,7 +71,7 @@ void thread_suspend(thread_t *th) */ void thread_sched(void) { - sched_t *next_sche = scheduler_next(NULL); + sched_t *next_sche = scheduler_next(); if (next_sche == &thread_get_current()->sche) { @@ -87,7 +87,7 @@ void thread_sched(void) void thread_ready(thread_t *th, bool_t is_sche) { assert(!slist_in_list(&th->sche.node)); - scheduler_add(scheduler_get_current(), &th->sche); + scheduler_add(&th->sche); th->status = THREAD_READY; if (is_sche) { @@ -102,7 +102,7 @@ void thread_ready(thread_t *th, bool_t is_sche) */ thread_t *thread_create(ram_limit_t *ram) { - thread_t *th = mm_limit_alloc(ram, THREAD_BLOCK_SIZE); + thread_t *th = mm_limit_alloc_align(ram, THREAD_BLOCK_SIZE, THREAD_BLOCK_SIZE); if (!th) { @@ -138,10 +138,11 @@ static kobject_t *thread_create_func(ram_limit_t *lim, umword_t arg0, umword_t a * @brief 工厂注册函数 * */ -INIT_KOBJ void thread_factory_register(void) +void thread_factory_register(void) { factory_register(thread_create_func, THREAD_PROT); } +INIT_KOBJ(thread_factory_register); /** * @brief 获取当前的task * diff --git a/mkrtos_knl/knl/thread_armv7m.c b/mkrtos_knl/knl/thread_armv7m.c index 4a182a98a..b110b2c71 100644 --- a/mkrtos_knl/knl/thread_armv7m.c +++ b/mkrtos_knl/knl/thread_armv7m.c @@ -10,9 +10,14 @@ #include "types.h" #include "thread.h" #include "printk.h" +#include "thread_armv7m.h" +#include "app.h" +#include "mm_wrap.h" +#include "arch.h" -void get_syscall_handler(void) +syscall_entry_func syscall_handler_get(void) { + return syscall_entry; } void thread_exit(void) { @@ -20,13 +25,18 @@ void thread_exit(void) /*TODO:删除这个线程*/ } -void thread_to_user(void) +void thread_user_pf_set(thread_t *cur_th, void *pc, void *user_sp, void *ram) { - pf_t *cur_pf = thread_get_current_pf(); + pf_t *cur_pf = (pf_t *)user_sp - 1; // thread_get_pf(cur_th); cur_pf->xpsr = 0x01000000L; cur_pf->lr = (umword_t)thread_exit; //!< 线程退出时调用的函数 + cur_pf->pc = (umword_t)pc | 0x1; + cur_pf->rg1[5] = (umword_t)ram; - arch_set_user_sp((umword_t)cur_pf); - thread_ready(thread_get_current(), TRUE); + cur_th->sp.knl_sp = (char *)cur_th + THREAD_BLOCK_SIZE; + cur_th->sp.user_sp = cur_pf; + cur_th->sp.sp_type = 1; + // arch_set_user_sp((umword_t)cur_pf); + // thread_ready(thread_get_current(), TRUE); } diff --git a/mkrtos_knl/knl/thread_knl.c b/mkrtos_knl/knl/thread_knl.c index b7397cf52..55e5aa359 100755 --- a/mkrtos_knl/knl/thread_knl.c +++ b/mkrtos_knl/knl/thread_knl.c @@ -15,7 +15,10 @@ #include "factory.h" #include "globals.h" #include "arch.h" - +#include "map.h" +#include "app.h" +#include "mm_wrap.h" +#include "thread_armv7m.h" static thread_t *knl_thread; static task_t knl_task; @@ -23,7 +26,7 @@ static task_t knl_task; * 初始化内核线程 * 初始化内核任务 */ -INIT_STAGE1 static void knl_init_1(void) +static void knl_init_1(void) { thread_t *cur_th = thread_get_current(); @@ -31,17 +34,67 @@ INIT_STAGE1 static void knl_init_1(void) task_init(&knl_task, &root_factory_get()->limit); thread_bind(cur_th, &knl_task.kobj); + thread_ready(cur_th, FALSE); } +INIT_STAGE1(knl_init_1); /** * 初始化init线程 * 初始化用户态任务 * 映射静态内核对象 * 运行init进程 */ -INIT_STAGE2 static void knl_init_2(void) +static void knl_init_2(void) { thread_t *init_thread = thread_create(&root_factory_get()->limit); assert(init_thread); + task_t *init_task = task_create(&root_factory_get()->limit); + assert(init_task); + + app_info_t *app = app_info_get((void *)(KNL_TEXT + INIT_OFFSET)); + void *ram = mm_limit_alloc_align(&root_factory_get()->limit, app->i.ram_size, 8); + + if (!ram) + { + printk("申请init进程内存失败.\n"); + assert(ram); + } + void *sp_addr = (char *)ram + app->i.stack_offset - app->i.data_offset; + void *sp_addr_top = (char *)sp_addr + app->i.stack_size; + + thread_bind(init_thread, &init_task->kobj); + // thread_set_exc_regs(init_thread, KNL_TEXT + INIT_OFFSET); + thread_user_pf_set(init_thread, (void *)(KNL_TEXT + INIT_OFFSET), sp_addr_top, ram); + assert(obj_map_root(&init_thread->kobj, &init_task->obj_space, &root_factory_get()->limit, THREAD_PROT)); + assert(obj_map_root(&init_task->kobj, &init_task->obj_space, &root_factory_get()->limit, TASK_PROT)); + for (int i = FACTORY_PORT_START; i < FACTORY_PORT_END; i++) + { + kobject_t *kobj = global_get_kobj(i); + if (kobj) + { + assert(obj_map_root(kobj, &init_task->obj_space, &root_factory_get()->limit, i)); + } + } + thread_ready(init_thread, FALSE); +} +INIT_STAGE1(knl_init_2); + +static void print_mkrtos_info(void) +{ + const char *start_info[] = { + " _____ ______ ___ __ ________ _________ ________ ________ \r\n", + "|\\ _ \\ _ \\|\\ \\|\\ \\ |\\ __ \\|\\___ ___\\\\ __ \\|\\ ____\\ \r\n", + "\\ \\ \\\\\\__\\ \\ \\ \\ \\/ /|\\ \\ \\|\\ \\|___ \\ \\_\\ \\ \\|\\ \\ \\ \\___|_ \r\n", + " \\ \\ \\\\|__| \\ \\ \\ ___ \\ \\ _ _\\ \\ \\ \\ \\ \\ \\\\\\ \\ \\_____ \\ \r\n", + " \\ \\ \\ \\ \\ \\ \\ \\\\ \\ \\ \\ \\\\ \\| \\ \\ \\ \\ \\ \\\\\\ \\|____|\\ \\ \r\n", + " \\ \\__\\ \\ \\__\\ \\__\\\\ \\__\\ \\__\\\\ _\\ \\ \\__\\ \\ \\_______\\____\\_\\ \\ \r\n", + " \\|__| \\|__|\\|__| \\|__|\\|__|\\|__| \\|__| \\|_______|\\_________\\\r\n", + " \\|_________|\r\n", + "Complie Time:" __DATE__ " " __TIME__ "\r\n", + }; + for (umword_t i = 0; i < sizeof(start_info) / sizeof(void *); i++) + { + printk(start_info[i]); + } } void start_kernel(void) { @@ -51,7 +104,7 @@ void start_kernel(void) sys_call_init(); printk("mkrtos init done..\n"); printk("mkrtos running..\n"); - thread_ready(thread_get_current(), FALSE); + print_mkrtos_info(); sti(); sys_startup(); thread_sched(); diff --git a/mkrtos_knl/lib/CMakeLists.txt b/mkrtos_knl/lib/CMakeLists.txt index 31a457250..b7a585476 100755 --- a/mkrtos_knl/lib/CMakeLists.txt +++ b/mkrtos_knl/lib/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.13) file(GLOB_RECURSE deps *.c) -add_library(lib OBJECT ${deps}) +add_library(lib STATIC ${deps}) target_include_directories( lib PUBLIC diff --git a/mkrtos_knl/lib/xprintf.c b/mkrtos_knl/lib/xprintf.c index 53fc959a9..761e21456 100755 --- a/mkrtos_knl/lib/xprintf.c +++ b/mkrtos_knl/lib/xprintf.c @@ -832,7 +832,8 @@ static void xprintf_putc(int c) { uart_putc(uart_get_global(), c); } -INIT_HIGH_HAD static void init_xprintf(void) +static void init_xprintf(void) { xdev_out(xprintf_putc); -} \ No newline at end of file +} +INIT_HIGH_HAD(init_xprintf); \ No newline at end of file diff --git a/mkrtos_knl/stm32f205rft6_link.lds b/mkrtos_knl/stm32f205rft6_link.lds index 6f971c2cf..8c26bc6ce 100644 --- a/mkrtos_knl/stm32f205rft6_link.lds +++ b/mkrtos_knl/stm32f205rft6_link.lds @@ -2,7 +2,7 @@ ENTRY(Reset_Handler) MEMORY { RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 16K - FLASH (rx) : ORIGIN = 0x8000000 + 0x2000, LENGTH = 128K + FLASH (rx) : ORIGIN = 0x8000000 + 0x2000, LENGTH = 64K } SECTIONS { diff --git a/mkrtos_knl/stm32f205rft6_link.lds.S b/mkrtos_knl/stm32f205rft6_link.lds.S index a2459cf5a..37699ca77 100755 --- a/mkrtos_knl/stm32f205rft6_link.lds.S +++ b/mkrtos_knl/stm32f205rft6_link.lds.S @@ -9,7 +9,7 @@ MEMORY RAM (xrw) : ORIGIN = KNL_DATA, LENGTH = KNL_DATA_SIZE /* RAM1 (xrw) : ORIGIN = 0x68000000, LENGTH = 1M */ /* RAM2 (xrw) : ORIGIN = 0x2001C000, LENGTH = 16K */ - FLASH (rx) : ORIGIN = KNL_TEXT + KNL_OFFSET, LENGTH = 128K + FLASH (rx) : ORIGIN = KNL_TEXT + KNL_OFFSET, LENGTH = 64K } /* Define output sections */ diff --git a/mkrtos_user/CMakeLists.txt b/mkrtos_user/CMakeLists.txt index 43b7eeeaf..e817d876a 100644 --- a/mkrtos_user/CMakeLists.txt +++ b/mkrtos_user/CMakeLists.txt @@ -1,4 +1,5 @@ cmake_minimum_required(VERSION 3.13) + add_subdirectory(server) add_subdirectory(lib) diff --git a/mkrtos_user/lib/dietlibc/CMakeLists.txt b/mkrtos_user/lib/dietlibc/CMakeLists.txt index dcc73ff1d..1607a5aee 100644 --- a/mkrtos_user/lib/dietlibc/CMakeLists.txt +++ b/mkrtos_user/lib/dietlibc/CMakeLists.txt @@ -1,10 +1,11 @@ cmake_minimum_required(VERSION 3.13) -set(CMAKE_C_FLAGS "${GLOBAL_C_FLAG} -w \ - -fPIC -n -pie -fpie -fPIC -fpic -msingle-pic-base -mno-pic-data-is-text-relative \ - -Wl,--gc-sections -Wall -g -D__dietlibc__ -D__arm__ -D__WORDSIZE=32\ - " ) +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w \ +-fPIC -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative \ +-Wl,--gc-sections -D__dietlibc__ -D__arm__ -D__WORDSIZE=32 -D__ARM_ARCH_7M__ \ +" ) +set(CMAKE_ASM_FLAGS ${CMAKE_C_FLAGS}) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src/dietlibc-0.34/arm/softfpu) @@ -16,16 +17,22 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src/dietlibc-0.34/include) add_subdirectory(src) add_library(diet - $ - $ - $ - $ - $ - $ - $ - $ - $ - # $ - $ -) + +$ +$ +$ +$ +$ +$ +$ +$ +# $ +$ +) +target_link_libraries(diet +PUBLIC +dietlibc_src +) +add_dependencies(diet dietlibc_src) + diff --git a/mkrtos_user/lib/dietlibc/src/CMakeLists.txt b/mkrtos_user/lib/dietlibc/src/CMakeLists.txt index 842a63546..b97017583 100644 --- a/mkrtos_user/lib/dietlibc/src/CMakeLists.txt +++ b/mkrtos_user/lib/dietlibc/src/CMakeLists.txt @@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.13) file(GLOB deps *.c *.S) add_subdirectory(dietlibc-0.34) -add_library(dietlibc_src OBJECT ${deps}) +add_library(dietlibc_src STATIC ${deps}) target_include_directories( dietlibc_src PUBLIC diff --git a/mkrtos_user/lib/dietlibc/src/__main.c b/mkrtos_user/lib/dietlibc/src/__main.c index 1d60a814b..05671d1f8 100644 --- a/mkrtos_user/lib/dietlibc/src/__main.c +++ b/mkrtos_user/lib/dietlibc/src/__main.c @@ -10,5 +10,5 @@ void __main(int *args, int start_addr) __app_start_addr__ = start_addr; ret = main(args[0], (char **)&args[1]); - exit(ret); + // exit(ret); } diff --git a/mkrtos_user/lib/dietlibc/src/dietlibc-0.34/arm/__testandset.S b/mkrtos_user/lib/dietlibc/src/dietlibc-0.34/arm/__testandset.S index 3b62c516d..e51199e03 100644 --- a/mkrtos_user/lib/dietlibc/src/dietlibc-0.34/arm/__testandset.S +++ b/mkrtos_user/lib/dietlibc/src/dietlibc-0.34/arm/__testandset.S @@ -1,4 +1,7 @@ #include "arm-features.h" +.syntax unified +.cpu cortex-m3 +.thumb FUNC_START __testandset mov r2, r0 diff --git a/mkrtos_user/lib/dietlibc/src/dummy.c b/mkrtos_user/lib/dietlibc/src/dummy.c new file mode 100644 index 000000000..e69de29bb diff --git a/mkrtos_user/lib/dietlibc/src/reloc.c b/mkrtos_user/lib/dietlibc/src/reloc.c index 2aa5ce28f..96cb9e766 100644 --- a/mkrtos_user/lib/dietlibc/src/reloc.c +++ b/mkrtos_user/lib/dietlibc/src/reloc.c @@ -8,7 +8,7 @@ extern int __rel_end__; /* * @brief gbase ramĿʼַ,tbase textĿʼַ */ -void reloc(unsigned int *gbase, unsigned int tbase) +void _reloc(unsigned int *gbase, unsigned int tbase) { int i; unsigned int s; diff --git a/mkrtos_user/lib/dietlibc/src/start.S b/mkrtos_user/lib/dietlibc/src/start.S index 59ed7495b..388a5d7ab 100644 --- a/mkrtos_user/lib/dietlibc/src/start.S +++ b/mkrtos_user/lib/dietlibc/src/start.S @@ -1,6 +1,7 @@ .syntax unified .section .first, #execinstr - + + .globl reloc .align 2 .globl _start_ .type _start_, %function @@ -81,13 +82,13 @@ LoopInitStack: mov r0, r12 push {r0, r4} - ldr r0, = __stack_end__ - mov sp, r0 + //ldr r0, = __stack_end__ + //mov sp, r0 mov r0, r9 adr r1, _start_ bic r1, r1, #1 - bl reloc + bl _reloc pop {r0, r12} adr r1, _start_ diff --git a/mkrtos_user/lib/sys/CMakeLists.txt b/mkrtos_user/lib/sys/CMakeLists.txt new file mode 100644 index 000000000..5807d9907 --- /dev/null +++ b/mkrtos_user/lib/sys/CMakeLists.txt @@ -0,0 +1,31 @@ +cmake_minimum_required(VERSION 3.13) + + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w \ +-fPIC -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative \ +-Wl,--gc-sections -D__dietlibc__ -D__arm__ -D__WORDSIZE=32 -D__ARM_ARCH_7M__ \ +" ) +set(CMAKE_ASM_FLAGS ${CMAKE_C_FLAGS}) + + +add_subdirectory(src) +file(GLOB deps *.c *.S) +add_library( + sys + STATIC + ${deps} +) +target_link_directories( + sys + PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/src + ${CMAKE_CURRENT_SOURCE_DIR}/src/dietlibc-0.34/include +) +target_link_libraries( + sys + PUBLIC + diet +) +add_dependencies(sys diet) + + diff --git a/mkrtos_user/lib/sys/inc/u_prot.h b/mkrtos_user/lib/sys/inc/u_prot.h new file mode 100644 index 000000000..20bf19287 --- /dev/null +++ b/mkrtos_user/lib/sys/inc/u_prot.h @@ -0,0 +1,3 @@ +#pragma once + +#include diff --git a/mkrtos_user/lib/sys/src/u_factory.c b/mkrtos_user/lib/sys/src/u_factory.c new file mode 100644 index 000000000..def90425f --- /dev/null +++ b/mkrtos_user/lib/sys/src/u_factory.c @@ -0,0 +1,2 @@ + +#include diff --git a/mkrtos_user/lib/sys/src/u_log.c b/mkrtos_user/lib/sys/src/u_log.c index e69de29bb..def90425f 100644 --- a/mkrtos_user/lib/sys/src/u_log.c +++ b/mkrtos_user/lib/sys/src/u_log.c @@ -0,0 +1,2 @@ + +#include diff --git a/mkrtos_user/server/CMakeLists.txt b/mkrtos_user/server/CMakeLists.txt index 5fe5de770..57a5dcbaf 100644 --- a/mkrtos_user/server/CMakeLists.txt +++ b/mkrtos_user/server/CMakeLists.txt @@ -1,9 +1,11 @@ cmake_minimum_required(VERSION 3.13) -set(CMAKE_C_FLAGS "${GLOBAL_C_FLAG} -fPIC -n -pie -fpie -fpic \ --msingle-pic-base -mno-pic-data-is-text-relative --specs=nosys.specs \ --fmessage-length=0 -Wall -Xlinker --cref \ +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w \ +-fPIC -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative \ +-Wl,--gc-sections -D__dietlibc__ -D__arm__ -D__WORDSIZE=32 -D__ARM_ARCH_7M__ \ ") +set(CMAKE_ASM_FLAGS ${CMAKE_C_FLAGS}) + add_subdirectory(init) diff --git a/mkrtos_user/server/init/CMakeLists.txt b/mkrtos_user/server/init/CMakeLists.txt index 2d6118900..e8bf14a47 100644 --- a/mkrtos_user/server/init/CMakeLists.txt +++ b/mkrtos_user/server/init/CMakeLists.txt @@ -9,6 +9,7 @@ target_link_libraries(init.elf PUBLIC diet ) +add_dependencies(init.elf diet) set_target_properties(init.elf PROPERTIES LINK_FLAGS "-T ${CMAKE_CURRENT_SOURCE_DIR}/link.lds") diff --git a/mkrtos_user/server/init/src/heap_stack.c b/mkrtos_user/server/init/src/heap_stack.c new file mode 100644 index 000000000..3338fcea2 --- /dev/null +++ b/mkrtos_user/server/init/src/heap_stack.c @@ -0,0 +1,17 @@ + +#define HEAP_SIZE 1024 * 2 +#define STACK_SIZE 1024 * 1 + +#if defined(__CC_ARM) +#define HEAP_ATTR SECTION("HEAP") __attribute__((zero_init)) +#define STACK_ATTR SECTION("STACK") __attribute__((zero_init)) +#elif defined(__GNUC__) +#define HEAP_ATTR +#define STACK_ATTR +#elif defined(__IAR_SYSTEMS_ICC__) +#define HEAP_ATTR +#define STACK_ATTR +#endif + +__attribute__((used)) HEAP_ATTR static char heap[HEAP_SIZE]; +__attribute__((used)) STACK_ATTR static char stack[STACK_SIZE]; diff --git a/mkrtos_user/server/init/src/main.c b/mkrtos_user/server/init/src/main.c index 37730454c..eab46c903 100644 --- a/mkrtos_user/server/init/src/main.c +++ b/mkrtos_user/server/init/src/main.c @@ -1,5 +1,25 @@ +int syscall(int nr, ...); +#define uint32_t unsigned int +typedef union msg_tag +{ + uint32_t raw; + union + { + uint32_t type : 4; + uint32_t type2 : 6; + uint32_t prot : (sizeof(uint32_t) * 8) - 12; + }; +} msg_tag_t; + +#define msg_tag_init(r) \ + ((msg_tag_t){.raw = (r)}) + +#define msg_tag_init3(t, t2, p) \ + msg_tag_init(((uint32_t)(t)&0xf) | (((uint32_t)(t2)&0x3f) << 4) | (((uint32_t)(p)) << 10)) + int main(int argc, char *args[]) { + syscall(4, msg_tag_init3(0, 1, 4).raw, 'a', 2, 3, 4, 5); return 0; } diff --git a/mkrtos_user/server/init/src/syscall.S b/mkrtos_user/server/init/src/syscall.S new file mode 100644 index 000000000..3b6efd17d --- /dev/null +++ b/mkrtos_user/server/init/src/syscall.S @@ -0,0 +1,19 @@ +.syntax unified +.text + +/* +int syscall(int nr, ...) +*/ +.global syscall +.type syscall, %function +syscall: + push {r4-r7} + mov r7, r0 + mov r0, r1 + mov r1, r2 + mov r2, r3 + add r6, sp,#16 + ldmia r6,{r3-r5} + svc 128 + pop {r4-r7} + bx lr diff --git a/setting.cmake b/setting.cmake index 8d0d7940b..b427057c2 100755 --- a/setting.cmake +++ b/setting.cmake @@ -1,4 +1,4 @@ -set(CMAKE_TOOLCHAIN_PATH "/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/bin/" CACHE STRING " " FORCE) +set(CMAKE_TOOLCHAIN_PATH "/home/zhangzheng/gcc-arm-none-eabi-4_9-2014q4/bin/" CACHE STRING " " FORCE) set(CROSS_COMPILE ${CMAKE_TOOLCHAIN_PATH}arm-none-eabi- CACHE PATH "" FORCE) set(CMAKE_INSTALL_PATH "${CMAKE_BINARY_DIR}deploy" CACHE PATH "" FORCE) @@ -16,10 +16,9 @@ set(CMAKE_NM "${CROSS_COMPILE}nm" CACHE PATH "" FORCE) set(CMAKE_AR "${CROSS_COMPILE}ar" CACHE PATH "" FORCE) set(CMAKE_SIZE "${CROSS_COMPILE}size" CACHE PATH "" FORCE) -set(CMAKE_C_FLAGS "-mcpu=cortex-m3 -mthumb -mno-thumb-interwork -mfix-cortex-m3-ldrd -O0 -g -std=gnu11 \ --fmessage-length=0 -Xlinker --print-map -Wall -W -fno-stack-protector -g \ --mfloat-abi=soft -lc -lrdimon -u _printf_float \ --ffunction-sections -fdata-sections -fno-builtin -nostartfiles -nodefaultlibs -nostdlib -nostdinc -Xlinker -Wl,-gc-sections \ +set(CMAKE_C_FLAGS "-mcpu=cortex-m3 -mthumb -O0 -g -mfloat-abi=soft -lc -lrdimon \ +-u _printf_float -std=gnu11 -ffunction-sections -fdata-sections -fno-builtin \ +-nostartfiles -nodefaultlibs -nostdlib -nostdinc -Xlinker --gc-sections -fno-stack-protector \ " CACHE STRING "" FORCE) set(CMAKE_CXX_FLAGS "-mcpu=cortex-m3 -mthumb -mno-thumb-interwork -mfix-cortex-m3-ldrd -O0 -g -std=c++11 \ @@ -28,9 +27,9 @@ set(CMAKE_CXX_FLAGS "-mcpu=cortex-m3 -mthumb -mno-thumb-interwork -mfix-cortex-m -ffunction-sections -fdata-sections -fno-builtin -nostartfiles -nodefaultlibs -nostdlib -nostdinc -Xlinker -Wl,-gc-sections \ " CACHE STRING "" FORCE) -set(CMAKE_ASM_FLAGS "-mcpu=cortex-m3 -mthumb -mno-thumb-interwork -mfix-cortex-m3-ldrd -O0 -g -std=gnu11 \ --mfloat-abi=soft -lc -lrdimon -u _printf_float \ --ffunction-sections -fdata-sections -fno-builtin -nostartfiles -nodefaultlibs -nostdlib -nostdinc -Xlinker --gc-sections \ +set(CMAKE_ASM_FLAGS "-mcpu=cortex-m3 -mthumb -O0 -g -mfloat-abi=soft -lc -lrdimon \ +-u _printf_float -std=gnu11 -ffunction-sections -fdata-sections -fno-builtin \ +-nostartfiles -nodefaultlibs -nostdlib -nostdinc -Xlinker --gc-sections -fno-stack-protector \ " CACHE STRING "" FORCE) set(CMAKE_C_LINK_EXECUTABLE "${CMAKE_LINKER} --start-group --end-group -o " CACHE INTERNAL " " FORCE)