diff --git a/mkrtos_user/lib/letter-shell/demo/mkrtos/shell_port.c b/mkrtos_user/lib/letter-shell/demo/mkrtos/shell_port.c index 58288a8c2..62e641964 100644 --- a/mkrtos_user/lib/letter-shell/demo/mkrtos/shell_port.c +++ b/mkrtos_user/lib/letter-shell/demo/mkrtos/shell_port.c @@ -59,7 +59,7 @@ again: rlen = cons_read((uint8_t *)data, len); if (rlen <= 0) { - u_sleep_ms(5); + u_sema_down(SEMA_PROT); goto again; } return rlen; diff --git a/mkrtos_user/lib/libc_backend/src/fs_backend.c b/mkrtos_user/lib/libc_backend/src/fs_backend.c index 4681a5660..635db7364 100644 --- a/mkrtos_user/lib/libc_backend/src/fs_backend.c +++ b/mkrtos_user/lib/libc_backend/src/fs_backend.c @@ -14,6 +14,7 @@ #include #include #include +#include AUTO_CALL(101) void fs_backend_init(void) { @@ -119,7 +120,7 @@ static int be_tty_read(char *buf, long size) } else if (len == 0) { - u_sleep_ms(10); + u_sema_down(SEMA_PROT); continue; } r_len += len; @@ -225,7 +226,8 @@ long be_readv(long fd, const struct iovec *iov, long iovcnt) } else if (read_cn == 0) { - u_sleep_ms(10); // TODO:改成信号量 + u_sema_down(SEMA_PROT); + cons_write_str(".\n"); goto again_read; } } @@ -335,7 +337,8 @@ long be_ioctl(long fd, long req, void *args) switch (u_fd.type) { case FD_TTY: - { ret = -ENOSYS; + { + ret = -ENOSYS; } break; case FD_FS: diff --git a/mkrtos_user/lib/sys/inc/u_factory.h b/mkrtos_user/lib/sys/inc/u_factory.h index 2ee0ae7e2..3f8794fc6 100644 --- a/mkrtos_user/lib/sys/inc/u_factory.h +++ b/mkrtos_user/lib/sys/inc/u_factory.h @@ -18,4 +18,4 @@ msg_tag_t factory_create_thread(obj_handler_t obj, vpage_t vpage); msg_tag_t factory_create_thread_vcpu(obj_handler_t obj, vpage_t vpage); msg_tag_t factory_create_task(obj_handler_t obj, vpage_t vpage); msg_tag_t facotry_create_share_mem(obj_handler_t obj, vpage_t vpage, share_mem_type_t mem_type, umword_t size); -msg_tag_t facotry_create_sema(obj_handler_t obj, vpage_t vpage, int cnt, int max); +msg_tag_t facotry_create_sema(obj_handler_t obj, vpage_t vpage, int cnt, uint32_t max); diff --git a/mkrtos_user/lib/sys/inc/u_prot.h b/mkrtos_user/lib/sys/inc/u_prot.h index ad204680b..eeff6917f 100644 --- a/mkrtos_user/lib/sys/inc/u_prot.h +++ b/mkrtos_user/lib/sys/inc/u_prot.h @@ -12,10 +12,10 @@ enum kobj_prot SYS_PROT, FUTEX_PROT, IRQ_PROT, - SHARE_MEM_PROT, // 10 - VMA_PROT, - SEMA_PROT, - MAX_PROT, + SHARE_MEM_PROT, + VMA_PROT, // 10 + SEMA_PROT, // 11 + MAX_PROT, // 12 }; #define THREAD_MAIN THREAD_PROT @@ -108,6 +108,10 @@ static inline vpage_t vpage_create_raw3(umword_t attrs, umword_t flags, umword_t return (vpage_t){.attrs = attrs, .flags = flags, .addr = addr}; } +/** + * @brief 对象的类型 + * + */ enum knl_obj_type { BASE_KOBJ_TYPE, @@ -120,4 +124,7 @@ enum knl_obj_type FACTORY_TYPE, SYS_TYPE, FUTEX_TYPE, + SHARE_MEM_TYPE, + VMAM_TYPE, + SEMA_TYPE, }; diff --git a/mkrtos_user/lib/sys/src/u_factory.c b/mkrtos_user/lib/sys/src/u_factory.c index 42ee5a4d0..f806f2b02 100644 --- a/mkrtos_user/lib/sys/src/u_factory.c +++ b/mkrtos_user/lib/sys/src/u_factory.c @@ -105,7 +105,7 @@ msg_tag_t facotry_create_share_mem(obj_handler_t obj, vpage_t vpage, share_mem_t return tag; } -msg_tag_t facotry_create_sema(obj_handler_t obj, vpage_t vpage, int cnt, int max) +msg_tag_t facotry_create_sema(obj_handler_t obj, vpage_t vpage, int cnt, uint32_t max) { register volatile umword_t r0 asm(ARCH_REG_0); diff --git a/mkrtos_user/lib/sys_svr/inc/cons_svr.h b/mkrtos_user/lib/sys_svr/inc/cons_svr.h index f7855673e..f7d4e1c73 100644 --- a/mkrtos_user/lib/sys_svr/inc/cons_svr.h +++ b/mkrtos_user/lib/sys_svr/inc/cons_svr.h @@ -23,4 +23,4 @@ void cons_svr_obj_init(cons_t *cons); int console_write(uint8_t *data, size_t len); int console_read(uint8_t *data, size_t len); -void console_active(pid_t pid); +void console_active(pid_t pid, obj_handler_t sem); diff --git a/mkrtos_user/lib/sys_svr/src/cons_svr.c b/mkrtos_user/lib/sys_svr/src/cons_svr.c index dc31a02e8..7c927c4b8 100644 --- a/mkrtos_user/lib/sys_svr/src/cons_svr.c +++ b/mkrtos_user/lib/sys_svr/src/cons_svr.c @@ -39,7 +39,8 @@ RPC_GENERATION_DISPATCH2(cons_t, CONS_PROT, CONS_READ, read, RPC_GENERATION_OP1(cons_t, CONS_PROT, CONS_ACTIVE, active, rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags) { - console_active(thread_get_src_pid()); + printf("warrning: to map sema obj.\n"); + console_active(thread_get_src_pid(), -1 /*TODO:映射sem*/); return 0; } diff --git a/mkrtos_user/lib/sys_util/inc/u_app_loader.h b/mkrtos_user/lib/sys_util/inc/u_app_loader.h index a252f20da..d88c1c064 100644 --- a/mkrtos_user/lib/sys_util/inc/u_app_loader.h +++ b/mkrtos_user/lib/sys_util/inc/u_app_loader.h @@ -1,5 +1,6 @@ #pragma once #include #include "u_env.h" +#include "u_hd_man.h" -int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int arg_cn, char *env[], int env_cn); +int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int arg_cn, char *envp[], int envp_cn, obj_handler_t *p_sem_hd); 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 84dd1fa3d..3486d23f9 100644 --- a/mkrtos_user/lib/sys_util/src/u_app_loader.c +++ b/mkrtos_user/lib/sys_util/src/u_app_loader.c @@ -110,10 +110,11 @@ static void *app_stack_push_array(obj_handler_t task_obj, umword_t **stack, uint * @param name app的名字 * @return int */ -int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int arg_cn, char *envp[], int envp_cn) +int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int arg_cn, char *envp[], int envp_cn, obj_handler_t *p_sem_hd) { msg_tag_t tag; sys_info_t sys_info; + assert(p_sem_hd); tag = sys_read_info(SYS_PROT, &sys_info, 0); if (msg_tag_get_val(tag) < 0) @@ -140,6 +141,7 @@ int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int ar umword_t ram_base; obj_handler_t hd_task = handler_alloc(); obj_handler_t hd_thread = handler_alloc(); + obj_handler_t hd_sem = handler_alloc(); if (hd_task == HANDLER_INVALID) { @@ -149,7 +151,10 @@ int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int ar { goto end; } - + if (hd_sem == HANDLER_INVALID) + { + goto end; + } tag = factory_create_task(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, hd_task)); if (msg_tag_get_prot(tag) < 0) { @@ -160,6 +165,11 @@ int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int ar { goto end_del_obj; } + tag = facotry_create_sema(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, hd_sem), 0, (uint32_t)(-1)); + if (msg_tag_get_prot(tag) < 0) + { + goto end_del_obj; + } tag = task_alloc_ram_base(hd_task, app->i.ram_size, &ram_base); if (msg_tag_get_prot(tag) < 0) { @@ -170,6 +180,11 @@ int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int ar { goto end_del_obj; } + tag = task_map(hd_task, hd_sem, SEMA_PROT, 0); + if (msg_tag_get_prot(tag) < 0) + { + goto end_del_obj; + } tag = task_map(hd_task, cur_env->ns_hd, LOG_PROT, KOBJ_DELETE_RIGHT); if (msg_tag_get_prot(tag) < 0) { @@ -302,6 +317,8 @@ int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int ar tag = thread_exec_regs(hd_thread, (umword_t)addr, (umword_t)usp_top, ram_base, 0); assert(msg_tag_get_prot(tag) >= 0); + + *p_sem_hd = hd_sem; /*启动线程运行*/ tag = thread_run(hd_thread, 2); assert(msg_tag_get_prot(tag) >= 0); @@ -317,6 +334,10 @@ end_del_obj: { task_unmap(TASK_THIS, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, hd_task)); } + if (hd_sem != HANDLER_INVALID) + { + task_unmap(TASK_THIS, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, hd_sem)); + } end: if (hd_task != HANDLER_INVALID) { @@ -326,5 +347,9 @@ end: { handler_free(hd_thread); } + if (hd_sem != HANDLER_INVALID) + { + handler_free(hd_sem); + } return -ENOMEM; } diff --git a/mkrtos_user/server/init/src/cons.c b/mkrtos_user/server/init/src/cons.c index c11541244..fcd1ac6c5 100644 --- a/mkrtos_user/server/init/src/cons.c +++ b/mkrtos_user/server/init/src/cons.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -26,7 +27,7 @@ static ATTR_ALIGN(8) uint8_t cons_stack[CONS_STACK_SIZE]; // static uint8_t cons_msg_buf[MSG_BUG_LEN]; static cons_t cons_obj; static obj_handler_t cons_th; - +static obj_handler_t sem_th; static void console_read_func(void) { while (1) @@ -41,6 +42,10 @@ static void console_read_func(void) q_enqueue(&cons_obj.r_queue, cons_obj.r_data_buf[i]); } pthread_spin_unlock(&cons_obj.r_lock); + if (sem_th) + { + u_sema_up(sem_th); + } } } handler_free_umap(cons_obj.hd_cons_read); @@ -102,7 +107,6 @@ int console_read(uint8_t *data, size_t len) } else { - pthread_spin_lock(&cons_obj.r_lock); if (q_queue_len(&cons_obj.r_queue) == 0) { @@ -129,7 +133,15 @@ int console_read(uint8_t *data, size_t len) * @brief 激活控制台为发送者进程 * */ -void console_active(pid_t pid) +void console_active(pid_t pid, obj_handler_t sem) { cons_obj.active_pid = pid; + if (sem) + { + if (sem_th) + { + handler_free_umap(sem_th); + } + sem_th = sem; + } } diff --git a/mkrtos_user/server/init/src/cons.h b/mkrtos_user/server/init/src/cons.h index 72e0426e3..79a7d0fcd 100644 --- a/mkrtos_user/server/init/src/cons.h +++ b/mkrtos_user/server/init/src/cons.h @@ -1,4 +1,4 @@ #pragma once void console_init(void); -void console_active(pid_t pid); +void console_active(pid_t pid, obj_handler_t sem); diff --git a/mkrtos_user/server/init/src/init.cfg b/mkrtos_user/server/init/src/init.cfg index c57f65c4a..9bf0db3e1 100644 --- a/mkrtos_user/server/init/src/init.cfg +++ b/mkrtos_user/server/init/src/init.cfg @@ -5,4 +5,5 @@ # net cpiofs -m /bin pin +nes sh \ No newline at end of file diff --git a/mkrtos_user/server/init/src/parse_cfg.c b/mkrtos_user/server/init/src/parse_cfg.c index ed16866ef..08d0ff8d9 100644 --- a/mkrtos_user/server/init/src/parse_cfg.c +++ b/mkrtos_user/server/init/src/parse_cfg.c @@ -151,6 +151,8 @@ int parse_cfg(const char *parse_cfg_file_name, uenv_t *env) char *args[CMD_PARAMS_CN] = { NULL, }; + obj_handler_t hd_sem; + parse_cfg_cmd_line(); for (int i = 0; i < cmd_params_num; i++) { @@ -158,14 +160,14 @@ int parse_cfg(const char *parse_cfg_file_name, uenv_t *env) printf("parse_cfg args[%d] = %s\n", i, args[i]); } printf("parse_cfg cmd_params_num:%d\n", cmd_params_num); - int ret = app_load(cmd_line, env, &pid, args, cmd_params_num, NULL, 0); + int ret = app_load(cmd_line, env, &pid, args, cmd_params_num, NULL, 0, &hd_sem); if (ret < 0) { printf("%s load fail, 0x%x\n", cmd_line, ret); } else { - console_active(pid); + console_active(pid, hd_sem); run_cn++; } } diff --git a/mkrtos_user/server/init/src/pm.c b/mkrtos_user/server/init/src/pm.c index 100fc75d6..14a8d4808 100644 --- a/mkrtos_user/server/init/src/pm.c +++ b/mkrtos_user/server/init/src/pm.c @@ -213,12 +213,14 @@ int pm_rpc_run_app(const char *path, int flags) (char *)path, NULL, /*TODO:支持传递参数*/ }; - ret = app_load(path, u_get_global_env(), &pid, args, 1, NULL, 0); + obj_handler_t sem; + + ret = app_load(path, u_get_global_env(), &pid, args, 1, NULL, 0, &sem); if (ret > 0) { if (!(flags & PM_APP_BG_RUN)) { - console_active(pid); + console_active(pid, sem); } } } diff --git a/mkrtos_user/user/app/ATSURFF437/drv_test/main.c b/mkrtos_user/user/app/ATSURFF437/drv_test/main.c index 11ee1521a..5aa4ed607 100644 --- a/mkrtos_user/user/app/ATSURFF437/drv_test/main.c +++ b/mkrtos_user/user/app/ATSURFF437/drv_test/main.c @@ -75,11 +75,11 @@ int main(int argc, char *argv[]) while (1) { val = 1; - delay_ms(500); + // delay_ms(500); lseek(fd, 12, SEEK_SET); write(fd, &val, 1); val = 0; - delay_ms(500); + // delay_ms(500); lseek(fd, 12, SEEK_SET); write(fd, &val, 1); }