增加reboot&mem info命令
This commit is contained in:
@@ -40,7 +40,11 @@ void sys_startup(void)
|
|||||||
// 初始化systick时钟
|
// 初始化systick时钟
|
||||||
SysTick_Config(SystemCoreClock / CONFIG_SYS_SCHE_HZ);
|
SysTick_Config(SystemCoreClock / CONFIG_SYS_SCHE_HZ);
|
||||||
}
|
}
|
||||||
|
void sys_reset(void)
|
||||||
|
{
|
||||||
|
__set_FAULTMASK(1); // 关闭所有中端
|
||||||
|
NVIC_SystemReset(); // 复位
|
||||||
|
}
|
||||||
void arch_disable_irq(int inx)
|
void arch_disable_irq(int inx)
|
||||||
{
|
{
|
||||||
NVIC_DisableIRQ(inx);
|
NVIC_DisableIRQ(inx);
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ static inline umword_t intr_status(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void sys_startup(void);
|
void sys_startup(void);
|
||||||
|
void sys_reset(void);
|
||||||
|
|
||||||
// systick.c
|
// systick.c
|
||||||
umword_t sys_tick_cnt_get(void);
|
umword_t sys_tick_cnt_get(void);
|
||||||
|
|||||||
@@ -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);
|
int32_t hope_size, uint32_t *ret_addr);
|
||||||
|
|
||||||
void mem_trace(mem_t *_this);
|
void mem_trace(mem_t *_this);
|
||||||
|
void mem_info(mem_t *_this, size_t *total, size_t *free);
|
||||||
|
|||||||
@@ -9,3 +9,4 @@ struct mem_heap *mm_get_free(struct mem_heap *next,
|
|||||||
void mm_trace(void);
|
void mm_trace(void);
|
||||||
void *mm_limit_alloc_align(ram_limit_t *limit, size_t size, size_t align);
|
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_limit_free_align(ram_limit_t *limit, void *mem, size_t size);
|
||||||
|
void mm_info(size_t *total, size_t *free);
|
||||||
|
|||||||
@@ -374,16 +374,45 @@ void mem_trace(mem_t *_this)
|
|||||||
{
|
{
|
||||||
struct mem_heap *mem;
|
struct mem_heap *mem;
|
||||||
size_t total = 0;
|
size_t total = 0;
|
||||||
printk("================");
|
printk("================\n");
|
||||||
printk("start heap:0x%x.\n", _this->heap_start);
|
printk("start heap:0x%x.\n", _this->heap_start);
|
||||||
printk("l heap:0x%x.\n", _this->l_heap);
|
printk("l heap:0x%x.\n", _this->l_heap);
|
||||||
printk("end heap:0x%x.\n", _this->heap_end);
|
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)
|
for (mem = _this->heap_start; mem != _this->heap_end; mem = mem->next)
|
||||||
{
|
{
|
||||||
printk("%d [0x%x-] %dB\n", mem->used, mem, mem->size);
|
printk("%d [0x%x-] %dB\n", mem->used, mem, mem->size);
|
||||||
total += mem->size + MEM_HEAP_STRUCT_SIZE;
|
total += mem->size + MEM_HEAP_STRUCT_SIZE;
|
||||||
}
|
}
|
||||||
|
spinlock_set(&_this->lock, status);
|
||||||
printk("mem total size:%d.\n", total);
|
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_;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,6 +52,10 @@ void mm_trace(void)
|
|||||||
{
|
{
|
||||||
mem_trace(mm_get_global());
|
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)
|
void *mm_limit_alloc_align(ram_limit_t *limit, size_t size, size_t align)
|
||||||
{
|
{
|
||||||
if (ram_limit_alloc(limit, size) == FALSE)
|
if (ram_limit_alloc(limit, size) == FALSE)
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "arch.h"
|
#include "arch.h"
|
||||||
|
#include "mm_wrap.h"
|
||||||
|
|
||||||
typedef struct sys
|
typedef struct sys
|
||||||
{
|
{
|
||||||
@@ -29,6 +30,7 @@ enum sys_op
|
|||||||
{
|
{
|
||||||
SYS_INFO_GET,
|
SYS_INFO_GET,
|
||||||
REBOOT,
|
REBOOT,
|
||||||
|
MEM_INFO,
|
||||||
};
|
};
|
||||||
static void sys_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, entry_frame_t *f);
|
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;
|
break;
|
||||||
case REBOOT:
|
case REBOOT:
|
||||||
{
|
{
|
||||||
printk("Unsupport.\n");
|
printk("sys reboot.\n");
|
||||||
tag = msg_tag_init4(0, 0, 0, -ENOSYS);
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include "u_sys.h"
|
||||||
int ls(int argc, char *agrv[])
|
int ls(int argc, char *agrv[])
|
||||||
{
|
{
|
||||||
DIR *dir;
|
DIR *dir;
|
||||||
@@ -80,3 +81,22 @@ int shell_symlink(int argc, char *argv[])
|
|||||||
return symlink(argv[1], argv[2]);
|
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);
|
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);
|
||||||
@@ -9,6 +9,8 @@ typedef struct sys_info
|
|||||||
} sys_info_t;
|
} sys_info_t;
|
||||||
|
|
||||||
msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *info);
|
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)
|
static inline umword_t sys_read_tick(void)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ enum sys_op
|
|||||||
{
|
{
|
||||||
SYS_INFO_GET,
|
SYS_INFO_GET,
|
||||||
REBOOT,
|
REBOOT,
|
||||||
|
MEM_INFO,
|
||||||
};
|
};
|
||||||
|
|
||||||
msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *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");
|
register volatile umword_t r2 asm("r2");
|
||||||
|
|
||||||
mk_syscall(syscall_prot_create(SYS_INFO_GET, SYS_PROT, obj).raw,
|
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);
|
msg_tag_t tag = msg_tag_init(r0);
|
||||||
|
|
||||||
asm __volatile__(""
|
asm __volatile__(""
|
||||||
:
|
:
|
||||||
: :"r0", "r1", "r2");
|
: : "r0", "r1", "r2");
|
||||||
if (info)
|
if (info)
|
||||||
{
|
{
|
||||||
info->sys_tick = r1;
|
info->sys_tick = r1;
|
||||||
@@ -39,3 +40,54 @@ msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *info)
|
|||||||
|
|
||||||
return tag;
|
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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
* @copyright Copyright (c) 2023
|
* @copyright Copyright (c) 2023
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#define HEAP_SIZE ((1024 + 256) * 3 + 1024)
|
#define HEAP_SIZE 1024
|
||||||
#define STACK_SIZE (1024 + 256)
|
#define STACK_SIZE (1024 + 256)
|
||||||
|
|
||||||
#if defined(__CC_ARM)
|
#if defined(__CC_ARM)
|
||||||
|
|||||||
Reference in New Issue
Block a user