From f9e9d12c4b18cc813317dd7e745500d8eb30912a Mon Sep 17 00:00:00 2001 From: zhangzheng <1358745329@qq.com> Date: Fri, 5 Jan 2024 23:59:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0reboot&mem=20info=E5=91=BD?= =?UTF-8?q?=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mkrtos_knl/arch/armv7m/arch.c | 6 +- mkrtos_knl/arch/inc/arch.h | 1 + mkrtos_knl/inc/knl/mm.h | 1 + mkrtos_knl/inc/knl/mm_wrap.h | 1 + mkrtos_knl/knl/mm.c | 33 +++++++++- mkrtos_knl/knl/mm_wrap.c | 4 ++ mkrtos_knl/knl/sys.c | 18 ++++- .../letter-shell/demo/mkrtos/shell_fs_ext.c | 20 ++++++ mkrtos_user/lib/sys/inc/u_sys.h | 2 + mkrtos_user/lib/sys/src/u_sys.c | 66 +++++++++++++++++-- mkrtos_user/server/init/src/heap_stack.c | 2 +- 11 files changed, 141 insertions(+), 13 deletions(-) diff --git a/mkrtos_knl/arch/armv7m/arch.c b/mkrtos_knl/arch/armv7m/arch.c index 553bfc5aa..251019bd2 100644 --- a/mkrtos_knl/arch/armv7m/arch.c +++ b/mkrtos_knl/arch/armv7m/arch.c @@ -40,7 +40,11 @@ void sys_startup(void) // 初始化systick时钟 SysTick_Config(SystemCoreClock / CONFIG_SYS_SCHE_HZ); } - +void sys_reset(void) +{ + __set_FAULTMASK(1); // 关闭所有中端 + NVIC_SystemReset(); // 复位 +} void arch_disable_irq(int inx) { NVIC_DisableIRQ(inx); diff --git a/mkrtos_knl/arch/inc/arch.h b/mkrtos_knl/arch/inc/arch.h index 8b2a60265..e5c5eddd3 100755 --- a/mkrtos_knl/arch/inc/arch.h +++ b/mkrtos_knl/arch/inc/arch.h @@ -111,6 +111,7 @@ static inline umword_t intr_status(void) } void sys_startup(void); +void sys_reset(void); // systick.c umword_t sys_tick_cnt_get(void); diff --git a/mkrtos_knl/inc/knl/mm.h b/mkrtos_knl/inc/knl/mm.h index 9f28db339..4b63eabd6 100755 --- a/mkrtos_knl/inc/knl/mm.h +++ b/mkrtos_knl/inc/knl/mm.h @@ -43,3 +43,4 @@ struct mem_heap *mem_get_free(mem_t *_this, struct mem_heap *next, int32_t hope_size, uint32_t *ret_addr); void mem_trace(mem_t *_this); +void mem_info(mem_t *_this, size_t *total, size_t *free); diff --git a/mkrtos_knl/inc/knl/mm_wrap.h b/mkrtos_knl/inc/knl/mm_wrap.h index 84f69e5e1..8f7676087 100755 --- a/mkrtos_knl/inc/knl/mm_wrap.h +++ b/mkrtos_knl/inc/knl/mm_wrap.h @@ -9,3 +9,4 @@ struct mem_heap *mm_get_free(struct mem_heap *next, void mm_trace(void); 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); +void mm_info(size_t *total, size_t *free); diff --git a/mkrtos_knl/knl/mm.c b/mkrtos_knl/knl/mm.c index 65c4df616..762d62339 100755 --- a/mkrtos_knl/knl/mm.c +++ b/mkrtos_knl/knl/mm.c @@ -374,16 +374,45 @@ void mem_trace(mem_t *_this) { struct mem_heap *mem; size_t total = 0; - printk("================"); + printk("================\n"); printk("start heap:0x%x.\n", _this->heap_start); printk("l heap:0x%x.\n", _this->l_heap); printk("end heap:0x%x.\n", _this->heap_end); + umword_t status = spinlock_lock(&_this->lock); for (mem = _this->heap_start; mem != _this->heap_end; mem = mem->next) { printk("%d [0x%x-] %dB\n", mem->used, mem, mem->size); total += mem->size + MEM_HEAP_STRUCT_SIZE; } + spinlock_set(&_this->lock, status); printk("mem total size:%d.\n", total); - printk("================"); + printk("================\n"); +} +void mem_info(mem_t *_this, size_t *total, size_t *free) +{ + assert(total); + assert(free); + struct mem_heap *mem; + size_t total_ = 0; + size_t free_ = 0; + printk("================\n"); + printk("start heap:0x%x.\n", _this->heap_start); + printk("l heap:0x%x.\n", _this->l_heap); + printk("end heap:0x%x.\n", _this->heap_end); + umword_t status = spinlock_lock(&_this->lock); + + for (mem = _this->heap_start; mem != _this->heap_end; mem = mem->next) + { + printk("%d [0x%x-] %dB\n", mem->used, mem, mem->size); + total_ += mem->size + MEM_HEAP_STRUCT_SIZE; + if (mem->used == 0) + { + free_ += mem->size; + } + } + spinlock_set(&_this->lock, status); + printk("================\n"); + *total = total_; + *free = free_; } diff --git a/mkrtos_knl/knl/mm_wrap.c b/mkrtos_knl/knl/mm_wrap.c index d25953728..e5fbd9d9a 100755 --- a/mkrtos_knl/knl/mm_wrap.c +++ b/mkrtos_knl/knl/mm_wrap.c @@ -52,6 +52,10 @@ void mm_trace(void) { mem_trace(mm_get_global()); } +void mm_info(size_t *total, size_t *free) +{ + mem_info(mm_get_global(), total, free); +} void *mm_limit_alloc_align(ram_limit_t *limit, size_t size, size_t align) { if (ram_limit_alloc(limit, size) == FALSE) diff --git a/mkrtos_knl/knl/sys.c b/mkrtos_knl/knl/sys.c index 89efff879..9dddaca31 100755 --- a/mkrtos_knl/knl/sys.c +++ b/mkrtos_knl/knl/sys.c @@ -17,6 +17,7 @@ #include "types.h" #include "util.h" #include "arch.h" +#include "mm_wrap.h" typedef struct sys { @@ -29,6 +30,7 @@ enum sys_op { SYS_INFO_GET, REBOOT, + MEM_INFO, }; static void sys_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, entry_frame_t *f); @@ -59,8 +61,20 @@ static void sys_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, break; case REBOOT: { - printk("Unsupport.\n"); - tag = msg_tag_init4(0, 0, 0, -ENOSYS); + printk("sys reboot.\n"); + sys_reset(); + tag = msg_tag_init4(0, 0, 0, 0); + } + break; + case MEM_INFO: + { + size_t total; + size_t free; + + mm_info(&total, &free); + f->r[1] = total; + f->r[2] = free; + tag = msg_tag_init4(0, 0, 0, 0); } break; default: diff --git a/mkrtos_user/lib/letter-shell/demo/mkrtos/shell_fs_ext.c b/mkrtos_user/lib/letter-shell/demo/mkrtos/shell_fs_ext.c index 9e3a6a33b..8c15fb015 100644 --- a/mkrtos_user/lib/letter-shell/demo/mkrtos/shell_fs_ext.c +++ b/mkrtos_user/lib/letter-shell/demo/mkrtos/shell_fs_ext.c @@ -10,6 +10,7 @@ #include #include #include +#include "u_sys.h" int ls(int argc, char *agrv[]) { DIR *dir; @@ -80,3 +81,22 @@ int shell_symlink(int argc, char *argv[]) return symlink(argv[1], argv[2]); } SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), symlink, shell_symlink, symlink command); + +int shell_reboot(int argc, char *argv[]) +{ + printf("sys reboot.\n"); + sys_reboot(SYS_PROT); + return 0; +} +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), reboot, shell_reboot, reboot command); + +int shell_mem_info(int argc, char *argv[]) +{ + size_t total; + size_t free; + + sys_mem_info(SYS_PROT, &total, &free); + printf("sys mem:\ntotal:%dB\nfree:%dB\n", total, free); + return 0; +} +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), mem, shell_mem_info, mem command); \ No newline at end of file diff --git a/mkrtos_user/lib/sys/inc/u_sys.h b/mkrtos_user/lib/sys/inc/u_sys.h index ea468438c..b22b08b77 100644 --- a/mkrtos_user/lib/sys/inc/u_sys.h +++ b/mkrtos_user/lib/sys/inc/u_sys.h @@ -9,6 +9,8 @@ typedef struct sys_info } sys_info_t; msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *info); +msg_tag_t sys_reboot(obj_handler_t obj); +msg_tag_t sys_mem_info(obj_handler_t obj, umword_t *total, umword_t *free); static inline umword_t sys_read_tick(void) { diff --git a/mkrtos_user/lib/sys/src/u_sys.c b/mkrtos_user/lib/sys/src/u_sys.c index 140a5252d..c703789ea 100644 --- a/mkrtos_user/lib/sys/src/u_sys.c +++ b/mkrtos_user/lib/sys/src/u_sys.c @@ -11,6 +11,7 @@ enum sys_op { SYS_INFO_GET, REBOOT, + MEM_INFO, }; msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *info) @@ -20,17 +21,17 @@ msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *info) register volatile umword_t r2 asm("r2"); mk_syscall(syscall_prot_create(SYS_INFO_GET, SYS_PROT, obj).raw, - 0, - 0, - 0, - 0, - 0, - 0); + 0, + 0, + 0, + 0, + 0, + 0); msg_tag_t tag = msg_tag_init(r0); asm __volatile__("" : - : :"r0", "r1", "r2"); + : : "r0", "r1", "r2"); if (info) { info->sys_tick = r1; @@ -39,3 +40,54 @@ msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *info) return tag; } +msg_tag_t sys_reboot(obj_handler_t obj) +{ + register volatile umword_t r0 asm("r0"); + register volatile umword_t r1 asm("r1"); + register volatile umword_t r2 asm("r2"); + + mk_syscall(syscall_prot_create(REBOOT, SYS_PROT, obj).raw, + 0, + 0, + 0, + 0, + 0, + 0); + msg_tag_t tag = msg_tag_init(r0); + + asm __volatile__("" + : + : : "r0", "r1", "r2"); + + return tag; +} +msg_tag_t sys_mem_info(obj_handler_t obj, umword_t *total, umword_t *free) +{ + register volatile umword_t r0 asm("r0"); + register volatile umword_t r1 asm("r1"); + register volatile umword_t r2 asm("r2"); + + mk_syscall(syscall_prot_create(MEM_INFO, SYS_PROT, obj).raw, + 0, + 0, + 0, + 0, + 0, + 0); + msg_tag_t tag = msg_tag_init(r0); + + asm __volatile__("" + : + : : "r0", "r1", "r2"); + + if (total) + { + *total = r1; + } + if (free) + { + *free = r2; + } + + return tag; +} diff --git a/mkrtos_user/server/init/src/heap_stack.c b/mkrtos_user/server/init/src/heap_stack.c index b06076df7..87372d845 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 ((1024 + 256) * 3 + 1024) +#define HEAP_SIZE 1024 #define STACK_SIZE (1024 + 256) #if defined(__CC_ARM)