优化cons性能
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -5,4 +5,5 @@
|
||||
# net
|
||||
cpiofs -m /bin
|
||||
pin
|
||||
nes
|
||||
sh
|
||||
@@ -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++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user