diff --git a/.config b/.config index 54f5f9cbd..7131749be 100644 --- a/.config +++ b/.config @@ -2,9 +2,15 @@ # # Knl config # -CONFIG_MK_MPU_CFG=y +CONFIG_KNL_INFO=y CONFIG_KNL_TEXT_ADDR=0x8000000 CONFIG_KNL_TEXT_SIZE=0x100000 +CONFIG_KNL_DATA_ADDR=0x20000000 +CONFIG_KNL_DATA_SIZE=0xa00000 +CONFIG_KNL_OFFSET=0x2000 +CONFIG_INIT_TASK_OFFSET=0x10000 +CONFIG_BOOTFS_OFFSET=0x20000 +CONFIG_MK_MPU_CFG=y CONFIG_FT_ADDR_NR=16 CONFIG_SYS_SCHE_HZ=1000 CONFIG_USER_ISR_START_NO=16 @@ -22,6 +28,14 @@ CONFIG_FD_MAP_ROW_CN=16 CONFIG_FD_MAP_ROW_NR=16 # end of Libc backend +# +# Sys util config +# +CONFIG_USING_SIG=y +CONFIG_SIG_THREAD_STACK_SIZE=512 +CONFIG_SIG_THREAD_PRIO=3 +# end of Sys util config + # # DFS: device virtual file system # diff --git a/.config.old b/.config.old index c54b4bb27..ed46cce28 100644 --- a/.config.old +++ b/.config.old @@ -1,4 +1,25 @@ -CONFIG_RTT_DIR="./" + +# +# Knl config +# +CONFIG_KNL_INFO=y +CONFIG_KNL_TEXT_ADDR=0x8000000 +CONFIG_KNL_TEXT_SIZE=0x100000 +CONFIG_KNL_DATA_ADDR=0x20000000 +CONFIG_KNL_DATA_SIZE=0x100000 +CONFIG_KNL_OFFSET=0x2000 +CONFIG_INIT_TASK_OFFSET=0x10000 +CONFIG_BOOTFS_OFFSET=0x20000 +CONFIG_MK_MPU_CFG=y +CONFIG_FT_ADDR_NR=16 +CONFIG_SYS_SCHE_HZ=1000 +CONFIG_USER_ISR_START_NO=16 +CONFIG_IRQ_REG_TAB_SIZE=80 +CONFIG_REGION_NUM=8 +CONFIG_OBJ_MAP_TAB_SIZE=4 +CONFIG_OBJ_MAP_ENTRY_SIZE=8 +CONFIG_PRINTK_CACHE_SIZE=128 +# end of Knl config # # Libc backend @@ -7,6 +28,14 @@ CONFIG_FD_MAP_ROW_CN=16 CONFIG_FD_MAP_ROW_NR=16 # end of Libc backend +# +# Sys util config +# +CONFIG_USING_SIG=y +CONFIG_SIG_THREAD_STACK_SIZE=512 +CONFIG_SIG_THREAD_PRIO=3 +# end of Sys util config + # # DFS: device virtual file system # @@ -78,15 +107,4 @@ CONFIG_RT_USING_PIN=y # end of Using USB # end of Device Drivers -# -# Knl config -# -CONFIG_FT_ADDR_NR=16 -CONFIG_SYS_SCHE_HZ=1000 -CONFIG_USER_ISR_START_NO=16 -CONFIG_IRQ_REG_TAB_SIZE=80 -CONFIG_REGION_NUM=8 -CONFIG_OBJ_MAP_TAB_SIZE=4 -CONFIG_OBJ_MAP_ENTRY_SIZE=8 -CONFIG_PRINTK_CACHE_SIZE=128 -# end of Knl config +CONFIG_RTT_DIR="./" diff --git a/.gitignore b/.gitignore index 07ed7069a..bbf74bb81 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -build/* \ No newline at end of file +build/* +.config +.config.old diff --git a/mkrtos_knl/CMakeLists.txt b/mkrtos_knl/CMakeLists.txt index f028f5c7e..f14bb3190 100755 --- a/mkrtos_knl/CMakeLists.txt +++ b/mkrtos_knl/CMakeLists.txt @@ -55,7 +55,7 @@ add_custom_target( # -DKNL_TEXT=$ENV{KNL_TEXT} -DKNL_DATA=$ENV{KNL_DATA} -DKNL_OFFSET=$ENV{KEN_OFFSET} - -DKNL_DATA_SIZE=$ENV{KNL_DATA_SIZE} + # -DKNL_DATA_SIZE=$ENV{KNL_DATA_SIZE} -include ${CMAKE_SOURCE_DIR}/build/autoconf.h -E -P -<${CMAKE_CURRENT_LIST_DIR}/stm32_link.lds.S> ${CMAKE_CURRENT_LIST_DIR}/stm32_link.lds diff --git a/mkrtos_knl/inc/knl/globals.h b/mkrtos_knl/inc/knl/globals.h index cf4fc05e1..65e5b69a8 100755 --- a/mkrtos_knl/inc/knl/globals.h +++ b/mkrtos_knl/inc/knl/globals.h @@ -14,6 +14,11 @@ #include "types.h" #include "kobject.h" +extern char _sdata[]; +extern char _edata[]; +extern char _sbss[]; +extern char _ebss[]; + 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/knl/app.c b/mkrtos_knl/knl/app.c index 7be1cbf69..6abaf0522 100644 --- a/mkrtos_knl/knl/app.c +++ b/mkrtos_knl/knl/app.c @@ -1,23 +1,35 @@ /** * @file app.c * @author ATShining (1358745329@qq.com) - * @brief + * @brief * @version 0.1 * @date 2023-09-29 - * + * * @copyright Copyright (c) 2023 - * + * */ #include "types.h" #include "app.h" +#define APP_MAGIC "MKRTOS." + /** * @brief 通过地址获得app的信息 - * + * * @param addr 内存地址 * @return app_info_t* app的信息 */ app_info_t *app_info_get(void *addr) { - return (app_info_t *)addr; + app_info_t *app = (app_info_t *)((umword_t)addr & (~0x3UL)); + const char *magic = APP_MAGIC; + + for (int i = 0; i < sizeof(app->magic) - 1; i++) + { + if (app->magic[i] != magic[i]) + { + return NULL; + } + } + return app; } diff --git a/mkrtos_knl/knl/globals.c b/mkrtos_knl/knl/globals.c index 221f5dc10..f04ed7454 100755 --- a/mkrtos_knl/knl/globals.c +++ b/mkrtos_knl/knl/globals.c @@ -17,9 +17,8 @@ #include "assert.h" #include "mm_man.h" #include "ipc.h" -static mem_t global_mem; //!< 全局内存管理块 -static uint8_t mem_block[9 * 1024 * 1024 + 1024 * 1000]; //!< 内核内存分配堆 TODO:自动识别大小,或者从bootstrap中读取 -static kobject_t *kobj_ls[FACTORY_FUNC_MAX]; //!< 全局静态内核对象 +static mem_t global_mem; //!< 全局内存管理块 +static kobject_t *kobj_ls[FACTORY_FUNC_MAX]; //!< 全局静态内核对象 /** * @brief 注册一个全局静态的内核对象 * @@ -59,7 +58,8 @@ mem_t *mm_get_global(void) */ static void mem_sys_init(void) { + void *mem_block_data; mem_init(&global_mem); - mem_heap_add(mm_get_global(), mem_block, sizeof(mem_block)); + mem_heap_add(mm_get_global(), (void *)_ebss, CONFIG_KNL_DATA_SIZE - ((umword_t)_ebss - (umword_t)_sdata)); } INIT_MEM(mem_sys_init); diff --git a/mkrtos_knl/stm32_link.lds b/mkrtos_knl/stm32_link.lds index 0d4e36c33..907fe655f 100644 --- a/mkrtos_knl/stm32_link.lds +++ b/mkrtos_knl/stm32_link.lds @@ -1,7 +1,7 @@ ENTRY(Reset_Handler) MEMORY { - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 10M + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 0xa00000 FLASH (rx) : ORIGIN = 0x8000000 + 0x2000, LENGTH = 64K - 0x2000 } SECTIONS diff --git a/mkrtos_knl/stm32_link.lds.S b/mkrtos_knl/stm32_link.lds.S index 9b876d88f..9376508c2 100755 --- a/mkrtos_knl/stm32_link.lds.S +++ b/mkrtos_knl/stm32_link.lds.S @@ -6,7 +6,7 @@ ENTRY(Reset_Handler) /* Specify the memory areas */ MEMORY { - RAM (xrw) : ORIGIN = KNL_DATA, LENGTH = KNL_DATA_SIZE + RAM (xrw) : ORIGIN = KNL_DATA, LENGTH = CONFIG_KNL_DATA_SIZE /* RAM1 (xrw) : ORIGIN = 0x68000000, LENGTH = 1M */ /* RAM2 (xrw) : ORIGIN = 0x2001C000, LENGTH = 16K */ FLASH (rx) : ORIGIN = CONFIG_KNL_TEXT_ADDR + KNL_OFFSET, LENGTH = 64K - KNL_OFFSET diff --git a/mkrtos_script/build.sh b/mkrtos_script/build.sh index a8b1a14de..525d16baa 100755 --- a/mkrtos_script/build.sh +++ b/mkrtos_script/build.sh @@ -8,7 +8,6 @@ export KEN_OFFSET=0x2000 export INIT_OFFSET=0x10000 export BOOTFS_ADDR_OFFSET=0x22000 export KNL_DATA=0x20000000 -export KNL_DATA_SIZE=10M export BOARD=STM32F2x export ARCH=cortex-m3 export PYTHON_EXECUTABLE=python3 diff --git a/mkrtos_user/lib/Kconfig b/mkrtos_user/lib/Kconfig index 18ada0c37..ec0e63823 100644 --- a/mkrtos_user/lib/Kconfig +++ b/mkrtos_user/lib/Kconfig @@ -1,4 +1,4 @@ source "mkrtos_user/lib/libc_backend/Kconfig" - +source "mkrtos_user/lib/sys_util/Kconfig" diff --git a/mkrtos_user/lib/letter-shell/demo/mkrtos/CMakeLists.txt b/mkrtos_user/lib/letter-shell/demo/mkrtos/CMakeLists.txt index 9b30933fd..2d8fef47d 100644 --- a/mkrtos_user/lib/letter-shell/demo/mkrtos/CMakeLists.txt +++ b/mkrtos_user/lib/letter-shell/demo/mkrtos/CMakeLists.txt @@ -43,7 +43,7 @@ target_include_directories(LetterShell PUBLIC ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_svr/inc ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/util/inc ${CMAKE_SOURCE_DIR}/mkrtos_user/server/app/drv - + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/arm/ ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/generic ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/src/internal diff --git a/mkrtos_user/lib/letter-shell/demo/mkrtos/shell_test.c b/mkrtos_user/lib/letter-shell/demo/mkrtos/shell_test.c index a8cc85fc4..ba6ffd652 100644 --- a/mkrtos_user/lib/letter-shell/demo/mkrtos/shell_test.c +++ b/mkrtos_user/lib/letter-shell/demo/mkrtos/shell_test.c @@ -11,6 +11,8 @@ #include #include #include +#ifdef CONFIG_USING_SIG + static int shell_sig_call_back(pid_t pid, umword_t sig_val) { /*TODO:这个消息是init发送的,这里不能给init发送消息,否导致卡死*/ @@ -29,3 +31,4 @@ int shell_test_sig(int argc, char *argv[]) return pm_sig_watch(pid, 0 /*TODO:现在只有kill */); } SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), test_sig, shell_test_sig, shell_test_sig command); +#endif diff --git a/mkrtos_user/lib/libc_backend/src/mm_backend.c b/mkrtos_user/lib/libc_backend/src/mm_backend.c index cea3d9b08..a216de78f 100644 --- a/mkrtos_user/lib/libc_backend/src/mm_backend.c +++ b/mkrtos_user/lib/libc_backend/src/mm_backend.c @@ -10,7 +10,7 @@ #include static pthread_spinlock_t lock; extern void *app_start_addr; -static umword_t mm_bitemp[256 /*TODO:自动分配,或者静态划分*/]; +static umword_t mm_bitemp[ROUND(CONFIG_KNL_DATA_SIZE, MK_PAGE_SIZE) / (sizeof(umword_t) * 8) + 1]; static void *mm_page_alloc(int page_nr) { int cnt = 0; diff --git a/mkrtos_user/lib/mlibc/src/env/__libc_start_main.c b/mkrtos_user/lib/mlibc/src/env/__libc_start_main.c index ae474ca4f..48f2a11a8 100644 --- a/mkrtos_user/lib/mlibc/src/env/__libc_start_main.c +++ b/mkrtos_user/lib/mlibc/src/env/__libc_start_main.c @@ -103,8 +103,9 @@ int __libc_start_main(int (*main)(int, char **, char **), int argc, char **argv, * are used to prevent the stack frame used during init from * persisting for the entire process lifetime. */ __init_libc(envp, argv[0]); +#ifdef CONFIG_USING_SIG sig_init(); - +#endif /* Barrier against hoisting application code or anything using ssp * or thread pointer prior to its initialization above. */ lsm2_fn *stage2 = libc_start_main_stage2; diff --git a/mkrtos_user/lib/sys_util/Kconfig b/mkrtos_user/lib/sys_util/Kconfig new file mode 100644 index 000000000..eb9208e0d --- /dev/null +++ b/mkrtos_user/lib/sys_util/Kconfig @@ -0,0 +1,17 @@ + + +menu "Sys util config" + +menuconfig USING_SIG + bool "Using signal." + default y +if USING_SIG +config SIG_THREAD_STACK_SIZE + int "Set signal thread stack size." + default 512 +config SIG_THREAD_PRIO + int "Set signal thread prio." + default 3 +endif +endmenu + diff --git a/mkrtos_user/lib/sys_util/src/u_sig.c b/mkrtos_user/lib/sys_util/src/u_sig.c index 9fe9a5822..9a8566d39 100644 --- a/mkrtos_user/lib/sys_util/src/u_sig.c +++ b/mkrtos_user/lib/sys_util/src/u_sig.c @@ -9,8 +9,10 @@ #include #include +#ifdef CONFIG_USING_SIG + static sig_call_back sig_cb_func; -static ATTR_ALIGN(8) uint8_t sig_stack[1024]; +static ATTR_ALIGN(8) uint8_t sig_stack[CONFIG_SIG_THREAD_STACK_SIZE]; static uint8_t sig_msg_buf[MSG_BUG_LEN]; static obj_handler_t sig_th; static obj_handler_t sig_ipc; @@ -70,5 +72,6 @@ void sig_init(void) return; } u_thread_create(&sig_th, sig_stack, sizeof(sig_stack), sig_msg_buf, sig_func); - u_thread_run(sig_th, 3); + u_thread_run(sig_th, CONFIG_SIG_THREAD_PRIO); } +#endif diff --git a/mkrtos_user/server/fs/cpiofs/main.c b/mkrtos_user/server/fs/cpiofs/main.c index dddc5f8c4..fa5737d68 100644 --- a/mkrtos_user/server/fs/cpiofs/main.c +++ b/mkrtos_user/server/fs/cpiofs/main.c @@ -21,7 +21,7 @@ int main(int argv, char *args[]) ret = rpc_meta_init(THREAD_MAIN, &hd); assert(ret >= 0); fs_svr_init(); - ns_register("/cpio", hd, MOUNT_NODE); + ns_register("/bin", hd, MOUNT_NODE); cons_write_str("cpiofs mount success\n"); // *((char *)0) = 0; diff --git a/mkrtos_user/server/fs/fatfs/fs_rpc.c b/mkrtos_user/server/fs/fatfs/fs_rpc.c index ce262042a..3ad344f42 100644 --- a/mkrtos_user/server/fs/fatfs/fs_rpc.c +++ b/mkrtos_user/server/fs/fatfs/fs_rpc.c @@ -18,7 +18,9 @@ void fs_svr_init(void) { fs_init(&fs); meta_reg_svr_obj(&fs.svr, FS_PROT); +#ifdef CONFIG_USING_SIG pm_sig_func_set(fs_sig_call_back); +#endif } typedef struct file_desc { @@ -184,11 +186,13 @@ int fs_svr_open(const char *path, int flags, int mode) { return fatfs_err_conv(ret); } +#ifdef CONFIG_USING_SIG int w_ret = pm_sig_watch(pid, 0 /*TODO:现在只有kill */); if (w_ret < 0) { printf("pm wath pid %d err.\n", w_ret); } +#endif return fd; } diff --git a/mkrtos_user/server/init/src/heap_stack.c b/mkrtos_user/server/init/src/heap_stack.c index 3317ceb9b..3fa7a30ed 100644 --- a/mkrtos_user/server/init/src/heap_stack.c +++ b/mkrtos_user/server/init/src/heap_stack.c @@ -8,7 +8,7 @@ * @copyright Copyright (c) 2023 * */ -#define HEAP_SIZE 512 +#define HEAP_SIZE 1024 #define STACK_SIZE 1024 * 2 #if defined(__CC_ARM) diff --git a/mkrtos_user/server/init/src/init.cfg b/mkrtos_user/server/init/src/init.cfg index 0fdc128ba..106663ba7 100644 --- a/mkrtos_user/server/init/src/init.cfg +++ b/mkrtos_user/server/init/src/init.cfg @@ -1,4 +1,5 @@ #一次读取一行,每行代表启动的应用程序,暂时不支持参数 fatfs +cpiofs sh