支持console
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -2,3 +2,4 @@
|
||||
|
||||
#define MK_ENOBUFS 105
|
||||
#define ETOLONG 1024
|
||||
#define ENOREPLY 1025
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
9
mkrtos_user/lib/sys_svr/inc/cons_cli.h
Normal file
9
mkrtos_user/lib/sys_svr/inc/cons_cli.h
Normal 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);
|
||||
26
mkrtos_user/lib/sys_svr/inc/cons_svr.h
Normal file
26
mkrtos_user/lib/sys_svr/inc/cons_svr.h
Normal 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);
|
||||
@@ -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)
|
||||
65
mkrtos_user/lib/sys_svr/src/cons_cli.c
Normal file
65
mkrtos_user/lib/sys_svr/src/cons_cli.c
Normal 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);
|
||||
}
|
||||
57
mkrtos_user/lib/sys_svr/src/cons_svr.c
Normal file
57
mkrtos_user/lib/sys_svr/src/cons_svr.c
Normal 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);
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user