支持console

This commit is contained in:
zhangzheng
2023-12-02 00:27:57 +08:00
parent b906e5c408
commit 1d9e8cc532
27 changed files with 298 additions and 57 deletions

View File

@@ -7,6 +7,8 @@
#include <u_prot.h>
#include <u_log.h>
#include <u_env.h>
#include <u_task.h>
#include <cons_cli.h>
#include <sys/uio.h>
#include <assert.h>
#include <u_util.h>
@@ -60,7 +62,17 @@ long be_write(long fd, char *buf, long size)
{
case FD_TTY:
{
ulog_write_bytes(u_get_global_env()->log_hd, buf, size);
pid_t pid;
task_get_pid(TASK_THIS, (umword_t *)(&pid));
if (pid == 0)
{
ulog_write_bytes(u_get_global_env()->log_hd, buf, size);
}
else
{
cons_write(buf, size);
}
return size;
}
break;
@@ -90,7 +102,17 @@ long be_writev(long fd, const struct iovec *iov, long iovcnt)
{
case FD_TTY:
{
ulog_write_bytes(u_get_global_env()->log_hd, iov[i].iov_base, iov[i].iov_len);
pid_t pid;
task_get_pid(TASK_THIS, (umword_t *)(&pid));
if (pid == 0)
{
ulog_write_bytes(u_get_global_env()->log_hd, iov[i].iov_base, iov[i].iov_len);
}
else
{
cons_write(iov[i].iov_base, iov[i].iov_len);
}
wlen += iov[i].iov_len;
}
break;

View File

@@ -4,7 +4,7 @@
#include "u_ipc.h"
#include "u_mm.h"
#include "u_app.h"
#include "u_log.h"
#include "cons_cli.h"
#include "u_arch.h"
#include <pthread_impl.h>
#include <assert.h>
@@ -21,7 +21,7 @@ static void *mm_page_alloc(int page_nr)
size_t max_page_nr = (info->i.heap_size) / MK_PAGE_SIZE;
if (max_page_nr > sizeof(mm_bitemp) * WORD_BITS)
{
ulog_write_str(LOG_PROT, "mm bitmap is to small.\n");
cons_write_str("mm bitmap is to small.\n");
}
// printf("heap is 0x%x, max page nr is %d.\n", heap_addr, max_page_nr);
pthread_spin_lock(&lock);

View File

@@ -24,6 +24,7 @@ target_link_libraries(
muslc
PUBLIC
libc_be
sys_svr
)
set_target_properties(muslc PROPERTIES LINK_FLAGS "-pie ")
target_include_directories(
@@ -31,6 +32,8 @@ target_include_directories(
BEFORE
PUBLIC
# ${CMAKE_SOURCE_DIR}/user/libc/backend
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_svr/inc
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/arm/
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/generic
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/src/internal

View File

@@ -6,7 +6,7 @@
#include "syscall.h"
#include "atomic.h"
#include "libc.h"
#include "cons_cli.h"
static void dummy(void) {}
weak_alias(dummy, _init);
@@ -102,6 +102,7 @@ int __libc_start_main(int (*main)(int, char **, char **), int argc, char **argv,
* are used to prevent the stack frame used during init from
* persisting for the entire process lifetime. */
__init_libc(envp, argv[0]);
cons_active();
/* Barrier against hoisting application code or anything using ssp
* or thread pointer prior to its initialization above. */

View File

@@ -2,3 +2,4 @@
#define MK_ENOBUFS 105
#define ETOLONG 1024
#define ENOREPLY 1025

View File

@@ -15,7 +15,9 @@
#define THREAD_MAIN THREAD_PROT
#define TASK_THIS TASK_PROT
#define MSG_TAG_KNL_ERR 0x8
//! flags in MSG_TAG
#define MSG_TAG_KNL_ERR 0x8 //!< 内核代表的错误
#define MSG_TAG_NO_RELAY 0x4 //!< 不进行回复
typedef union msg_tag
{

View File

@@ -8,7 +8,7 @@ enum obj_attrs
KOBJ_ALL_RIGHTS = 3,
};
msg_tag_t task_set_pid(obj_handler_t dst_task, umword_t pid);
msg_tag_t task_get_pid(obj_handler_t dst_task, umword_t *data, int inx);
msg_tag_t task_get_pid(obj_handler_t dst_task, umword_t *data);
msg_tag_t task_obj_valid(obj_handler_t dst_task, obj_handler_t obj_inx);
msg_tag_t task_map(obj_handler_t dst_task, obj_handler_t src_obj, obj_handler_t dst_obj, uint8_t attrs);
msg_tag_t task_unmap(obj_handler_t task_han, vpage_t vpage);

View File

@@ -30,13 +30,13 @@ msg_tag_t task_set_pid(obj_handler_t dst_task, umword_t pid)
return tag;
}
msg_tag_t task_get_pid(obj_handler_t dst_task, umword_t *pid, int inx)
msg_tag_t task_get_pid(obj_handler_t dst_task, umword_t *pid)
{
register volatile umword_t r0 asm("r0");
register volatile umword_t r1 asm("r1");
mk_syscall(syscall_prot_create(TASK_GET_PID, TASK_PROT, dst_task).raw,
inx,
0,
0,
0,
0,

View File

@@ -20,6 +20,7 @@ target_include_directories(
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_svr/inc
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/cpio
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/util/inc
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/arm/
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/generic
@@ -35,6 +36,7 @@ target_link_libraries(
sys
muslc
cpio
util
)
add_dependencies(sys_svr sys)
add_dependencies(sys_svr muslc)

View File

@@ -0,0 +1,9 @@
#pragma once
#include <string.h>
int cons_write(const uint8_t *data, int len);
static inline int cons_write_str(const char *str)
{
return cons_write(str, strlen(str));
}
int cons_read(uint8_t *data, int len);
int cons_active(void);

View File

@@ -0,0 +1,26 @@
#pragma once
#include <u_rpc_svr.h>
#include <pthread.h>
#include <u_queue.h>
#include <u_types.h>
#define CONS_WRITE_BUF_SIZE (128 + 1)
typedef struct cons
{
rpc_svr_obj_t svr;
queue_t r_queue;
uint8_t r_data[CONS_WRITE_BUF_SIZE];
pthread_spinlock_t r_lock;
pthread_mutex_t w_lock;
pid_t active_pid;
obj_handler_t hd_cons_read;
uint8_t r_data_buf[16];
} cons_t;
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(void);

View File

@@ -36,3 +36,8 @@
#define PM_PROT 0x0005 //!< 进程管理协议
#define PM_RUN_APP ((uint16_t)0) //!< 启动应用程序
#define CONS_PROT 0x0006
#define CONS_WRITE ((uint16_t)0)
#define CONS_READ ((uint16_t)1)
#define CONS_ACTIVE ((uint16_t)2)

View File

@@ -0,0 +1,65 @@
#include "rpc_prot.h"
#include "u_rpc.h"
#include "u_rpc_svr.h"
#include "u_hd_man.h"
#include "u_env.h"
#include "ns_cli.h"
#include "cons_svr.h"
#include <u_env.h>
RPC_GENERATION_CALL1(cons_t, CONS_PROT, CONS_WRITE, write,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, data)
RPC_GENERATION_CALL1(cons_t, CONS_PROT, CONS_WRITE, read,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, data)
RPC_GENERATION_CALL1(cons_t, CONS_PROT, CONS_ACTIVE, active,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags)
int cons_write(const uint8_t *data, int len)
{
int rlen = 0;
while (rlen < len)
{
int r_once_len = 0;
r_once_len = MIN(32, len - rlen);
rpc_ref_array_uint32_t_uint8_t_32_t rpc_buf = {
.data = (uint8_t *)data + rlen,
.len = r_once_len,
};
rpc_int_t rpc_len = {
.data = r_once_len,
};
msg_tag_t tag = cons_t_write_call(u_get_global_env()->ns_hd, &rpc_buf);
if (msg_tag_get_val(tag) < 0)
{
return msg_tag_get_val(tag);
}
rlen += msg_tag_get_val(tag);
if (msg_tag_get_val(tag) != r_once_len)
{
break;
}
}
}
int cons_read(uint8_t *data, int len)
{
rpc_ref_array_uint32_t_uint8_t_32_t rpc_path = {
.data = (uint8_t *)data,
.len = len > 32 ? 32 : len,
};
msg_tag_t tag = cons_t_read_call(u_get_global_env()->ns_hd, &rpc_path);
return msg_tag_get_val(tag);
}
int cons_active(void)
{
rpc_int_t rpc_flags = {
.data = 0};
uenv_t *env = u_get_global_env();
msg_tag_t tag = cons_t_active_call(env->log_hd, &rpc_flags);
return msg_tag_get_val(tag);
}

View File

@@ -0,0 +1,57 @@
#include "rpc_prot.h"
#include "u_rpc.h"
#include "u_rpc_svr.h"
#include "u_hd_man.h"
#include "cons_svr.h"
#include <stdio.h>
/*write*/
RPC_GENERATION_OP1(cons_t, CONS_PROT, CONS_WRITE, write,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, data)
{
int16_t ret = -1;
ret = console_write(data->data, data->len);
return ret;
}
RPC_GENERATION_DISPATCH1(cons_t, CONS_PROT, CONS_WRITE, write,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, data)
/*read*/
RPC_GENERATION_OP1(cons_t, CONS_PROT, CONS_WRITE, read,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, data)
{
int16_t ret = -1;
ret = console_read(data->data, data->len);
if (ret > 0)
{
data->len = ret;
}
return ret;
}
RPC_GENERATION_DISPATCH1(cons_t, CONS_PROT, CONS_WRITE, read,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, data)
/*active*/
RPC_GENERATION_OP1(cons_t, CONS_PROT, CONS_WRITE, active,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags)
{
console_active();
return 0;
}
RPC_GENERATION_DISPATCH1(cons_t, CONS_PROT, CONS_WRITE, active,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags)
/*dispatch*/
RPC_DISPATCH3(cons_t, CONS_PROT, typeof(CONS_WRITE), CONS_WRITE, write, CONS_READ, read, CONS_ACTIVE, active)
void cons_svr_obj_init(cons_t *cons)
{
rpc_svr_obj_init(&cons->svr, rpc_cons_t_dispatch, CONS_PROT);
cons->active_pid = -1;
q_init(&cons->r_queue, cons->r_data, CONS_WRITE_BUF_SIZE);
pthread_spin_init(&cons->r_lock, 0);
pthread_mutex_init(&cons->w_lock, NULL);
}

View File

@@ -95,7 +95,7 @@ int app_load(const char *name, uenv_t *cur_env)
{
goto end_del_obj;
}
tag = task_map(hd_task, LOG_PROT, LOG_PROT, KOBJ_DELETE_RIGHT);
tag = task_map(hd_task, cur_env->ns_hd, LOG_PROT, KOBJ_DELETE_RIGHT);
if (msg_tag_get_prot(tag) < 0)
{
goto end_del_obj;
@@ -173,7 +173,7 @@ int app_load(const char *name, uenv_t *cur_env)
// set user env.
uenv_t *uenv = (uenv_t *)((char *)buf_bk + ARG_WORD_NR * 4 + 16 + 16);
uenv->log_hd = LOG_PROT;
uenv->log_hd = cur_env->ns_hd;
uenv->ns_hd = cur_env->ns_hd;
uenv->rev1 = HANDLER_INVALID;
uenv->rev2 = HANDLER_INVALID;

View File

@@ -5,6 +5,7 @@
#include "u_thread.h"
#include "u_rpc_svr.h"
#include "rpc_prot.h"
#include "u_err.h"
#include <errno.h>
#include <assert.h>
#include <stdio.h>

View File

@@ -2,6 +2,7 @@
#include "u_rpc_svr.h"
#include "fs_svr.h"
#include "ff.h"
#include "cons_cli.h"
#include "u_log.h"
#include "u_env.h"
#include <stdio.h>
@@ -128,18 +129,18 @@ int fs_svr_open(const char *path, int flags, int mode)
ret = f_opendir(&file->dir, path);
if (ret != FR_OK)
{
ulog_write_str(u_get_global_env()->log_hd, "open fail..\n");
cons_write_str("open fail..\n");
free_file(fd);
return fatfs_err_conv(ret);
}
file->type = 1;
ulog_write_str(u_get_global_env()->log_hd, "open dir..\n");
cons_write_str("open dir..\n");
}
}
else
{
file->type = 0;
ulog_write_str(u_get_global_env()->log_hd, "open file..\n");
cons_write_str("open file..\n");
}
return fatfs_err_conv(ret);

View File

@@ -4,6 +4,7 @@
#include "u_prot.h"
#include "u_env.h"
#include "u_drv.h"
#include "cons_cli.h"
#include "fs_rpc.h"
#include <ff.h>
#include <stdio.h>
@@ -28,7 +29,7 @@ int main(int args, char *argv[])
res = f_mkfs("0:", &defopt, (void *)(fs.win), FF_MAX_SS); // 第三个参数可以设置成NULL默认使用heap memory
if (res != FR_OK)
{
ulog_write_str(u_get_global_env()->log_hd, "f_mkfs err.\n");
cons_write_str("f_mkfs err.\n");
exit(-1);
}
else
@@ -36,12 +37,12 @@ int main(int args, char *argv[])
res = f_mount(&fs, "0:", 1);
if (res != FR_OK)
{
ulog_write_str(u_get_global_env()->log_hd, "f_mount err.\n");
cons_write_str("f_mount err.\n");
exit(-1);
}
}
}
ulog_write_str(u_get_global_env()->log_hd, "mount success\n");
cons_write_str("mount success\n");
fs_svr_loop();
return 0;

View File

@@ -3,19 +3,21 @@
#include "u_log.h"
#include "u_env.h"
#include "u_sleep.h"
#include "cons_cli.h"
#include <unistd.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include "test.h"
int main(int argc, char *args[])
{
printf("%s start running.\n", args[0]);
usleep(100000);
ulog_write_str(u_get_global_env()->log_hd, "test start...\n");
printf("%s start running.\n", args[0]);
mr_drv_test();
pm_test();
ulog_write_str(u_get_global_env()->log_hd, "test end.\n");
return 0;
}

View File

@@ -2,24 +2,45 @@
#include <u_types.h>
#include <u_queue.h>
#include <u_util.h>
#include <pthread.h>
#include <u_thread.h>
#include <u_log.h>
#include <u_hd_man.h>
#include <u_err.h>
#include <assert.h>
#include <errno.h>
#define CONS_WRITE_BUF_SIZE (128 + 1)
#include <u_sleep.h>
#include <pthread.h>
#include <rpc_prot.h>
#include "cons_svr.h"
#include <stdio.h>
static queue_t r_queue;
static uint8_t r_data[CONS_WRITE_BUF_SIZE];
static pthread_mutex_t r_lock;
static pthread_mutex_t w_lock;
static pid_t active_pid = -1;
AUTO_CALL(101)
static void console_init(void)
static cons_t cons_obj;
static void console_read_func(void)
{
q_init(&r_queue, r_data, CONS_WRITE_BUF_SIZE);
pthread_mutex_init(&r_lock, NULL);
pthread_mutex_init(&w_lock, NULL);
int r_len = ulog_read_bytes(LOG_PROT, cons_obj.r_data_buf, sizeof(cons_obj.r_data_buf));
if (r_len > 0)
{
pthread_spin_lock(&cons_obj.r_lock);
for (int i = 0; i < r_len; i++)
{
q_enqueue(&cons_obj.r_queue, cons_obj.r_data_buf[i]);
}
pthread_spin_unlock(&cons_obj.r_lock);
}
handler_free_umap(cons_obj.hd_cons_read);
while (1)
{
u_sleep_ms(1000);
}
}
void console_init(void)
{
cons_svr_obj_init(&cons_obj);
meta_reg_svr_obj(&cons_obj.svr, CONS_PROT);
printf("cons svr init...\n");
}
/**
* @brief 向控制台写入数据
@@ -29,16 +50,16 @@ static void console_init(void)
*/
int console_write(uint8_t *data, size_t len)
{
pid_t src_pid = thread_get_src_pid();
// pid_t src_pid = thread_get_src_pid();
if (src_pid != active_pid)
{
/*TODO:存储到文件或者通过其他方式*/
return -EACCES;
}
pthread_mutex_lock(&w_lock);
// if (src_pid != cons_obj.active_pid)
// {
// /*TODO:存储到文件或者通过其他方式*/
// return -EACCES;
// }
pthread_mutex_lock(&cons_obj.w_lock);
ulog_write_bytes(LOG_PROT, data, len);
pthread_mutex_unlock(&w_lock);
pthread_mutex_unlock(&cons_obj.w_lock);
return len;
}
@@ -51,15 +72,40 @@ int console_write(uint8_t *data, size_t len)
*/
int console_read(uint8_t *data, size_t len)
{
int r_len;
int r_len = 0;
pid_t src_pid = thread_get_src_pid();
if (src_pid != active_pid)
if (src_pid != cons_obj.active_pid)
{
return -EACCES;
}
r_len = ulog_read_bytes(LOG_PROT, data, len);
if (q_queue_len(&cons_obj.r_queue) == 0)
{
// 回复没有消息
return -ENODATA;
}
else
{
pthread_spin_lock(&cons_obj.r_lock);
if (q_queue_len(&cons_obj.r_queue) == 0)
{
// 回复没有消息
pthread_spin_unlock(&cons_obj.r_lock);
return -ENODATA;
}
int i;
for (i = 0; i < q_queue_len(&cons_obj.r_queue) && i < len; i++)
{
uint8_t e;
if (q_dequeue(&cons_obj.r_queue, &e) < 0)
{
break;
}
data[i] = e;
}
r_len = i;
pthread_spin_unlock(&cons_obj.r_lock);
}
return r_len;
}
/**
@@ -68,5 +114,5 @@ int console_read(uint8_t *data, size_t len)
*/
void console_active(void)
{
active_pid = thread_get_src_pid();
cons_obj.active_pid = thread_get_src_pid();
}

View File

@@ -1,5 +1,3 @@
#pragma once
void console_write(uint8_t *data, size_t len);
int console_read(uint8_t *data, size_t len);
void console_active(void);
void console_init(void);

View File

@@ -1,3 +0,0 @@

View File

@@ -21,7 +21,7 @@
#include "u_app_loader.h"
#include "u_rpc_svr.h"
#include "pm.h"
#include "cons.h"
#include "test/test.h"
#include "u_rpc_svr.h"
#include "namespace.h"
@@ -65,7 +65,7 @@ int main(int argc, char *args[])
rpc_meta_init(THREAD_MAIN, &env->ns_hd);
namespace_init();
pm_init();
console_init();
ret = parse_cfg(DEFAULT_INIT_CFG, env);
printf("run app num is %d.\n", ret);