优化cons性能

This commit is contained in:
zhangzheng
2024-11-12 23:17:01 +08:00
parent 2f1ed5ae88
commit fb5de6c4f4
15 changed files with 79 additions and 25 deletions

View File

@@ -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;

View File

@@ -14,6 +14,7 @@
#include <u_prot.h>
#include <u_task.h>
#include <u_util.h>
#include <u_sema.h>
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:

View File

@@ -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);

View File

@@ -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,
};

View File

@@ -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);

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -1,5 +1,6 @@
#pragma once
#include <sys/types.h>
#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);

View File

@@ -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;
}

View File

@@ -6,6 +6,7 @@
#include <u_log.h>
#include <u_hd_man.h>
#include <u_err.h>
#include <u_sema.h>
#include <assert.h>
#include <errno.h>
#include <u_sleep.h>
@@ -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;
}
}

View File

@@ -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);

View File

@@ -5,4 +5,5 @@
# net
cpiofs -m /bin
pin
nes
sh

View File

@@ -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++;
}
}

View File

@@ -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);
}
}
}

View File

@@ -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);
}