From 543a618de958b54b9d3b7bb3106167f5eb4364ca Mon Sep 17 00:00:00 2001 From: zhangzheng <1358745329@qq.com> Date: Mon, 3 Mar 2025 23:03:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=8F=8F=E8=BF=B0=E7=AC=A6?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=9B=9E=E6=94=B6=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 4 +- TODO.md | 3 +- mkrtos_knl/arch/cortex-m3/syscall.S | 31 ++-- mkrtos_knl/arch/cortex-m4/syscall.S | 7 +- mkrtos_knl/knl/thread.c | 4 + mkrtos_user/lib/CMakeLists.txt | 1 + mkrtos_user/lib/fd/CMakeLists.txt | 19 ++ mkrtos_user/lib/fd/fd.c | 114 ++++++++++++ mkrtos_user/lib/fd/fd.h | 18 ++ mkrtos_user/lib/sys_svr/src/sig_svr.c | 2 +- mkrtos_user/lib/sys_util/inc/u_sig.h | 4 +- mkrtos_user/lib/sys_util/src/u_sig.c | 5 +- mkrtos_user/server/fs/appfs/fs_rpc.c | 49 +++-- mkrtos_user/server/fs/appfs/src/appfs_open.c | 39 ++-- mkrtos_user/server/fs/appfs/src/appfs_open.h | 2 + mkrtos_user/server/fs/fatfs/CMakeLists.txt | 4 + mkrtos_user/server/fs/fatfs/fs_rpc.c | 180 ++++++++----------- mkrtos_user/server/init/src/pm.c | 2 +- mkrtos_user/user/app/CMakeLists.txt | 1 + mkrtos_user/user/app/test2/CMakeLists.txt | 64 +++++++ mkrtos_user/user/app/test2/armv7_8m/link.lds | 124 +++++++++++++ mkrtos_user/user/app/test2/heap_stack.c | 17 ++ mkrtos_user/user/app/test2/main.c | 24 +++ 23 files changed, 568 insertions(+), 150 deletions(-) create mode 100644 mkrtos_user/lib/fd/CMakeLists.txt create mode 100644 mkrtos_user/lib/fd/fd.c create mode 100644 mkrtos_user/lib/fd/fd.h create mode 100644 mkrtos_user/user/app/test2/CMakeLists.txt create mode 100644 mkrtos_user/user/app/test2/armv7_8m/link.lds create mode 100644 mkrtos_user/user/app/test2/heap_stack.c create mode 100644 mkrtos_user/user/app/test2/main.c diff --git a/.vscode/settings.json b/.vscode/settings.json index cc3ebb84a..faeb68552 100755 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -199,7 +199,9 @@ "nsfs.h": "c", "fs_svr.h": "c", "sig_cli.h": "c", - "sig_svr.h": "c" + "sig_svr.h": "c", + "pm.h": "c", + "u_sig.h": "c" }, "cortex-debug.showRTOS": false, "cortex-debug.variableUseNaturalFormat": true, diff --git a/TODO.md b/TODO.md index 43ff9dbfc..a464fd03c 100644 --- a/TODO.md +++ b/TODO.md @@ -13,10 +13,11 @@ * [ ] 内核信号量支持优先级反转 * [ ] FPU完善支持,目前版本偶发压栈错误 * [ ] console 支持自动切换前后台 -* [X] 重构路径管理(nsfs) +* [x] 重构路径管理(nsfs) * [ ] 线程占用率统计 * [x] 去除原来的ipc机制(使用fastipc机制),并单独实现sleep接口,目前的ipc有概率卡死问题 * [ ] 几大组件稳定性测试 +* [ ] dup, dup2等接口支持 * [ ] fastipc FPU支持 ### mid prio * [x] net server support diff --git a/mkrtos_knl/arch/cortex-m3/syscall.S b/mkrtos_knl/arch/cortex-m3/syscall.S index 2f4a439a8..732870e59 100755 --- a/mkrtos_knl/arch/cortex-m3/syscall.S +++ b/mkrtos_knl/arch/cortex-m3/syscall.S @@ -11,17 +11,20 @@ syscall_exit: svc 1 b . - /** * void syscall_ret_user(int ret_val); * @brief 回到用户模式 */ .type syscall_ret_user, %function syscall_ret_user: - //存放返回值 - //还原msp的值 mrs r0, msp +#ifdef MKRTOS_USE_FPU + // 如果支持浮点,则要把惰性浮点得位置留查出来 + TST lr, #0x10 + IT eq + addeq r0,r0,#0x48 +#endif add r0, #0x20 ldmfd r0!,{r4-r11} msr msp,r0 @@ -38,7 +41,7 @@ syscall_ret_user: .global SVC_Handler .type SVC_Handler, %function SVC_Handler: -CPSID I + CPSID I TST.W LR, #4 ITE EQ MRSEQ R1, MSP @@ -52,9 +55,6 @@ CPSID I cmp r2,#1 beq TO_USER cmp r2,#2 -// beq enter_fchannel -// cmp r2,#3 -// beq exit_fchannel b TO_END TO_USER: B syscall_ret_user @@ -65,7 +65,7 @@ SYS_CALL: //放入之前的栈地址 mrs r1,CONTROL - push {r0,r1,r2,lr} + push {r0-r2,lr} //svc 128 mov r1, r7 //获得需要调用的syscall函数的地址 @@ -75,6 +75,12 @@ SYS_CALL: stmfd sp!,{r4-r11} //压入到用户栈中 //stmfd r0,{r4-r11} +#ifdef MKRTOS_USE_FPU + // 如果支持浮点,则里则要把惰性浮点得位置留查出来 + TST lr, #0x10 + IT eq + subeq sp,sp,#0x48 +#endif //取出PSR PC LR R12 R3 R2 R1 R0 ldmfd r0,{r4-r11} //压入到内核栈中 @@ -91,13 +97,13 @@ SYS_CALL: str r3, [r0, #28] //重新设置control - mrs r0, CONTROL - bic r0, r0, #0x03 - msr CONTROL, r0 + mrs r1, CONTROL + bic r1, r1, #0x03 + msr CONTROL, r1 dsb isb - orr lr, lr, #0x18 + orr lr, lr, #0x08 bic lr, lr, #0x04 CPSIE I bx lr @@ -105,4 +111,3 @@ SYS_CALL: TO_END: CPSIE I bx lr - diff --git a/mkrtos_knl/arch/cortex-m4/syscall.S b/mkrtos_knl/arch/cortex-m4/syscall.S index d0fd6218e..732870e59 100755 --- a/mkrtos_knl/arch/cortex-m4/syscall.S +++ b/mkrtos_knl/arch/cortex-m4/syscall.S @@ -17,12 +17,10 @@ syscall_exit: */ .type syscall_ret_user, %function syscall_ret_user: - //存放返回值 - //还原msp的值 mrs r0, msp #ifdef MKRTOS_USE_FPU - // 如果支持浮点,则里则要把惰性浮点得位置留查出来 + // 如果支持浮点,则要把惰性浮点得位置留查出来 TST lr, #0x10 IT eq addeq r0,r0,#0x48 @@ -57,9 +55,6 @@ SVC_Handler: cmp r2,#1 beq TO_USER cmp r2,#2 -// beq enter_fchannel -// cmp r2,#3 -// beq exit_fchannel b TO_END TO_USER: B syscall_ret_user diff --git a/mkrtos_knl/knl/thread.c b/mkrtos_knl/knl/thread.c index c3203ca24..fbfe421e3 100755 --- a/mkrtos_knl/knl/thread.c +++ b/mkrtos_knl/knl/thread.c @@ -1182,6 +1182,10 @@ end: return ret; } #endif +/** + * 快速ipc call + * FIXME:以下代码是arch相关的,需要整理 + **/ msg_tag_t thread_fast_ipc_call(task_t *to_task, entry_frame_t *f, umword_t user_id) { task_t *cur_task = thread_get_current_task(); diff --git a/mkrtos_user/lib/CMakeLists.txt b/mkrtos_user/lib/CMakeLists.txt index 3e8bb5c9c..bb5a19df3 100644 --- a/mkrtos_user/lib/CMakeLists.txt +++ b/mkrtos_user/lib/CMakeLists.txt @@ -22,4 +22,5 @@ add_subdirectory(printf) add_subdirectory(lwip) add_subdirectory(cJSON) add_subdirectory(cutest) +add_subdirectory(fd) diff --git a/mkrtos_user/lib/fd/CMakeLists.txt b/mkrtos_user/lib/fd/CMakeLists.txt new file mode 100644 index 000000000..18d355197 --- /dev/null +++ b/mkrtos_user/lib/fd/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 3.13) + + +file(GLOB_RECURSE deps *.c *.S) +add_library( + fd + STATIC + ${deps} +) +target_include_directories( + fd + PUBLIC + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/fd/ + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc/${ARCH_NAME} + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_util/inc +) + + diff --git a/mkrtos_user/lib/fd/fd.c b/mkrtos_user/lib/fd/fd.c new file mode 100644 index 000000000..a0d514862 --- /dev/null +++ b/mkrtos_user/lib/fd/fd.c @@ -0,0 +1,114 @@ + +#include "u_types.h" +#include "u_hd_man.h" +#include +#include +#include +#include +#include "fd.h" + +#define FILE_DESC_NR_OPEN 8 +static file_desc_t file_desc[FILE_DESC_NR_OPEN]; +static u_mutex_t fds_lock; + +static int fs_sig_call_back(pid_t pid, umword_t sig_val) +{ + switch (sig_val) + { + case KILL_SIG: + file_desc_recycle(pid); + break; + } + return 0; +} + +int file_desc_init(void) +{ + int ret; + obj_handler_t sema_hd; + + sema_hd = handler_alloc(); + if (sema_hd == HANDLER_INVALID) + { + return -ENOMEM; + } + ret = u_mutex_init(&fds_lock, sema_hd); + if (ret < 0) + { + return ret; + } + pm_sig_func_set(fs_sig_call_back); + return ret; +} +int file_desc_alloc(pid_t pid, void *priv, void (*close_fn)(int fd)) +{ + u_mutex_lock(&fds_lock, 0, NULL); + for (int i = 0; i < FILE_DESC_NR_OPEN; i++) + { + if (file_desc[i].close == NULL) + { + file_desc[i].pid = pid; + file_desc[i].priv = priv; + file_desc[i].close = close_fn; + u_mutex_unlock(&fds_lock); + return i; + } + } + u_mutex_unlock(&fds_lock); + return -ENOMEM; +} +int file_desc_set_priv(int fd, void *priv) +{ + if (fd < 0 || fd >= FILE_DESC_NR_OPEN) + { + return -EBADF; + } + file_desc[fd].priv = priv; + return 0; +} +file_desc_t *file_desc_get(int fd) +{ + if (fd < 0 || fd >= FILE_DESC_NR_OPEN) + { + return NULL; + } + return &file_desc[fd]; +} +void *file_desc_free_unlock(int fd) +{ + void *ret; + + if (fd < 0 || fd >= FILE_DESC_NR_OPEN) + { + return NULL; + } + file_desc[fd].pid = 0; + ret = file_desc[fd].priv; + file_desc[fd].priv = NULL; + file_desc[fd].close = NULL; + return ret; +} +void *file_desc_free(int fd) +{ + void *ret; + + u_mutex_lock(&fds_lock, 0, NULL); + ret = file_desc_free_unlock(fd); + u_mutex_unlock(&fds_lock); + return ret; +} +void file_desc_recycle(pid_t pid) +{ + int free_cn = 0; + + u_mutex_lock(&fds_lock, 0, NULL); + for (int i = 0; i < FILE_DESC_NR_OPEN; i++) + { + if (file_desc[i].close != NULL && file_desc[i].pid == pid) + { + file_desc[i].close(i); + printf("free fd:%d.\n", i); + } + } + u_mutex_unlock(&fds_lock); +} \ No newline at end of file diff --git a/mkrtos_user/lib/fd/fd.h b/mkrtos_user/lib/fd/fd.h new file mode 100644 index 000000000..ee1d0ce5c --- /dev/null +++ b/mkrtos_user/lib/fd/fd.h @@ -0,0 +1,18 @@ +#pragma once +#include +#include + +typedef struct file_desc +{ + pid_t pid; + void (*close)(int fd); + void *priv; +} file_desc_t; + +int file_desc_init(void); +int file_desc_alloc(pid_t pid, void *priv, void (*close_fn)(int fd)); +int file_desc_set_priv(int fd, void *priv); +file_desc_t *file_desc_get(int fd); +void *file_desc_free_unlock(int fd); +void *file_desc_free(int fd); +void file_desc_recycle(pid_t pid); diff --git a/mkrtos_user/lib/sys_svr/src/sig_svr.c b/mkrtos_user/lib/sys_svr/src/sig_svr.c index 951df5869..95cbe131e 100644 --- a/mkrtos_user/lib/sys_svr/src/sig_svr.c +++ b/mkrtos_user/lib/sys_svr/src/sig_svr.c @@ -35,7 +35,7 @@ RPC_GENERATION_OP2(sig_t, SIG_PORT, SIG_TOKILL, to_kill, rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags, rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, resv) { - if (!obj->op->kill) + if (!obj->op->to_kill) { return -ENOSYS; } diff --git a/mkrtos_user/lib/sys_util/inc/u_sig.h b/mkrtos_user/lib/sys_util/inc/u_sig.h index 01ba9c675..e3ea7e88d 100644 --- a/mkrtos_user/lib/sys_util/inc/u_sig.h +++ b/mkrtos_user/lib/sys_util/inc/u_sig.h @@ -1,5 +1,5 @@ #pragma once - +#include enum signal_val { KILL_SIG, @@ -8,5 +8,5 @@ typedef int (*sig_call_back)(pid_t pid, umword_t sig_val); void sig_init(void); int pm_sig_watch(pid_t pid, int flags); -void pm_sig_func_set(sig_call_back sig_func); +sig_call_back pm_sig_func_set(sig_call_back sig_func); int pm_sig_del_watch(pid_t pid, int flags); \ No newline at end of file diff --git a/mkrtos_user/lib/sys_util/src/u_sig.c b/mkrtos_user/lib/sys_util/src/u_sig.c index 5d738a04e..92dbf2e7b 100644 --- a/mkrtos_user/lib/sys_util/src/u_sig.c +++ b/mkrtos_user/lib/sys_util/src/u_sig.c @@ -40,9 +40,12 @@ int pm_sig_del_watch(pid_t pid, int flags) { return pm_del_watch_pid(pid, flags); } -void pm_sig_func_set(sig_call_back sig_func) +sig_call_back pm_sig_func_set(sig_call_back sig_func) { + sig_call_back tmp = sig_cb_func; + sig_cb_func = sig_func; + return tmp; } static int kill(int flags, int pid) diff --git a/mkrtos_user/server/fs/appfs/fs_rpc.c b/mkrtos_user/server/fs/appfs/fs_rpc.c index f94c998b4..163a19a36 100644 --- a/mkrtos_user/server/fs/appfs/fs_rpc.c +++ b/mkrtos_user/server/fs/appfs/fs_rpc.c @@ -13,41 +13,66 @@ #include #include "kstat.h" #include "appfs_open.h" + static fs_t fs; +static int fs_sig_call_back(pid_t pid, umword_t sig_val) +{ + switch (sig_val) + { + case KILL_SIG: + appfs_task_free(pid); + break; + } + return 0; +} + int fs_svr_open(const char *path, int flags, int mode) { int fd; + pid_t pid = thread_get_src_pid(); fd = appfs_open(path, flags, mode); + + if (fd >= 0) + { +#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; } int fs_svr_read(int fd, void *buf, size_t len) { - int ret; + int ret; - ret = appfs_read(fd, buf, len); + ret = appfs_read(fd, buf, len); - return ret; + return ret; } int fs_svr_write(int fd, void *buf, size_t len) { - int ret; + int ret; - ret = appfs_write(fd, buf, len); - return ret; + ret = appfs_write(fd, buf, len); + return ret; } void fs_svr_close(int fd) { - appfs_close(fd); + appfs_close(fd); } int fs_svr_readdir(int fd, dirent_t *dir) { - int ret; + int ret; - ret = appfs_readdir(fd, dir); - return ret; + ret = appfs_readdir(fd, dir); + return ret; } int fs_svr_lseek(int fd, int offs, int whence) { @@ -146,7 +171,9 @@ static const fs_operations_t ops = }; void fs_svr_init(void) { - fs_init(&fs, &ops); meta_reg_svr_obj(&fs.svr, FS_PROT); +#ifdef CONFIG_USING_SIG + pm_sig_func_set(fs_sig_call_back); +#endif } diff --git a/mkrtos_user/server/fs/appfs/src/appfs_open.c b/mkrtos_user/server/fs/appfs/src/appfs_open.c index 5ebf2d1f2..0248280ce 100644 --- a/mkrtos_user/server/fs/appfs/src/appfs_open.c +++ b/mkrtos_user/server/fs/appfs/src/appfs_open.c @@ -10,7 +10,9 @@ #include #include #include "appfs.h" - +#ifdef MKRTOS +#include +#endif static fs_info_t *fs; #define DIR_INFO_CACHE_NR 32 @@ -78,16 +80,27 @@ typedef struct appfs_file uint8_t flags; //!< 文件操作的flags int offset; //!< 文件操作的偏移 enum appfs_type type; //!< 类型 - uint8_t used; - // int pid; //!< 属于哪个进程 - // pthread_mutex_t mutex; //!< 锁 + uint8_t used; //!< 使用中 + int pid; //!< 属于哪个进程 } appfs_file_t; static appfs_file_t appfs_files[DIR_INFO_NR]; static appfs_file_t *appfs_get_file(int fd); -static int appfs_file_alloc(const dir_info_t *file, int flags, enum appfs_type type) +void appfs_task_free(int pid) +{ + for (int i = 0; i < DIR_INFO_NR; i++) + { + if (appfs_files[i].dir_info_fd != -1) + { + appfs_close(i); + printf("free fd:%d\n", i); + } + } +} + +static int appfs_file_alloc(const dir_info_t *file, int flags, enum appfs_type type, int pid) { int dir_info_fd = -1; @@ -108,11 +121,10 @@ static int appfs_file_alloc(const dir_info_t *file, int flags, enum appfs_type t // 不存在则增加一个新的 appfs_files[i].dir_info_fd = dir_info_fd; appfs_files[i].flags = flags; - // appfs_files[i].pid = pid; + appfs_files[i].pid = pid; appfs_files[i].offset = 0; appfs_files[i].type = type; appfs_files[i].used = 1; - // pthread_mutex_init(&appfs_files[i].mutex, NULL); return i; } } @@ -134,6 +146,11 @@ static appfs_file_t *appfs_get_file(int fd) int appfs_open(const char *name, int flags, int mode) { +#ifdef MKRTOS + int pid = thread_get_src_pid(); +#else + int pid = 0; +#endif int ret; const dir_info_t *file; int fd; @@ -163,7 +180,7 @@ int appfs_open(const char *name, int flags, int mode) { return -ENOENT; } - fd = appfs_file_alloc(file, flags, type); + fd = appfs_file_alloc(file, flags, type, pid); if (fd < 0) { return fd; @@ -171,7 +188,7 @@ int appfs_open(const char *name, int flags, int mode) } else if (type == APPFS_DIR_TYPE) { - fd = appfs_file_alloc(NULL, flags, type); + fd = appfs_file_alloc(NULL, flags, type, pid); if (fd < 0) { return fd; @@ -233,7 +250,7 @@ int appfs_read(int fd, void *data, int len) int appfs_ioctl(int fd, unsigned long cmd, unsigned long arg) { #ifdef MKRTOS - pid_t src_pid = thread_get_src_pid(); + int src_pid = thread_get_src_pid(); #endif appfs_file_t *file = appfs_get_file(fd); int ret = 0; @@ -440,7 +457,7 @@ int appfs_close(int fd) } } file->dir_info_fd = -1; - // file->pid = -1; + file->pid = -1; file->flags = 0; file->offset = 0; file->used = 0; diff --git a/mkrtos_user/server/fs/appfs/src/appfs_open.h b/mkrtos_user/server/fs/appfs/src/appfs_open.h index 1432bf4e4..0eb3f967b 100644 --- a/mkrtos_user/server/fs/appfs/src/appfs_open.h +++ b/mkrtos_user/server/fs/appfs/src/appfs_open.h @@ -3,6 +3,7 @@ #include #include "appfs.h" #include "kstat.h" +#include enum appfs_ioctl_cmd_op { APPFS_IOCTOL_GET_ACCESS_ADDR, @@ -13,6 +14,7 @@ typedef struct appfs_ioctl_arg unsigned long size; } appfs_ioctl_arg_t; +void appfs_task_free(int pid); int appfs_open(const char *name, int flags, int mode); int appfs_write(int fd, void *data, int len); int appfs_read(int fd, void *data, int len); diff --git a/mkrtos_user/server/fs/fatfs/CMakeLists.txt b/mkrtos_user/server/fs/fatfs/CMakeLists.txt index 23577c825..03c3d6086 100644 --- a/mkrtos_user/server/fs/fatfs/CMakeLists.txt +++ b/mkrtos_user/server/fs/fatfs/CMakeLists.txt @@ -26,6 +26,7 @@ target_link_libraries( sys sys_util sys_svr + fd # stm32f1_bsp ${GCC_LIB_PATH}/libgcc.a ) @@ -41,12 +42,15 @@ target_include_directories( ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/stm32f1_bsp/inc ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/stm32f1_bsp/core_inc ${CMAKE_SOURCE_DIR}/mkrtos_user/server/fs/fatfs/ext_disk_drv + + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/fd ) add_dependencies( fatfs.elf ${START_LIB} sys sys_util + fd # stm32f1_bsp ) set_target_properties( diff --git a/mkrtos_user/server/fs/fatfs/fs_rpc.c b/mkrtos_user/server/fs/fatfs/fs_rpc.c index e40f6736c..6437a7397 100644 --- a/mkrtos_user/server/fs/fatfs/fs_rpc.c +++ b/mkrtos_user/server/fs/fatfs/fs_rpc.c @@ -14,76 +14,22 @@ #include #include #include +#include +#include "fd.h" static fs_t fs; static int fs_sig_call_back(pid_t pid, umword_t sig_val); -typedef struct file_desc +typedef struct file_desc_priv { union { FIL fp; FATFS_DIR dir; }; - pid_t pid; uint8_t type; //!< 0:file 1:dir -} file_desc_t; +} file_desc_priv_t; -#define FILE_DESC_NR 8 //!< 最多同时可以打开多少个文件 -static file_desc_t files[FILE_DESC_NR]; //!< 预先设置的文件描述符 void fs_svr_close(int fd); -static void free_fd(pid_t pid) -{ - for (int i = 0; i < FILE_DESC_NR; i++) - { - if (files[i].fp.obj.fs) - { - fs_svr_close(i); - files[i].fp.obj.fs = NULL; - files[i].pid = 0; - } - } -} - -static int fs_sig_call_back(pid_t pid, umword_t sig_val) -{ - switch (sig_val) - { - case KILL_SIG: - free_fd(pid); - break; - } - return 0; -} - -static file_desc_t *alloc_file(int *fd) -{ - for (int i = 0; i < FILE_DESC_NR; i++) - { - if (files[i].fp.obj.fs == NULL) - { - *fd = i; - files[i].pid = thread_get_src_pid(); - return &files[i]; - } - } - return NULL; -} -static void free_file(int fd) -{ - files[fd].fp.obj.fs = NULL; -} -static file_desc_t *file_get(int fd) -{ - if (fd < 0 || fd >= FILE_DESC_NR) - { - return NULL; - } - if (files[fd].fp.obj.fs == NULL) - { - return NULL; - } - return files + fd; -} static int fatfs_err_conv(FRESULT res) { switch (res) @@ -116,15 +62,23 @@ static int fatfs_err_conv(FRESULT res) } int fs_svr_open(const char *path, int flags, int mode) { - // printf("open %s.\n", path); int fd; pid_t pid = thread_get_src_pid(); - file_desc_t *file = alloc_file(&fd); + file_desc_priv_t *file = NULL; - if (!file) + file = u_malloc(sizeof(*file)); + if (file == NULL) { return -ENOMEM; } + + fd = file_desc_alloc(pid, file, fs_svr_close); + + if (fd < 0) + { + u_free(file); + return fd; + } int new_mode = 0; switch (flags & O_ACCMODE) @@ -164,7 +118,8 @@ int fs_svr_open(const char *path, int flags, int mode) if (ret != FR_OK) { cons_write_str("open fail..\n"); - free_file(fd); + file_desc_free(fd); + u_free(file); return fatfs_err_conv(ret); } file->type = 1; @@ -179,6 +134,8 @@ int fs_svr_open(const char *path, int flags, int mode) if (ret != FR_OK) { + file_desc_free(fd); + u_free(file); return fatfs_err_conv(ret); } #ifdef CONFIG_USING_SIG @@ -194,17 +151,19 @@ int fs_svr_open(const char *path, int flags, int mode) int fs_svr_read(int fd, void *buf, size_t len) { UINT br; - file_desc_t *file = file_get(fd); + file_desc_t *file = file_desc_get(fd); + file_desc_priv_t *file_priv = NULL; - if (!file) + if (!file || file->priv == NULL) { return -ENOENT; } - if (file->type != 0) + file_priv = file->priv; + if (file_priv->type != 0) { return -EACCES; } - FRESULT ret = f_read(&file->fp, buf, len, &br); + FRESULT ret = f_read(&file_priv->fp, buf, len, &br); if (ret != FR_OK) { @@ -215,17 +174,19 @@ int fs_svr_read(int fd, void *buf, size_t len) int fs_svr_write(int fd, void *buf, size_t len) { UINT bw; - file_desc_t *file = file_get(fd); + file_desc_t *file = file_desc_get(fd); + file_desc_priv_t *file_priv = NULL; - if (!file) + if (!file || file->priv == NULL) { return -ENOENT; } - if (file->type != 0) + file_priv = file->priv; + if (file_priv->type != 0) { return -EACCES; } - FRESULT ret = f_write(&file->fp, buf, len, &bw); + FRESULT ret = f_write(&file_priv->fp, buf, len, &bw); if (ret != FR_OK) { @@ -235,33 +196,40 @@ int fs_svr_write(int fd, void *buf, size_t len) } void fs_svr_close(int fd) { - file_desc_t *file = file_get(fd); + file_desc_t *file = file_desc_get(fd); + file_desc_priv_t *file_priv = NULL; - if (!file) + if (!file || file->priv == NULL) { return; } - switch (file->type) + file_priv = file->priv; + + switch (file_priv->type) { case 0: - f_close(&file->fp); + f_close(&file_priv->fp); break; case 1: - f_closedir(&file->dir); + f_closedir(&file_priv->dir); break; } - file->fp.obj.fs = NULL; + file_priv->fp.obj.fs = NULL; + file_desc_free_unlock(fd); + u_free(file_priv); } int fs_svr_readdir(int fd, dirent_t *dir) { - file_desc_t *file = file_get(fd); + file_desc_t *file = file_desc_get(fd); + file_desc_priv_t *file_priv = NULL; - if (!file) + if (!file || file->priv == NULL) { return -ENOENT; } + file_priv = file->priv; FILINFO info; - FRESULT ret = f_readdir(&file->dir, &info); + FRESULT ret = f_readdir(&file_priv->dir, &info); if (ret != FR_OK || info.fname[0] == 0) { @@ -284,14 +252,18 @@ int fs_svr_readdir(int fd, dirent_t *dir) int fs_svr_lseek(int fd, int offs, int whence) { UINT bw; - file_desc_t *file = file_get(fd); + file_desc_t *file = file_desc_get(fd); + file_desc_priv_t *file_priv = NULL; + int new_offs = 0; - if (!file) + if (!file || file->priv == NULL) { return -ENOENT; } - if (file->type != 0) + file_priv = file->priv; + + if (file_priv->type != 0) { return -EACCES; } @@ -302,58 +274,62 @@ int fs_svr_lseek(int fd, int offs, int whence) break; case SEEK_END: { - new_offs = f_size(&file->fp) + offs; + new_offs = f_size(&file_priv->fp) + offs; } break; case SEEK_CUR: { - new_offs = offs + f_tell(&file->fp); + new_offs = offs + f_tell(&file_priv->fp); } break; default: return -EINVAL; } #if 0 - if (new_offs > f_size(&file->fp)) { - new_offs = f_size(&file->fp); + if (new_offs > f_size(&file_priv->fp)) { + new_offs = f_size(&file_priv->fp); } #endif if (new_offs < 0) { new_offs = 0; } - FRESULT ret = f_lseek(&file->fp, new_offs); + FRESULT ret = f_lseek(&file_priv->fp, new_offs); return fatfs_err_conv(ret); } int fs_svr_ftruncate(int fd, off_t off) { - file_desc_t *file = file_get(fd); + file_desc_t *file = file_desc_get(fd); + file_desc_priv_t *file_priv = NULL; - if (!file) + if (!file || file->priv == NULL) { return -ENOENT; } - if (file->type != 0) + file_priv = file->priv; + if (file_priv->type != 0) { return -EACCES; } - FRESULT ret = f_truncate(&file->fp); + FRESULT ret = f_truncate(&file_priv->fp); return fatfs_err_conv(ret); } int fs_svr_fstat(int fd, void *_stat) { struct kstat *stat = _stat; - file_desc_t *file = file_get(fd); + file_desc_t *file = file_desc_get(fd); + file_desc_priv_t *file_priv = NULL; - if (!file) + if (!file || file->priv == NULL) { return -ENOENT; } + file_priv = file->priv; memset(stat, 0, sizeof(*stat)); - stat->st_size = file->type == 1 ? 0 : f_size(&file->fp); - stat->st_mode = file->type == 1 ? S_IFDIR : S_IFREG; + stat->st_size = file_priv->type == 1 ? 0 : f_size(&file_priv->fp); + stat->st_mode = file_priv->type == 1 ? S_IFDIR : S_IFREG; stat->st_blksize = 0; return 0; } @@ -363,17 +339,19 @@ int fs_svr_ioctl(int fd, int req, void *arg) } int fs_svr_fsync(int fd) { - file_desc_t *file = file_get(fd); + file_desc_t *file = file_desc_get(fd); + file_desc_priv_t *file_priv = NULL; - if (!file) + if (!file || file->priv == NULL) { return -EBADFD; } - if (file->type != 0) + file_priv = file->priv; + if (file_priv->type != 0) { return -EBADFD; } - f_sync(&file->fp); + f_sync(&file_priv->fp); return 0; } int fs_svr_unlink(const char *path) @@ -457,7 +435,5 @@ void fs_svr_init(void) { fs_init(&fs, &ops); meta_reg_svr_obj(&fs.svr, FS_PROT); -#ifdef CONFIG_USING_SIG - pm_sig_func_set(fs_sig_call_back); -#endif + file_desc_init(); } diff --git a/mkrtos_user/server/init/src/pm.c b/mkrtos_user/server/init/src/pm.c index f8c6f3309..f7a035281 100644 --- a/mkrtos_user/server/init/src/pm.c +++ b/mkrtos_user/server/init/src/pm.c @@ -170,7 +170,7 @@ static bool_t pm_send_sig_to_task(pm_t *pm, pid_t pid, umword_t sig_val) } slist_del(&pos->node); handler_free_umap(pos->sig_hd); //!< 删除信号通知的ipc - handler_del_umap(pos->watch_pid); //!< 删除被watch的进程 + handler_free_umap(pos->watch_pid); //!< 删除被watch的进程 u_free(pos); } pos = next; diff --git a/mkrtos_user/user/app/CMakeLists.txt b/mkrtos_user/user/app/CMakeLists.txt index 43e5e5957..b319775ea 100644 --- a/mkrtos_user/user/app/CMakeLists.txt +++ b/mkrtos_user/user/app/CMakeLists.txt @@ -3,6 +3,7 @@ cmake_minimum_required(VERSION 3.13) # add_subdirectory(coremark) # add_subdirectory(tinycc-arm-thumb) add_subdirectory(test) +add_subdirectory(test2) add_subdirectory(vi) add_subdirectory(binutils-2.33.1) # add_subdirectory(share_lib_test) diff --git a/mkrtos_user/user/app/test2/CMakeLists.txt b/mkrtos_user/user/app/test2/CMakeLists.txt new file mode 100644 index 000000000..23ab69d83 --- /dev/null +++ b/mkrtos_user/user/app/test2/CMakeLists.txt @@ -0,0 +1,64 @@ +cmake_minimum_required(VERSION 3.13) + + +file( + GLOB deps + *.c +) + +add_executable( + tst2.elf + ${deps} + ${START_SRC} +) +target_link_libraries( + tst2.elf + PUBLIC + -Bstatic + ${LIBC_NAME} + --whole-archive + ${START_LIB} + libc_be + sys + sys_util + sys_svr + --no-whole-archive + ${GCC_LIB_PATH}/libgcc.a +) +target_include_directories( + tst2.elf + PUBLIC + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_svr/inc + + ${CMAKE_CURRENT_SOURCE_DIR}/ + + ${CMAKE_SOURCE_DIR}/mkrtos_user/user/drv/lib/mk_pin + ${CMAKE_SOURCE_DIR}/mkrtos_user/user/drv/lib/mk_drv + ${CMAKE_SOURCE_DIR}/mkrtos_user/user/drv/lib/mk_display +) +add_dependencies( + tst2.elf + ${START_LIB} + sys + sys_util +) +set_target_properties( + tst2.elf PROPERTIES LINK_FLAGS + "-T ${CMAKE_CURRENT_LIST_DIR}/${ARCH_NAME}/link.lds ${CORTEX_M_LINK_FLAGS} --gc-section -no-dynamic-linker " + #--no-warn-rwx-segments +) +add_custom_target( + tst2_dump ALL + COMMAND + ${CMAKE_OBJCOPY} -O binary -S tst2.elf tst2.bin + COMMAND + ${CMAKE_SIZE} tst2.elf + COMMAND + ${CMAKE_COMMAND} -E copy tst2.bin ${CMAKE_SOURCE_DIR}/build/output/cpio/tst2 + COMMAND + cp tst2.elf ${CMAKE_SOURCE_DIR}/build/output/tst2.elf +) + +add_dependencies(tst2_dump tst2.elf) + \ No newline at end of file diff --git a/mkrtos_user/user/app/test2/armv7_8m/link.lds b/mkrtos_user/user/app/test2/armv7_8m/link.lds new file mode 100644 index 000000000..34fdd0c60 --- /dev/null +++ b/mkrtos_user/user/app/test2/armv7_8m/link.lds @@ -0,0 +1,124 @@ +ENTRY(_start_) + +SECTIONS +{ + .text : { + . = ALIGN(4); + __text_start__ = .; + KEEP(*(.first)) + *(.text) + *(.text.*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(SORT(.rodata.*)) + *(.rodata) + + KEEP(*(.eh_frame*)) + + . = ALIGN(4); + __rel_start__ = .; + *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) + __rel_end__ = .; + } + .ARM.exidx : { + . = ALIGN(4); + __exdix_start = .; + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + /* This is used by the startup in order to initialize the .data secion */ + __exdix_end = .; + } + + .permissions_table : { + . = ALIGN(4); + __permissions_table_start__ = .; + KEEP(*(.permissions_table)) + __permissions_table_end__ = .; + } + + + PROVIDE(__ram_size__ = __bss_end__ - __data_start__); + .data : { + . = ALIGN(4); + __data_start__ = .; + __got_start__ = .; + *(.got) + __got_end__ = .; + . = ALIGN(4); + *(.data) + *(.data.*) + + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + . = ALIGN(4); + _shell_command_start = .; + KEEP(*(shellCommand)) + _shell_command_end = .; + + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + } + + PROVIDE(__heap_size__ = __heap_end__ - __heap_start__); + PROVIDE(__stack_size__ = __stack_end__ - __stack_start__); + .bss : { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + __bss_start__ = .; + *(.bss) + *(COMMON) + + . = ALIGN(4); + __heap_start__ = .; + KEEP(*(.bss.heap)) + __heap_end__ = .; + + . = ALIGN(4); + __stack_start__ = .; + KEEP(*(.bss.stack)) + __stack_end__ = .; + + *(.bss.*) + /* This is used by the startup in order to initialize the .bss secion */ + . = ALIGN(4); + __bss_end__ = .; + } + _end = .; +} diff --git a/mkrtos_user/user/app/test2/heap_stack.c b/mkrtos_user/user/app/test2/heap_stack.c new file mode 100644 index 000000000..d1ae0a3c1 --- /dev/null +++ b/mkrtos_user/user/app/test2/heap_stack.c @@ -0,0 +1,17 @@ + +#define HEAP_SIZE (10*1024) +#define STACK_SIZE (1024 * 2) + +#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 __attribute__((__section__(".bss.heap"))) +#define STACK_ATTR __attribute__((__section__(".bss.stack"))) +#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/user/app/test2/main.c b/mkrtos_user/user/app/test2/main.c new file mode 100644 index 000000000..53312f302 --- /dev/null +++ b/mkrtos_user/user/app/test2/main.c @@ -0,0 +1,24 @@ + +#include "u_task.h" +#include +#include +#include +#include +#include +#include +#include +#include +int main(int argc, char *argv[]) +{ + int fd; + + task_set_obj_name(TASK_THIS, TASK_THIS, "tk_tst2"); + task_set_obj_name(TASK_THIS, THREAD_MAIN, "th_tst2"); + fd = open("/mnt/1.txt", O_RDWR | O_CREAT, 0777); + if (fd < 0) { + printf("open faile:%d.\n", fd); + return fd; + } + exit(-3333); + return 0; +}