diff --git a/.vscode/settings.json b/.vscode/settings.json index 7f2cb407f..d9f4234a0 100755 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -264,7 +264,8 @@ "shell_cfg.h": "c", "__memory": "c", "optional": "c", - "system_error": "c" + "system_error": "c", + "__dirent.h": "c" }, "cortex-debug.showRTOS": false, "cortex-debug.variableUseNaturalFormat": false, diff --git a/mkrtos_knl/knl/globals.c b/mkrtos_knl/knl/globals.c index 054e40635..614d0d240 100755 --- a/mkrtos_knl/knl/globals.c +++ b/mkrtos_knl/knl/globals.c @@ -18,7 +18,7 @@ #include "mm_man.h" #include "ipc.h" static mem_t global_mem; //!< 全局内存管理块 -static uint8_t mem_block[59 * 1024]; //!< 内核内存分配堆 TODO:自动识别大小,或者从bootstrap中读取 +static uint8_t mem_block[1019 * 1024]; //!< 内核内存分配堆 TODO:自动识别大小,或者从bootstrap中读取 static kobject_t *kobj_ls[FACTORY_FUNC_MAX]; //!< 全局静态内核对象 void global_reg_kobj(kobject_t *kobj, int inx) diff --git a/mkrtos_knl/stm32_link.lds b/mkrtos_knl/stm32_link.lds index b174351dc..2cccee8c4 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 = 64K + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 1024K FLASH (rx) : ORIGIN = 0x8000000 + 0x2000, LENGTH = 64K - 0x2000 } SECTIONS diff --git a/mkrtos_script/build.sh b/mkrtos_script/build.sh index 670e2b8ed..f079364a1 100755 --- a/mkrtos_script/build.sh +++ b/mkrtos_script/build.sh @@ -9,7 +9,7 @@ export INIT_OFFSET=0x10000 export BOOTFS_ADDR_OFFSET=0x20000 export KNL_TEXT=0x8000000 export KNL_DATA=0x20000000 -export KNL_DATA_SIZE=64K +export KNL_DATA_SIZE=1024K export BOARD=STM32F2x export ARCH=cortex-m3 export PYTHON_EXECUTABLE=python3 diff --git a/mkrtos_user/lib/letter-shell/demo/mkrtos/CMakeLists.txt b/mkrtos_user/lib/letter-shell/demo/mkrtos/CMakeLists.txt index 613b486a3..73c064a25 100644 --- a/mkrtos_user/lib/letter-shell/demo/mkrtos/CMakeLists.txt +++ b/mkrtos_user/lib/letter-shell/demo/mkrtos/CMakeLists.txt @@ -15,7 +15,7 @@ add_library(LetterShell ../../src/shell_companion.c ../../src/shell_ext.c ../../src/shell_cmd_list.c - ../../extensions/fs_support/shell_fs.c + # ../../extensions/fs_support/shell_fs.c ../../extensions/log/log.c # ../../extensions/telnet/telnetd.c ../../extensions/shell_enhance/shell_passthrough.c diff --git a/mkrtos_user/lib/letter-shell/src/shell_cfg.h b/mkrtos_user/lib/letter-shell/src/shell_cfg.h index 4b927a753..0018dcd3b 100644 --- a/mkrtos_user/lib/letter-shell/src/shell_cfg.h +++ b/mkrtos_user/lib/letter-shell/src/shell_cfg.h @@ -39,14 +39,14 @@ * @brief 是否使用shell伴生对象 * 一些扩展的组件(文件系统支持,日志工具等)需要使用伴生对象 */ -#define SHELL_USING_COMPANION 1 +#define SHELL_USING_COMPANION 0 #endif /** SHELL_USING_COMPANION */ #ifndef SHELL_SUPPORT_END_LINE /** * @brief 支持shell尾行模式 */ -#define SHELL_SUPPORT_END_LINE 0 +#define SHELL_SUPPORT_END_LINE 1 #endif /** SHELL_SUPPORT_END_LINE */ #ifndef SHELL_HELP_LIST_USER @@ -107,7 +107,7 @@ * 启用后,可以通过`exec [addr] [args]`直接执行对应地址的函数 * @attention 如果地址错误,可能会直接引起程序崩溃 */ -#define SHELL_EXEC_UNDEF_FUNC 1 +#define SHELL_EXEC_UNDEF_FUNC 0 #endif /** SHELL_EXEC_UNDEF_FUNC */ #ifndef SHELL_PARAMETER_MAX_NUMBER diff --git a/mkrtos_user/lib/libc_backend/inc/syscall_backend.h b/mkrtos_user/lib/libc_backend/inc/syscall_backend.h index d75b4d3eb..c3f77bf87 100644 --- a/mkrtos_user/lib/libc_backend/inc/syscall_backend.h +++ b/mkrtos_user/lib/libc_backend/inc/syscall_backend.h @@ -4,6 +4,7 @@ #include "u_types.h" #include #include +#include // #include #define ARG_1_BE(ap, arg0, type0) \ @@ -51,6 +52,9 @@ long syscall_backend(long sys_inx, ...); void fs_backend_init(void); +long be_lseek(long fd, long offset, long whence); +int be_open(const char *path, int flags, mode_t mode); +int be_close(int fd); long be_read(long fd, char *buf, long size); long be_write(long fd, char *buf, long size); long be_readv(long fd, const struct iovec *iov, long iovcnt); diff --git a/mkrtos_user/lib/libc_backend/src/fs_backend.c b/mkrtos_user/lib/libc_backend/src/fs_backend.c index 84a676418..19daf06ec 100644 --- a/mkrtos_user/lib/libc_backend/src/fs_backend.c +++ b/mkrtos_user/lib/libc_backend/src/fs_backend.c @@ -21,6 +21,47 @@ void fs_backend_init(void) assert(fd_map_alloc(0, 1, FD_TTY) >= 0); assert(fd_map_alloc(0, 2, FD_TTY) >= 0); } +int be_open(const char *path, int flags, mode_t mode) +{ + int fd = fs_open(path, flags, mode); + + if (fd < 0) + { + return fd; + } + int user_fd = fd_map_alloc(0, fd, FD_FS); + + if (user_fd < 0) + { + be_close(user_fd); + } + return user_fd; +} +int be_close(int fd) +{ + fd_map_entry_t u_fd; + int ret = fd_map_free(fd, &u_fd); + + if (ret < 0) + { + return -EBADF; + } + switch (u_fd.type) + { + case FD_TTY: + { + } + break; + case FD_FS: + { + return fs_close(u_fd.priv_fd); + } + break; + default: + return -ENOSYS; + } + return 0; +} static int be_tty_read(char *buf, long size) { pid_t pid; @@ -75,7 +116,7 @@ long be_read(long fd, char *buf, long size) break; case FD_FS: { - return fs_read(fd, buf, size); + return fs_read(u_fd.priv_fd, buf, size); } break; default: @@ -113,7 +154,7 @@ long be_write(long fd, char *buf, long size) break; case FD_FS: { - return fs_write(fd, buf, size); + return fs_write(u_fd.priv_fd, buf, size); } break; default: @@ -164,7 +205,7 @@ long be_readv(long fd, const struct iovec *iov, long iovcnt) break; case FD_FS: { - int rsize = fs_read(fd, iov[i].iov_base, iov[i].iov_len); + int rsize = fs_read(u_fd.priv_fd, iov[i].iov_base, iov[i].iov_len); wlen += rsize; } @@ -207,7 +248,7 @@ long be_writev(long fd, const struct iovec *iov, long iovcnt) break; case FD_FS: { - int wsize = fs_write(fd, iov[i].iov_base, iov[i].iov_len); + int wsize = fs_write(u_fd.priv_fd, iov[i].iov_base, iov[i].iov_len); wlen += wsize; } @@ -267,3 +308,28 @@ long sys_be_ioctl(va_list ap) #undef ARG2 return be_ioctl(fd, request, args); } +long be_lseek(long fd, long offset, long whence) +{ + fd_map_entry_t u_fd; + int ret = fd_map_get(fd, &u_fd); + + if (ret < 0) + { + return -EBADF; + } + switch (u_fd.type) + { + case FD_TTY: + { + } + break; + case FD_FS: + { + return fs_lseek(u_fd.priv_fd, offset, whence); + } + break; + default: + return -ENOSYS; + } + return 0; +} \ No newline at end of file diff --git a/mkrtos_user/lib/mlibc/obj/include/bits/syscall.h b/mkrtos_user/lib/mlibc/obj/include/bits/syscall.h index e0359b4a0..d97ac48aa 100644 --- a/mkrtos_user/lib/mlibc/obj/include/bits/syscall.h +++ b/mkrtos_user/lib/mlibc/obj/include/bits/syscall.h @@ -516,7 +516,7 @@ #define SYS_personality 136 #define SYS_setfsuid 138 #define SYS_setfsgid 139 -#define SYS__llseek 140 +// #define SYS__llseek 140 #define SYS_getdents 141 #define SYS__newselect 142 #define SYS_flock 143 diff --git a/mkrtos_user/lib/mlibc/src/dirent/opendir.c b/mkrtos_user/lib/mlibc/src/dirent/opendir.c index 5cb84e303..626205245 100644 --- a/mkrtos_user/lib/mlibc/src/dirent/opendir.c +++ b/mkrtos_user/lib/mlibc/src/dirent/opendir.c @@ -4,16 +4,22 @@ #include #include "__dirent.h" #include "syscall.h" - +#ifndef NO_LITTLE_MODE +#include "syscall_backend.h" +#endif DIR *opendir(const char *name) { int fd; DIR *dir; - if ((fd = open(name, O_RDONLY|O_DIRECTORY|O_CLOEXEC)) < 0) +#ifdef NO_LITTLE_MODE + if ((fd = open(name, O_RDONLY | O_DIRECTORY | O_CLOEXEC)) < 0) +#else + if ((fd = be_open(name, O_RDONLY | O_DIRECTORY | O_CLOEXEC, 0)) < 0) +#endif return 0; if (!(dir = calloc(1, sizeof *dir))) { - __syscall(SYS_close, fd); + be_close(fd); return 0; } dir->fd = fd; diff --git a/mkrtos_user/lib/mlibc/src/fcntl/fcntl.c b/mkrtos_user/lib/mlibc/src/fcntl/fcntl.c index d3bff5c48..705b1fa45 100644 --- a/mkrtos_user/lib/mlibc/src/fcntl/fcntl.c +++ b/mkrtos_user/lib/mlibc/src/fcntl/fcntl.c @@ -29,7 +29,7 @@ int fcntl(int fd, int cmd, ...) } ret = __syscall(SYS_fcntl, fd, F_DUPFD_CLOEXEC, 0); if (ret != -EINVAL) { - if (ret >= 0) __syscall(SYS_close, ret); + if (ret >= 0) be_close(ret); return __syscall_ret(-EINVAL); } ret = __syscall(SYS_fcntl, fd, F_DUPFD, arg); diff --git a/mkrtos_user/lib/mlibc/src/fcntl/open.c b/mkrtos_user/lib/mlibc/src/fcntl/open.c index 4c3c82759..f31ee4f24 100644 --- a/mkrtos_user/lib/mlibc/src/fcntl/open.c +++ b/mkrtos_user/lib/mlibc/src/fcntl/open.c @@ -1,20 +1,27 @@ #include #include #include "syscall.h" - +#ifndef NO_LITTLE_MODE +#include "syscall_backend.h" +#endif int open(const char *filename, int flags, ...) { mode_t mode = 0; - if ((flags & O_CREAT) || (flags & O_TMPFILE) == O_TMPFILE) { + if ((flags & O_CREAT) || (flags & O_TMPFILE) == O_TMPFILE) + { va_list ap; va_start(ap, flags); mode = va_arg(ap, mode_t); va_end(ap); } +#ifdef NO_LITTLE_MODE int fd = __sys_open_cp(filename, flags, mode); - if (fd>=0 && (flags & O_CLOEXEC)) +#else + int fd = be_open(filename, flags, mode); +#endif + if (fd >= 0 && (flags & O_CLOEXEC)) __syscall(SYS_fcntl, fd, F_SETFD, FD_CLOEXEC); return __syscall_ret(fd); diff --git a/mkrtos_user/lib/mlibc/src/mq/mq_notify.c b/mkrtos_user/lib/mlibc/src/mq/mq_notify.c index 0e1e6c7ab..f46a01fbd 100644 --- a/mkrtos_user/lib/mlibc/src/mq/mq_notify.c +++ b/mkrtos_user/lib/mlibc/src/mq/mq_notify.c @@ -6,7 +6,9 @@ #include #include #include "syscall.h" - +#ifndef NO_LITTLE_MODE +#include "syscall_backend.h" +#endif struct args { sem_t sem; int sock; @@ -68,7 +70,7 @@ int mq_notify(mqd_t mqd, const struct sigevent *sev) sigfillset(&allmask); pthread_sigmask(SIG_BLOCK, &allmask, &origmask); if (pthread_create(&td, &attr, start, &args)) { - __syscall(SYS_close, s); + be_close(s); pthread_sigmask(SIG_SETMASK, &origmask, 0); errno = EAGAIN; return -1; @@ -80,7 +82,7 @@ int mq_notify(mqd_t mqd, const struct sigevent *sev) sem_destroy(&args.sem); if (args.err) { - __syscall(SYS_close, s); + be_close(s); pthread_join(td, 0); pthread_setcancelstate(cs, 0); errno = args.err; diff --git a/mkrtos_user/lib/mlibc/src/network/if_indextoname.c b/mkrtos_user/lib/mlibc/src/network/if_indextoname.c index 3b368bf0d..a1c16d5d0 100644 --- a/mkrtos_user/lib/mlibc/src/network/if_indextoname.c +++ b/mkrtos_user/lib/mlibc/src/network/if_indextoname.c @@ -5,7 +5,9 @@ #include #include #include "syscall.h" - +#ifndef NO_LITTLE_MODE +#include "syscall_backend.h" +#endif char *if_indextoname(unsigned index, char *name) { struct ifreq ifr; @@ -14,7 +16,7 @@ char *if_indextoname(unsigned index, char *name) if ((fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0)) < 0) return 0; ifr.ifr_ifindex = index; r = ioctl(fd, SIOCGIFNAME, &ifr); - __syscall(SYS_close, fd); + be_close(fd); if (r < 0) { if (errno == ENODEV) errno = ENXIO; return 0; diff --git a/mkrtos_user/lib/mlibc/src/network/if_nametoindex.c b/mkrtos_user/lib/mlibc/src/network/if_nametoindex.c index 331413c68..f9cae7aed 100644 --- a/mkrtos_user/lib/mlibc/src/network/if_nametoindex.c +++ b/mkrtos_user/lib/mlibc/src/network/if_nametoindex.c @@ -4,7 +4,9 @@ #include #include #include "syscall.h" - +#ifndef NO_LITTLE_MODE +#include "syscall_backend.h" +#endif unsigned if_nametoindex(const char *name) { struct ifreq ifr; @@ -13,6 +15,6 @@ unsigned if_nametoindex(const char *name) if ((fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0)) < 0) return 0; strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); r = ioctl(fd, SIOCGIFINDEX, &ifr); - __syscall(SYS_close, fd); + be_close(fd); return r < 0 ? 0 : ifr.ifr_ifindex; } diff --git a/mkrtos_user/lib/mlibc/src/network/res_msend.c b/mkrtos_user/lib/mlibc/src/network/res_msend.c index 86c2fcf4f..bd8abf7f4 100644 --- a/mkrtos_user/lib/mlibc/src/network/res_msend.c +++ b/mkrtos_user/lib/mlibc/src/network/res_msend.c @@ -14,12 +14,14 @@ #include "stdio_impl.h" #include "syscall.h" #include "lookup.h" - +#ifndef NO_LITTLE_MODE +#include "syscall_backend.h" +#endif static void cleanup(void *p) { struct pollfd *pfd = p; for (int i=0; pfd[i].fd >= -1; i++) - if (pfd[i].fd >= 0) __syscall(SYS_close, pfd[i].fd); + if (pfd[i].fd >= 0) be_close(pfd[i].fd); } static unsigned long mtime() @@ -303,7 +305,7 @@ int __res_msend_rc(int nqueries, const unsigned char *const *queries, * Immediately close TCP socket so as not to consume * resources we no longer need. */ alens[i] = alen; - __syscall(SYS_close, pfd[i].fd); + be_close(pfd[i].fd); pfd[i].fd = -1; } } diff --git a/mkrtos_user/lib/mlibc/src/process/posix_spawn.c b/mkrtos_user/lib/mlibc/src/process/posix_spawn.c index 8b1fab5b2..0324f2a82 100644 --- a/mkrtos_user/lib/mlibc/src/process/posix_spawn.c +++ b/mkrtos_user/lib/mlibc/src/process/posix_spawn.c @@ -110,13 +110,13 @@ static int child(void *args_vp) ret = __syscall(SYS_dup, p); if (ret < 0) goto fail; - __syscall(SYS_close, p); + be_close(p); p = ret; } switch (op->cmd) { case FDOP_CLOSE: - __syscall(SYS_close, op->fd); + be_close(op->fd); break; case FDOP_DUP2: fd = op->srcfd; @@ -147,7 +147,7 @@ static int child(void *args_vp) { if ((ret = __sys_dup2(fd, op->fd)) < 0) goto fail; - __syscall(SYS_close, fd); + be_close(fd); } break; case FDOP_CHDIR: diff --git a/mkrtos_user/lib/mlibc/src/stat/fchmodat.c b/mkrtos_user/lib/mlibc/src/stat/fchmodat.c index bc581050e..996dfc0b2 100644 --- a/mkrtos_user/lib/mlibc/src/stat/fchmodat.c +++ b/mkrtos_user/lib/mlibc/src/stat/fchmodat.c @@ -2,7 +2,9 @@ #include #include #include "syscall.h" - +#ifndef NO_LITTLE_MODE +#include "syscall_backend.h" +#endif int fchmodat(int fd, const char *path, mode_t mode, int flag) { if (!flag) return syscall(SYS_fchmodat, fd, path, mode, flag); @@ -32,6 +34,6 @@ int fchmodat(int fd, const char *path, mode_t mode, int flag) else ret = syscall(SYS_fchmodat, AT_FDCWD, proc, mode); } - __syscall(SYS_close, fd2); + be_close(fd2); return ret; } diff --git a/mkrtos_user/lib/mlibc/src/stdio/fopen.c b/mkrtos_user/lib/mlibc/src/stdio/fopen.c index 80bc341e6..f026cca6b 100644 --- a/mkrtos_user/lib/mlibc/src/stdio/fopen.c +++ b/mkrtos_user/lib/mlibc/src/stdio/fopen.c @@ -2,7 +2,9 @@ #include #include #include - +#ifndef NO_LITTLE_MODE +#include "syscall_backend.h" +#endif FILE *fopen(const char *restrict filename, const char *restrict mode) { FILE *f; @@ -26,6 +28,6 @@ FILE *fopen(const char *restrict filename, const char *restrict mode) f = __fdopen(fd, mode); if (f) return f; - __syscall(SYS_close, fd); + be_close(fd); return 0; } diff --git a/mkrtos_user/lib/mlibc/src/stdio/popen.c b/mkrtos_user/lib/mlibc/src/stdio/popen.c index 3ec833941..ee68392d1 100644 --- a/mkrtos_user/lib/mlibc/src/stdio/popen.c +++ b/mkrtos_user/lib/mlibc/src/stdio/popen.c @@ -5,7 +5,9 @@ #include #include "stdio_impl.h" #include "syscall.h" - +#ifndef NO_LITTLE_MODE +#include "syscall_backend.h" +#endif extern char **__environ; FILE *popen(const char *cmd, const char *mode) @@ -27,8 +29,8 @@ FILE *popen(const char *cmd, const char *mode) if (pipe2(p, O_CLOEXEC)) return NULL; f = fdopen(p[op], mode); if (!f) { - __syscall(SYS_close, p[0]); - __syscall(SYS_close, p[1]); + be_close(p[0]); + be_close(p[1]); return NULL; } @@ -44,7 +46,7 @@ FILE *popen(const char *cmd, const char *mode) f->pipe_pid = pid; if (!strchr(mode, 'e')) fcntl(p[op], F_SETFD, 0); - __syscall(SYS_close, p[1-op]); + be_close(p[1-op]); __ofl_unlock(); return f; } @@ -54,7 +56,7 @@ fail: posix_spawn_file_actions_destroy(&fa); } fclose(f); - __syscall(SYS_close, p[1-op]); + be_close(p[1-op]); errno = e; return 0; diff --git a/mkrtos_user/lib/mlibc/src/stdio/tmpfile.c b/mkrtos_user/lib/mlibc/src/stdio/tmpfile.c index 2fa8803fc..0d620fca5 100644 --- a/mkrtos_user/lib/mlibc/src/stdio/tmpfile.c +++ b/mkrtos_user/lib/mlibc/src/stdio/tmpfile.c @@ -2,7 +2,9 @@ #include #include #include "stdio_impl.h" - +#ifndef NO_LITTLE_MODE +#include "syscall_backend.h" +#endif #define MAXTRIES 100 FILE *tmpfile(void) @@ -21,7 +23,7 @@ FILE *tmpfile(void) __syscall(SYS_unlinkat, AT_FDCWD, s, 0); #endif f = __fdopen(fd, "w+"); - if (!f) __syscall(SYS_close, fd); + if (!f) be_close(fd); return f; } } diff --git a/mkrtos_user/lib/mlibc/src/time/__map_file.c b/mkrtos_user/lib/mlibc/src/time/__map_file.c index c2b29fe81..2ff53645d 100644 --- a/mkrtos_user/lib/mlibc/src/time/__map_file.c +++ b/mkrtos_user/lib/mlibc/src/time/__map_file.c @@ -2,7 +2,9 @@ #include #include #include "syscall.h" - +#ifndef NO_LITTLE_MODE +#include "syscall_backend.h" +#endif const char unsigned *__map_file(const char *pathname, size_t *size) { struct stat st; @@ -13,6 +15,6 @@ const char unsigned *__map_file(const char *pathname, size_t *size) map = __mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0); *size = st.st_size; } - __syscall(SYS_close, fd); + be_close(fd); return map == MAP_FAILED ? 0 : map; } diff --git a/mkrtos_user/lib/mlibc/src/unistd/close.c b/mkrtos_user/lib/mlibc/src/unistd/close.c index a2105f506..83717d280 100644 --- a/mkrtos_user/lib/mlibc/src/unistd/close.c +++ b/mkrtos_user/lib/mlibc/src/unistd/close.c @@ -2,7 +2,9 @@ #include #include "aio_impl.h" #include "syscall.h" - +#ifndef NO_LITTLE_MODE +#include "syscall_backend.h" +#endif static int dummy(int fd) { return fd; @@ -13,7 +15,12 @@ weak_alias(dummy, __aio_close); int close(int fd) { fd = __aio_close(fd); +#ifdef NO_LITTLE_MODE int r = __syscall_cp(SYS_close, fd); - if (r == -EINTR) r = 0; +#else + int r = be_close(fd); +#endif + if (r == -EINTR) + r = 0; return __syscall_ret(r); } diff --git a/mkrtos_user/lib/mlibc/src/unistd/faccessat.c b/mkrtos_user/lib/mlibc/src/unistd/faccessat.c index a6e8b02a5..c3528b8c5 100644 --- a/mkrtos_user/lib/mlibc/src/unistd/faccessat.c +++ b/mkrtos_user/lib/mlibc/src/unistd/faccessat.c @@ -64,7 +64,7 @@ int faccessat(int fd, const char *filename, int amode, int flag) __block_all_sigs(&set); pid = __clone(checker, stack + sizeof stack, 0, &c); - __syscall(SYS_close, p[1]); + be_close(p[1]); #ifdef NO_LITTLE_MODE if (pid < 0 || __syscall(SYS_read, p[0], &ret, sizeof ret) != sizeof(ret)) @@ -73,7 +73,7 @@ int faccessat(int fd, const char *filename, int amode, int flag) if (pid < 0 || be_read(p[0], &ret, sizeof ret) != sizeof(ret)) ret = -EBUSY; #endif - __syscall(SYS_close, p[0]); + be_close(p[0]); __syscall(SYS_wait4, pid, &status, __WCLONE, 0); __restore_sigs(&set); diff --git a/mkrtos_user/lib/mlibc/src/unistd/lseek.c b/mkrtos_user/lib/mlibc/src/unistd/lseek.c index f5b66682a..8c307893a 100644 --- a/mkrtos_user/lib/mlibc/src/unistd/lseek.c +++ b/mkrtos_user/lib/mlibc/src/unistd/lseek.c @@ -1,13 +1,19 @@ #include #include "syscall.h" - +#ifndef NO_LITTLE_MODE +#include "syscall_backend.h" +#endif off_t __lseek(int fd, off_t offset, int whence) { #ifdef SYS__llseek off_t result; - return syscall(SYS__llseek, fd, offset>>32, offset, &result, whence) ? -1 : result; + return syscall(SYS__llseek, fd, offset >> 32, offset, &result, whence) ? -1 : result; #else +#ifdef NO_LITTLE_MODE return syscall(SYS_lseek, fd, offset, whence); +#else + return be_lseek(fd, offset, whence); +#endif #endif } diff --git a/mkrtos_user/lib/mlibc/src/unistd/write.c b/mkrtos_user/lib/mlibc/src/unistd/write.c index 8fd5bc5c2..f36a5d44a 100644 --- a/mkrtos_user/lib/mlibc/src/unistd/write.c +++ b/mkrtos_user/lib/mlibc/src/unistd/write.c @@ -1,7 +1,14 @@ #include #include "syscall.h" +#ifndef NO_LITTLE_MODE +#include "syscall_backend.h" +#endif ssize_t write(int fd, const void *buf, size_t count) { +#ifdef NO_LITTLE_MODE return syscall_cp(SYS_write, fd, buf, count); +#else + return be_write(fd, buf, count); +#endif } diff --git a/mkrtos_user/lib/sys_svr/inc/cons_cli.h b/mkrtos_user/lib/sys_svr/inc/cons_cli.h index f50ba9b9c..982fdd138 100644 --- a/mkrtos_user/lib/sys_svr/inc/cons_cli.h +++ b/mkrtos_user/lib/sys_svr/inc/cons_cli.h @@ -1,4 +1,5 @@ #pragma once +#include #include int cons_write(const uint8_t *data, int len); static inline int cons_write_str(const char *str) diff --git a/mkrtos_user/lib/sys_util/src/u_app_loader.c b/mkrtos_user/lib/sys_util/src/u_app_loader.c index 6daab5f1d..22cce18a9 100644 --- a/mkrtos_user/lib/sys_util/src/u_app_loader.c +++ b/mkrtos_user/lib/sys_util/src/u_app_loader.c @@ -61,7 +61,7 @@ int app_load(const char *name, uenv_t *cur_env, pid_t *pid) printf("app format is error.\n"); return -1; } - printf("%s addr is 0x%x\n", name, app); + printf("%s addr is [0x%x]\n", name, app); umword_t ram_base; obj_handler_t hd_task = handler_alloc(); obj_handler_t hd_thread = handler_alloc(); diff --git a/mkrtos_user/server/CMakeLists.txt b/mkrtos_user/server/CMakeLists.txt index 15b2d3021..ae9589c4f 100644 --- a/mkrtos_user/server/CMakeLists.txt +++ b/mkrtos_user/server/CMakeLists.txt @@ -18,4 +18,4 @@ add_subdirectory(app) add_subdirectory(fs) add_subdirectory(hello) add_subdirectory(drv) -# add_subdirectory(path_manager) +add_subdirectory(test) diff --git a/mkrtos_user/server/fs/fatfs/CMakeLists.txt b/mkrtos_user/server/fs/fatfs/CMakeLists.txt index 5e8306625..79688cc5f 100644 --- a/mkrtos_user/server/fs/fatfs/CMakeLists.txt +++ b/mkrtos_user/server/fs/fatfs/CMakeLists.txt @@ -5,11 +5,12 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_STDPERIPH_DRIVER=1 -DSTM32F10X_XL ") file( GLOB deps ff15/source/*.c - ext_disk_drv/*.c + # ext_disk_drv/*.c + ram_disk_drv/*.c *.c ) -list(REMOVE_ITEM deps mkrtos_user/server/fs/fatfs/ram_disk_drv/*.*) +# list(REMOVE_ITEM deps mkrtos_user/server/fs/fatfs/ram_disk_drv/*.*) add_executable( fatfs.elf diff --git a/mkrtos_user/server/fs/fatfs/fs_rpc.c b/mkrtos_user/server/fs/fatfs/fs_rpc.c index e6effdc4f..2eda0de3d 100644 --- a/mkrtos_user/server/fs/fatfs/fs_rpc.c +++ b/mkrtos_user/server/fs/fatfs/fs_rpc.c @@ -8,11 +8,13 @@ #include #include #include +#include +#include "rpc_prot.h" static fs_t fs; - void fs_svr_init(void) { fs_init(&fs); + meta_reg_svr_obj(&fs.svr, FS_PROT); } typedef struct file_desc { @@ -140,7 +142,7 @@ int fs_svr_open(const char *path, int flags, int mode) else { file->type = 0; - cons_write_str("open file..\n"); + // cons_write_str("open file..\n"); } return fatfs_err_conv(ret); diff --git a/mkrtos_user/server/fs/fatfs/fs_rpc.h b/mkrtos_user/server/fs/fatfs/fs_rpc.h index ccebef7a8..ae79b7a30 100644 --- a/mkrtos_user/server/fs/fatfs/fs_rpc.h +++ b/mkrtos_user/server/fs/fatfs/fs_rpc.h @@ -1,5 +1,5 @@ #pragma once -void fs_svr_init(obj_handler_t ipc); +void fs_svr_init(void); void fs_svr_loop(void); void *file_temp_buf_get(void); diff --git a/mkrtos_user/server/fs/fatfs/heap_stack.c b/mkrtos_user/server/fs/fatfs/heap_stack.c index 700c5a16d..dcc088c04 100644 --- a/mkrtos_user/server/fs/fatfs/heap_stack.c +++ b/mkrtos_user/server/fs/fatfs/heap_stack.c @@ -1,5 +1,5 @@ -#define HEAP_SIZE 0 +#define HEAP_SIZE 512 #define STACK_SIZE 1024 * 2 #if defined(__CC_ARM) diff --git a/mkrtos_user/server/fs/fatfs/main.c b/mkrtos_user/server/fs/fatfs/main.c index 2855a936e..a387bcf9d 100644 --- a/mkrtos_user/server/fs/fatfs/main.c +++ b/mkrtos_user/server/fs/fatfs/main.c @@ -15,12 +15,14 @@ static MKFS_PARM defopt = {FM_ANY, 0, 0, 0}; int main(int args, char *argv[]) { - obj_handler_t ipc_hd; - int ret = rpc_creaite_bind_ipc(THREAD_MAIN, NULL, &ipc_hd); - assert(ret >= 0); - ns_register("/mnt", ipc_hd); + obj_handler_t hd; + int ret; + + ret = rpc_meta_init(THREAD_MAIN, &hd); + assert(ret >= 0); + fs_svr_init(); + ns_register("/mnt", hd); - fs_svr_init(ipc_hd); FRESULT res = f_mount(&fs, "0:", 1); if (res != FR_OK) diff --git a/mkrtos_user/server/fs/fatfs/ram_disk_drv/diskio.c b/mkrtos_user/server/fs/fatfs/ram_disk_drv/diskio.c index 3223c6ab8..ab314f4ae 100644 --- a/mkrtos_user/server/fs/fatfs/ram_disk_drv/diskio.c +++ b/mkrtos_user/server/fs/fatfs/ram_disk_drv/diskio.c @@ -9,7 +9,7 @@ #include "ff.h" /* Obtains integer types */ #include "diskio.h" /* Declarations of disk functions */ -// #include "ram_disk.h" +#include "ram_disk.h" #include /* Definitions of physical drive number for each drive */ #define DEV_RAM 0 /* Example: Map Ramdisk to physical drive 0 */ diff --git a/mkrtos_user/server/test/CMakeLists.txt b/mkrtos_user/server/test/CMakeLists.txt index 642f7d797..2d2580b3e 100644 --- a/mkrtos_user/server/test/CMakeLists.txt +++ b/mkrtos_user/server/test/CMakeLists.txt @@ -6,10 +6,10 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_STDPERIPH_DRIVER=1 \ ") -add_executable(shell.elf +add_executable(test.elf ${deps} ) -target_link_libraries(shell.elf +target_link_libraries(test.elf PUBLIC start muslc @@ -19,7 +19,7 @@ target_link_libraries(shell.elf ${GCC_LIB_PATH}/libgcc.a ) target_include_directories( - shell.elf + test.elf PUBLIC ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_util/inc @@ -33,35 +33,35 @@ target_include_directories( ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/include ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/include - ${CMAKE_SOURCE_DIR}/mkrtos_user/server/shell/bsp/core_inc - ${CMAKE_SOURCE_DIR}/mkrtos_user/server/shell/bsp/inc + ${CMAKE_SOURCE_DIR}/mkrtos_user/server/test/bsp/core_inc + ${CMAKE_SOURCE_DIR}/mkrtos_user/server/test/bsp/inc ) -add_dependencies(shell.elf +add_dependencies(test.elf muslc ) -set_target_properties(shell.elf PROPERTIES LINK_FLAGS +set_target_properties(test.elf PROPERTIES LINK_FLAGS "-T ${CMAKE_CURRENT_LIST_DIR}/link.lds -pie --gc-section -no-dynamic-linker " #--no-warn-rwx-segments ) add_custom_target( - shell_dump ALL + test_dump ALL COMMAND - ${CMAKE_OBJDUMP} -s -S shell.elf > ${CMAKE_SOURCE_DIR}/build/output/shell.S + ${CMAKE_OBJDUMP} -s -S test.elf > ${CMAKE_SOURCE_DIR}/build/output/test.S COMMAND - ${CMAKE_READELF} -a shell.elf > ${CMAKE_SOURCE_DIR}/build/output/shell.txt + ${CMAKE_READELF} -a test.elf > ${CMAKE_SOURCE_DIR}/build/output/test.txt COMMAND - ${CMAKE_OBJCOPY} -O binary -S shell.elf shell.bin + ${CMAKE_OBJCOPY} -O binary -S test.elf test.bin COMMAND - ${CMAKE_SIZE} shell.elf + ${CMAKE_SIZE} test.elf COMMAND mkdir -p ${CMAKE_SOURCE_DIR}/build/output/cpio COMMAND - cp shell.bin ${CMAKE_SOURCE_DIR}/build/output/cpio/shell + cp test.bin ${CMAKE_SOURCE_DIR}/build/output/cpio/test COMMAND - cp shell.elf ${CMAKE_SOURCE_DIR}/build/output/shell.elf + cp test.elf ${CMAKE_SOURCE_DIR}/build/output/test.elf ) -add_dependencies(shell_dump shell.elf) -add_dependencies(shell_dump sys) -add_dependencies(shell_dump sys_util) +add_dependencies(test_dump test.elf) +add_dependencies(test_dump sys) +add_dependencies(test_dump sys_util) \ No newline at end of file diff --git a/mkrtos_user/server/test/src/main.c b/mkrtos_user/server/test/src/main.c index 8dfe9f296..ee4471bfd 100644 --- a/mkrtos_user/server/test/src/main.c +++ b/mkrtos_user/server/test/src/main.c @@ -11,21 +11,19 @@ #include "u_ns.h" #include "test.h" #include "u_rpc.h" +#include "cons_cli.h" #include #include int main(int argc, char *args[]) { printf("argc:%d args[0]:%s\n", argc, args[0]); - ulog_write_str(u_get_global_env()->log_hd, "MKRTOS:\n"); #if 0 malloc_test(); rpc_test(); ns_test(); -#endif irq_test(); +#endif fs_test(); - task_unmap(TASK_THIS, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, TASK_THIS)); - ulog_write_str(u_get_global_env()->log_hd, "Error.\n"); return 0; } diff --git a/mkrtos_user/server/test/test/fs_test.c b/mkrtos_user/server/test/test/fs_test.c index fdcc1e9f4..ffc4e5d7d 100644 --- a/mkrtos_user/server/test/test/fs_test.c +++ b/mkrtos_user/server/test/test/fs_test.c @@ -1,21 +1,29 @@ #include "fs_cli.h" +#include "cons_cli.h" #include #include #include #include +#include +#include void fs_test(void) { - char tmp[4] = "123"; - int fd = fs_open("/test", O_CREAT | O_RDWR, 0777); - assert(fd >= 0); - int wlen = fs_write(fd, tmp, 4); - assert(wlen == 4); - int ret = fs_lseek(fd, 0, SEEK_SET); - assert(ret >= 0); - int rlen = fs_read(fd, tmp, 4); - assert(rlen == 4); - assert(strcmp(tmp, "123") == 0); - fs_close(fd); + int i = 1000; + while (i--) + { + char tmp[4] = "123"; + int fd = open("/mnt/1.txt", O_CREAT | O_RDWR, 0777); + assert(fd >= 0); + int wlen = write(fd, tmp, 4); + assert(wlen == 4); + int ret = lseek(fd, 0, SEEK_SET); + assert(ret >= 0); + int rlen = read(fd, tmp, 4); + assert(rlen == 4); + assert(strcmp(tmp, "123") == 0); + close(fd); + } + printf("%s ok.\n", __func__); } diff --git a/mkrtos_user/server/test/test/irq_test.c b/mkrtos_user/server/test/test/irq_test.c index 8ee7d9054..9c6186e3c 100644 --- a/mkrtos_user/server/test/test/irq_test.c +++ b/mkrtos_user/server/test/test/irq_test.c @@ -33,7 +33,7 @@ void irq_test(void) assert(obj != HANDLER_INVALID); msg_tag_t tag = factory_create_irq_sender(FACTORY_PROT, vpage_create_raw3(0, 0, obj)); assert(msg_tag_get_val(tag) >= 0); - uirq_bind(obj, TIM2_IRQn, 0); + uirq_bind(obj, TIM2_IRQn, u_irq_prio_create(0, 0)); tag = mm_align_alloc(MM_PROT, (void *)0x40000000, 0x50000000 - 0x40000000); assert(msg_tag_get_val(tag) >= 0); diff --git a/mkrtos_user/server/test/test/ns_test.c b/mkrtos_user/server/test/test/ns_test.c index a832fb229..d9f836232 100644 --- a/mkrtos_user/server/test/test/ns_test.c +++ b/mkrtos_user/server/test/test/ns_test.c @@ -14,20 +14,6 @@ void ns_test(void) { -#if 0 - int ret; - obj_handler_t tmp_ipc_hd; - - tmp_ipc_hd = handler_alloc(); - assert(tmp_ipc_hd != HANDLER_INVALID); - msg_tag_t tag = factory_create_ipc(FACTORY_PROT, vpage_create_raw3(0, 0, tmp_ipc_hd)); - assert(msg_tag_get_val(tag) >= 0); - ret = cli_ns_register("shell", tmp_ipc_hd); - assert(ret >= 0); - ret = cli_ns_query("shell", &tmp_ipc_hd); - assert(ret >= 0); - ulog_write_str(u_get_global_env()->log_hd, "ns test success.\n"); -#endif obj_handler_t tmp_ipc_hd; tmp_ipc_hd = handler_alloc(); diff --git a/mkrtos_user/server/test/test/rpc_test.c b/mkrtos_user/server/test/test/rpc_test.c index 10e8f9b2e..492db0d1c 100644 --- a/mkrtos_user/server/test/test/rpc_test.c +++ b/mkrtos_user/server/test/test/rpc_test.c @@ -95,7 +95,7 @@ msg_tag_t dispatch_test(msg_tag_t tag, ipc_msg_t *msg) tag = test_svr_t_query_dispatch(&test, tag, msg); } #endif -RPC_GENERATION_OP2(test_svr_t, 0, query, +RPC_GENERATION_OP2(test_svr_t, 0, 0, query, rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_OUT, RPC_TYPE_BUF, var0, rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1) { @@ -104,10 +104,10 @@ RPC_GENERATION_OP2(test_svr_t, 0, query, return 2; } -RPC_GENERATION_DISPATCH2(test_svr_t, 0, query, +RPC_GENERATION_DISPATCH2(test_svr_t, 0, 0, query, rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_OUT, RPC_TYPE_BUF, var0, rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1) -RPC_GENERATION_CALL2(test_svr_t, 0, query, +RPC_GENERATION_CALL2(test_svr_t, 0, 0, query, rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_OUT, RPC_TYPE_BUF, var0, rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1) diff --git a/setting.cmake b/setting.cmake index 9784c5a54..1df03a5f7 100755 --- a/setting.cmake +++ b/setting.cmake @@ -21,7 +21,7 @@ set(CMAKE_SIZE "${CROSS_COMPILE}size" CACHE PATH "" FORCE) set(MKRTOS_ARCH $ENV{ARCH}) # -mfloat-abi=soft -u _printf_float -set(CMAKE_C_FLAGS "-mcpu=${MKRTOS_ARCH} -mthumb -Os -g3 -lc -lrdimon -msoft-float -u _printf_float -D=MKRTOS \ +set(CMAKE_C_FLAGS "-mcpu=${MKRTOS_ARCH} -mthumb -O0 -g3 -lc -lrdimon -msoft-float -u _printf_float -D=MKRTOS \ -std=gnu11 -ffunction-sections -fdata-sections -fno-builtin -mfix-cortex-m3-ldrd \ -nostartfiles -nodefaultlibs -nostdlib -nostdinc -Xlinker \ -fno-stack-protector -Wl,--gc-sections \