From a6bc1d330ea32ec47be6734ee86061f8246d2690 Mon Sep 17 00:00:00 2001 From: zhangzheng <1358745329@qq.com> Date: Mon, 2 Oct 2023 01:38:38 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dipc=E6=98=A0=E5=B0=84?= =?UTF-8?q?=E6=97=B6=E9=94=99=E8=AF=AF=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 7 +- mkrtos_knl/inc/knl/prot.h | 14 +- mkrtos_knl/knl/ipc.c | 7 +- mkrtos_user/lib/sys/inc/u_prot.h | 9 +- mkrtos_user/lib/sys_svr/src/ns_cli.c | 3 +- mkrtos_user/lib/sys_svr/src/ns_svr.c | 126 +------- mkrtos_user/lib/sys_util/inc/u_rpc.h | 286 +++++++++--------- mkrtos_user/server/app/drv/sysinfo.c | 4 +- mkrtos_user/server/app/src/main.c | 10 +- .../server/fs/fatfs/ff15/source/ffconf.h | 8 +- mkrtos_user/server/fs/fatfs/fs_rpc.c | 2 +- 11 files changed, 192 insertions(+), 284 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 3aac17916..f6e53ec25 100755 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -174,7 +174,12 @@ "__strerror.h": "c", "sstream": "c", "u_drv.h": "c", - "__node_handle": "c" + "__node_handle": "c", + "__hash_table": "c", + "__tuple": "c", + "limits": "c", + "compare": "c", + "algorithm": "c" }, "cortex-debug.showRTOS": false, "cortex-debug.variableUseNaturalFormat": false, diff --git a/mkrtos_knl/inc/knl/prot.h b/mkrtos_knl/inc/knl/prot.h index d0ab56c45..0f01d261a 100755 --- a/mkrtos_knl/inc/knl/prot.h +++ b/mkrtos_knl/inc/knl/prot.h @@ -1,12 +1,12 @@ /** * @file prot.h * @author zhangzheng (1358745329@qq.com) - * @brief + * @brief * @version 0.1 * @date 2023-09-16 - * + * * @copyright Copyright (c) 2023 - * + * */ #pragma once @@ -83,18 +83,20 @@ typedef union vpage struct { umword_t attrs : 4; //!< 权限 - umword_t : 8; //!< 保留 + umword_t flags : 8; //!< 保留 umword_t addr : (WORD_BITS - 12); //!< 地址 }; } vpage_t; +#define VPAGE_FLAGS_MAP 0x1 //!< 是否ipc时立刻映射操作 + static inline vpage_t vpage_create_raw(umword_t raw) { return (vpage_t){.raw = raw}; } -static inline vpage_t vpage_create3(umword_t attrs, umword_t resv, umword_t addr) +static inline vpage_t vpage_create3(umword_t attrs, umword_t flags, umword_t addr) { - return (vpage_t){.attrs = attrs, .addr = addr}; + return (vpage_t){.attrs = attrs, .flags = flags, .addr = addr}; } static inline obj_handler_t vpage_get_obj_handler(vpage_t vpage) { diff --git a/mkrtos_knl/knl/ipc.c b/mkrtos_knl/knl/ipc.c index 28cef04dc..94415b904 100755 --- a/mkrtos_knl/knl/ipc.c +++ b/mkrtos_knl/knl/ipc.c @@ -220,14 +220,19 @@ static int ipc_data_copy(thread_t *dst_th, thread_t *src_th, msg_tag_t tag) task_t *dst_tk = thread_get_bind_task(dst_th); for (int i = 0; i < map_len; i++) { + int ret = 0; + vpage_t dst_page = vpage_create_raw(dst_ipc->map_buf[i]); vpage_t src_page = vpage_create_raw(src_ipc->map_buf[i]); - int ret = obj_map_src_dst(&dst_tk->obj_space, &src_tk->obj_space, + if (src_page.flags & VPAGE_FLAGS_MAP) + { + ret = obj_map_src_dst(&dst_tk->obj_space, &src_tk->obj_space, vpage_get_obj_handler(dst_page), vpage_get_obj_handler(src_page), dst_tk->lim, vpage_get_attrs(src_page), &del); + } if (ret < 0) { diff --git a/mkrtos_user/lib/sys/inc/u_prot.h b/mkrtos_user/lib/sys/inc/u_prot.h index 8953b4dcf..1be456bd4 100644 --- a/mkrtos_user/lib/sys/inc/u_prot.h +++ b/mkrtos_user/lib/sys/inc/u_prot.h @@ -14,7 +14,6 @@ #define THREAD_MAIN THREAD_PROT #define TASK_THIS TASK_PROT - #define MSG_TAG_KNL_ERR 0x8 typedef union msg_tag @@ -79,16 +78,18 @@ typedef union vpage struct { umword_t attrs : 4; //!< 权限 - umword_t : 8; //!< 保留 + umword_t flags : 8; //!< 保留 umword_t addr : (WORD_BITS - 12); //!< 地址 }; } vpage_t; +#define VPAGE_FLAGS_MAP 0x1 //!< 是否ipc时立刻映射 + static inline vpage_t vpage_create_raw(umword_t raw) { return (vpage_t){.raw = raw}; } -static inline vpage_t vpage_create_raw3(umword_t attrs, umword_t resv, umword_t addr) +static inline vpage_t vpage_create_raw3(umword_t attrs, umword_t flags, umword_t addr) { - return (vpage_t){.attrs = attrs, .addr = addr}; + return (vpage_t){.attrs = attrs, .flags = flags, .addr = addr}; } diff --git a/mkrtos_user/lib/sys_svr/src/ns_cli.c b/mkrtos_user/lib/sys_svr/src/ns_cli.c index 9f6246eed..08fcff208 100644 --- a/mkrtos_user/lib/sys_svr/src/ns_cli.c +++ b/mkrtos_user/lib/sys_svr/src/ns_cli.c @@ -106,6 +106,7 @@ int ns_query(const char *path, obj_handler_t *svr_hd) }; rpc_obj_handler_t_t rpc_svr_hd = { .data = newfd, + .del_map_flags = VPAGE_FLAGS_MAP, }; msg_tag_t tag = ns_t_query_call(u_get_global_env()->ns_hd, &rpc_path, &rpc_svr_hd); @@ -117,7 +118,7 @@ int ns_query(const char *path, obj_handler_t *svr_hd) } if (reg_hd(path, newfd) == FALSE) { - printf("客户端服务缓存区已满.\n"); + printf("The client service cache is full.\n"); handler_free_umap(newfd); return -ENOMEM; } diff --git a/mkrtos_user/lib/sys_svr/src/ns_svr.c b/mkrtos_user/lib/sys_svr/src/ns_svr.c index 8863ce602..b80aff426 100644 --- a/mkrtos_user/lib/sys_svr/src/ns_svr.c +++ b/mkrtos_user/lib/sys_svr/src/ns_svr.c @@ -37,133 +37,19 @@ RPC_GENERATION_OP2(ns_t, NS_QUERY_OP, query, int ret = namespace_query((char *)(path->data), &cli_hd->data); if (ret >= 0) { - printf("请求服务[%s]成功.\n", (char *)(path->data)); + printf("The request service [%s] was successful.", (char *)(path->data)); } else { - printf("请求服务[%s]失败.\n", (char *)(path->data)); + printf("Failed to request service [%s]", (char *)(path->data)); } return ret; } -// RPC_GENERATION_DISPATCH2(ns_t, NS_QUERY_OP, query, -// rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, path, -// rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_INOUT, RPC_TYPE_BUF, cli_hd) -msg_tag_t ns_t_query_dispatch(ns_t *obj, msg_tag_t tag, ipc_msg_t *ipc_msg) -{ - rpc_array_uint32_t_uint8_t_32_t var0; - rpc_obj_handler_t_t var1; - size_t op_val; - uint8_t *value = (uint8_t *)(ipc_msg->msg_buf); - int off = 0; - rpc_var_rpc_array_uint32_t_uint8_t_32_t_init(&var0); - rpc_var_rpc_obj_handler_t_t_init(&var1); - op_val = *((typeof(((uint16_t)1)) *)value); - if (op_val != ((uint16_t)1)) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (-71)}); - } - off += sizeof(typeof(((uint16_t)1))); - off = rpc_align(off, __alignof(typeof(((uint16_t)1)))); - do - { - if (1 == 1) - { - if (1 == 1 || 1 == 4) - { - int ret = rpc_svr_buf_to_msg_rpc_array_uint32_t_uint8_t_32_t(&var0, (uint8_t *)(value), off, tag.msg_buf_len * (sizeof(void *))); - if (ret < 0) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)}); - } - off = ret; - } - } - } while (0); - do - { - if (2 == 1) - { - if (4 == 1 || 4 == 4) - { - int ret = rpc_svr_buf_to_msg_rpc_obj_handler_t_t(&var1, (uint8_t *)(value), off, tag.msg_buf_len * (sizeof(void *))); - if (ret < 0) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)}); - } - off = ret; - } - } - } while (0); - short ret_val = ns_t_query_op(obj, &var0, &var1); - if (ret_val < 0) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret_val)}); - } - off = 0; - int off_map = 0; - do - { - if (1 == 1) - { - if (1 == 2 || 1 == 4) - { - int ret = rpc_svr_msg_to_buf_rpc_array_uint32_t_uint8_t_32_t(&var0, (uint8_t *)(value), off); - if (ret < 0) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)}); - } - off = ret; - } - } - } while (0); - do - { - if (2 == 1) - { - if (4 == 2 || 4 == 4) - { - int ret = rpc_svr_msg_to_buf_rpc_obj_handler_t_t(&var1, (uint8_t *)(value), off); - if (ret < 0) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)}); - } - off = ret; - } - } - } while (0); - do - { - if (1 == 2) - { - if (1 == 2 || 1 == 4) - { - int ret = rpc_svr_msg_to_buf_rpc_array_uint32_t_uint8_t_32_t(&var0, (uint8_t *)(ipc_msg->map_buf), off_map); - if (ret < 0) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)}); - } - off_map = ret; - } - } - } while (0); - do - { - if (2 == 2) - { - if (4 == 2 || 4 == 4) - { - int ret = rpc_svr_msg_to_buf_rpc_obj_handler_t_t(&var1, (uint8_t *)(ipc_msg->map_buf), off_map); - if (ret < 0) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)}); - } - off_map = ret; - } - } - } while (0); - return ((msg_tag_t){.flags = (0), .msg_buf_len = ((((off) / ((sizeof(void *)))) + (((off) % ((sizeof(void *)))) ? 1 : 0))), .map_buf_len = ((((off_map) / ((sizeof(void *)))) + (((off_map) % ((sizeof(void *)))) ? 1 : 0))), .prot = (ret_val)}); -} +RPC_GENERATION_DISPATCH2(ns_t, NS_QUERY_OP, query, + rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, path, + rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_INOUT, RPC_TYPE_BUF, cli_hd) + RPC_DISPATCH2(ns_t, typeof(NS_REGISTER_OP), NS_REGISTER_OP, register, NS_QUERY_OP, query) void ns_init(ns_t *ns) diff --git a/mkrtos_user/lib/sys_util/inc/u_rpc.h b/mkrtos_user/lib/sys_util/inc/u_rpc.h index bbe152878..deca319dc 100644 --- a/mkrtos_user/lib/sys_util/inc/u_rpc.h +++ b/mkrtos_user/lib/sys_util/inc/u_rpc.h @@ -189,98 +189,97 @@ RPC_TYPE_DEF_ALL(int) //!< 定义所有的 * @brief 数组类型的RPC定义,用于定义任意长度 * */ -#define RPC_ARRAY_DEF(len_type, data_type, length) \ - RPC_ARRAY_TYPE_DEF(len_type, data_type, length); \ - RPC_SVR_MSG_TO_BUF_WITHOUT_IMPL(rpc_array_##len_type##_##data_type##_##length##_t, int) \ - { \ - if (rpc_align(len, __alignof(d->len)) + d->len > \ - IPC_MSG_SIZE) \ - { \ - return -ETOLONG; \ - } \ - len = rpc_align(len, __alignof(d->len)); \ - *((typeof(d->len) *)(&buf[len])) = d->len; \ - if (rpc_align(d->len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > IPC_MSG_SIZE) \ - { \ - return -ETOLONG; \ - } \ - len += sizeof(d->len); \ - len = rpc_align(len, __alignof(d->data[0])); \ - for (int i = 0; i < d->len * sizeof(d->data[0]); i++) \ - { \ - buf[i + len] = ((uint8_t *)(d->data))[i]; \ - } \ - len += d->len * sizeof(d->data[0]); \ - return len; \ - } \ - RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(rpc_array_##len_type##_##data_type##_##length##_t, int) \ - { \ - if (rpc_align(len, __alignof(d->len)) + d->len > \ - max) \ - { \ - return -ETOLONG; \ - } \ - len = rpc_align(len, __alignof(d->len)); \ - d->len = *((typeof(d->len) *)(&buf[len])); \ - if (rpc_align(d->len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > max) \ - { \ - return -ETOLONG; \ - } \ - len += sizeof(d->len); \ - len = rpc_align(len, __alignof(d->data[0])); \ - for (int i = 0; i < d->len * sizeof(d->data[0]); i++) \ - { \ - ((uint8_t *)(d->data))[i] = buf[i + len]; \ - } \ - len += d->len * sizeof(d->data[0]); \ - return len; \ - } \ - RPC_CLI_MSG_TO_BUF_WITHOUT_IMPL(rpc_array_##len_type##_##data_type##_##length##_t, int) \ - { \ - if (rpc_align(len, __alignof(d->len)) + d->len > \ - IPC_MSG_SIZE) \ - { \ - return -ETOLONG; \ - } \ - len = rpc_align(len, __alignof(d->len)); \ - *((typeof(d->len) *)(&buf[len])) = d->len; \ - if (rpc_align(d->len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > IPC_MSG_SIZE) \ - { \ - return -ETOLONG; \ - } \ - len += sizeof(d->len); \ - len = rpc_align(len, __alignof(d->data[0])); \ - for (int i = 0; i < d->len * sizeof(d->data[0]); i++) \ - { \ - buf[i + len] = ((uint8_t *)(d->data))[i]; \ - } \ - len += d->len * sizeof(d->data[0]); \ - return len; \ - } \ - RPC_CLI_BUF_TO_MSG_WITHOUT_IMPL(rpc_array_##len_type##_##data_type##_##length##_t, int) \ - { \ - if (rpc_align(len, __alignof(d->len)) + d->len > \ - max) \ - { \ - return -ETOLONG; \ - } \ - len = rpc_align(len, __alignof(d->len)); \ - d->len = *((typeof(d->len) *)(&buf[len])); \ - if (rpc_align(d->len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > max) \ - { \ - return -ETOLONG; \ - } \ - len += sizeof(d->len); \ - len = rpc_align(len, __alignof(d->data[0])); \ - for (int i = 0; i < d->len * sizeof(d->data[0]); i++) \ - { \ - ((uint8_t *)(d->data))[i] = buf[i + len]; \ - } \ - len += d->len * sizeof(d->data[0]); \ - return len; \ - } \ - RPC_TYPE_INIT_WITHOUT_IMPL(rpc_array_##len_type##_##data_type##_##length##_t) \ - { \ +#define RPC_ARRAY_DEF(len_type, data_type, length) \ + RPC_ARRAY_TYPE_DEF(len_type, data_type, length); \ + RPC_SVR_MSG_TO_BUF_WITHOUT_IMPL(rpc_array_##len_type##_##data_type##_##length##_t, int) \ + { \ + if (rpc_align(len, __alignof(d->len)) > \ + IPC_MSG_SIZE) \ + { \ + return -ETOLONG; \ + } \ + len = rpc_align(len, __alignof(d->len)); \ + *((typeof(d->len) *)(&buf[len])) = d->len; \ + if (rpc_align(len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > IPC_MSG_SIZE) \ + { \ + return -ETOLONG; \ + } \ + len += sizeof(d->len); \ + len = rpc_align(len, __alignof(d->data[0])); \ + for (int i = 0; i < d->len * sizeof(d->data[0]); i++) \ + { \ + buf[i + len] = ((uint8_t *)(d->data))[i]; \ + } \ + len += d->len * sizeof(d->data[0]); \ + return len; \ + } \ + RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(rpc_array_##len_type##_##data_type##_##length##_t, int) \ + { \ + if (rpc_align(len, __alignof(d->len)) > \ + max) \ + { \ + return -ETOLONG; \ + } \ + len = rpc_align(len, __alignof(d->len)); \ + d->len = *((typeof(d->len) *)(&buf[len])); \ + if (rpc_align(len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > max) \ + { \ + return -ETOLONG; \ + } \ + len += sizeof(d->len); \ + len = rpc_align(len, __alignof(d->data[0])); \ + for (int i = 0; i < d->len * sizeof(d->data[0]); i++) \ + { \ + ((uint8_t *)(d->data))[i] = buf[i + len]; \ + } \ + len += d->len * sizeof(d->data[0]); \ + return len; \ + } \ + RPC_CLI_MSG_TO_BUF_WITHOUT_IMPL(rpc_array_##len_type##_##data_type##_##length##_t, int) \ + { \ + if (rpc_align(len, __alignof(d->len)) > \ + IPC_MSG_SIZE) \ + { \ + return -ETOLONG; \ + } \ + len = rpc_align(len, __alignof(d->len)); \ + *((typeof(d->len) *)(&buf[len])) = d->len; \ + if (rpc_align(len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > IPC_MSG_SIZE) \ + { \ + return -ETOLONG; \ + } \ + len += sizeof(d->len); \ + len = rpc_align(len, __alignof(d->data[0])); \ + for (int i = 0; i < d->len * sizeof(d->data[0]); i++) \ + { \ + buf[i + len] = ((uint8_t *)(d->data))[i]; \ + } \ + len += d->len * sizeof(d->data[0]); \ + return len; \ + } \ + RPC_CLI_BUF_TO_MSG_WITHOUT_IMPL(rpc_array_##len_type##_##data_type##_##length##_t, int) \ + { \ + if (rpc_align(len, __alignof(d->len)) > max) \ + { \ + return -ETOLONG; \ + } \ + len = rpc_align(len, __alignof(d->len)); \ + d->len = *((typeof(d->len) *)(&buf[len])); \ + if (rpc_align(len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > max) \ + { \ + return -ETOLONG; \ + } \ + len += sizeof(d->len); \ + len = rpc_align(len, __alignof(d->data[0])); \ + for (int i = 0; i < d->len * sizeof(d->data[0]); i++) \ + { \ + ((uint8_t *)(d->data))[i] = buf[i + len]; \ + } \ + len += d->len * sizeof(d->data[0]); \ + return len; \ + } \ + RPC_TYPE_INIT_WITHOUT_IMPL(rpc_array_##len_type##_##data_type##_##length##_t) \ + { \ } //!< end /** @@ -304,50 +303,50 @@ RPC_ARRAY_DEF(uint32_t, uint8_t, 32) * @brief 引用类型的数组定义 * */ -#define RPC_REF_ARRAY_DEF(len_type, data_type, length) \ - RPC_REF_ARRAY_TYPE_DEF(len_type, data_type, length); \ - RPC_CLI_MSG_TO_BUF_WITHOUT_IMPL(rpc_ref_array_##len_type##_##data_type##_##length##_t, int) \ - { \ - if (rpc_align(len, __alignof(d->len)) + d->len > IPC_MSG_SIZE) \ - { \ - return -ETOLONG; \ - } \ - len = rpc_align(len, __alignof(d->len)); \ - *((typeof(d->len) *)(&buf[len])) = d->len; \ - if (rpc_align(d->len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > IPC_MSG_SIZE) \ - { \ - return -ETOLONG; \ - } \ - len += sizeof(d->len); \ - len = rpc_align(len, __alignof(d->data[0])); \ - for (int i = 0; i < d->len * sizeof(d->data[0]); i++) \ - { \ - buf[i + len] = ((uint8_t *)(d->data))[i]; \ - } \ - len += d->len * sizeof(d->data[0]); \ - return len; \ - } \ - RPC_CLI_BUF_TO_MSG_WITHOUT_IMPL(rpc_ref_array_uint32_t_uint8_t_32_t, int) \ - { \ - if (rpc_align(len, __alignof(d->len)) + d->len > \ - max) \ - { \ - return -ETOLONG; \ - } \ - len = rpc_align(len, __alignof(d->len)); \ - d->len = *((typeof(d->len) *)(&buf[len])); \ - if (rpc_align(d->len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > max) \ - { \ - return -ETOLONG; \ - } \ - len += sizeof(d->len); \ - len = rpc_align(len, __alignof(d->data[0])); \ - for (int i = 0; i < d->len * sizeof(d->data[0]); i++) \ - { \ - ((uint8_t *)(d->data))[i] = buf[i + len]; \ - } \ - len += d->len * sizeof(d->data[0]); \ - return len; \ +#define RPC_REF_ARRAY_DEF(len_type, data_type, length) \ + RPC_REF_ARRAY_TYPE_DEF(len_type, data_type, length); \ + RPC_CLI_MSG_TO_BUF_WITHOUT_IMPL(rpc_ref_array_##len_type##_##data_type##_##length##_t, int) \ + { \ + if (rpc_align(len, __alignof(d->len)) > IPC_MSG_SIZE) \ + { \ + return -ETOLONG; \ + } \ + len = rpc_align(len, __alignof(d->len)); \ + *((typeof(d->len) *)(&buf[len])) = d->len; \ + if (rpc_align(len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > IPC_MSG_SIZE) \ + { \ + return -ETOLONG; \ + } \ + len += sizeof(d->len); \ + len = rpc_align(len, __alignof(d->data[0])); \ + for (int i = 0; i < d->len * sizeof(d->data[0]); i++) \ + { \ + buf[i + len] = ((uint8_t *)(d->data))[i]; \ + } \ + len += d->len * sizeof(d->data[0]); \ + return len; \ + } \ + RPC_CLI_BUF_TO_MSG_WITHOUT_IMPL(rpc_ref_array_uint32_t_uint8_t_32_t, int) \ + { \ + if (rpc_align(len, __alignof(d->len)) > \ + max) \ + { \ + return -ETOLONG; \ + } \ + len = rpc_align(len, __alignof(d->len)); \ + d->len = *((typeof(d->len) *)(&buf[len])); \ + if (rpc_align(len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > max) \ + { \ + return -ETOLONG; \ + } \ + len += sizeof(d->len); \ + len = rpc_align(len, __alignof(d->data[0])); \ + for (int i = 0; i < d->len * sizeof(d->data[0]); i++) \ + { \ + ((uint8_t *)(d->data))[i] = buf[i + len]; \ + } \ + len += d->len * sizeof(d->data[0]); \ + return len; \ } //!< end @@ -361,7 +360,16 @@ RPC_REF_ARRAY_DEF(uint32_t, uint8_t, 32) * @brief Construct a new rpc type def object * */ -RPC_TYPE_DEF(obj_handler_t); +// RPC_TYPE_DEF(obj_handler_t); +#define RPC_OBJ_HANDLER_TYPE_DEF(type) \ + typedef struct rpc_##type \ + { \ + type data; \ + uint8_t del_map_flags; \ + } rpc_##type##_t + +RPC_OBJ_HANDLER_TYPE_DEF(obj_handler_t); + /** * @brief Construct a new rpc cli msg to buf without impl object * @@ -373,7 +381,7 @@ RPC_CLI_MSG_TO_BUF_WITHOUT_IMPL(rpc_obj_handler_t_t, int) return -ETOLONG; } len = rpc_align(len, __alignof(d->data)); - *((umword_t *)(buf + len)) = vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, d->data).raw; + *((umword_t *)(buf + len)) = vpage_create_raw3(KOBJ_ALL_RIGHTS, 0xff & (~(d->del_map_flags)), d->data).raw; return sizeof(d->data) + rpc_align(len, __alignof(d->data)); } /** @@ -395,7 +403,7 @@ RPC_SVR_MSG_TO_BUF_WITHOUT_IMPL(rpc_obj_handler_t_t, int) return -ETOLONG; } len = rpc_align(len, __alignof(d->data)); - *((umword_t *)(buf + len)) = vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, d->data).raw; + *((umword_t *)(buf + len)) = vpage_create_raw3(KOBJ_ALL_RIGHTS, 0xff & (~(d->del_map_flags)), d->data).raw; return sizeof(d->data) + rpc_align(len, __alignof(d->data)); } /** diff --git a/mkrtos_user/server/app/drv/sysinfo.c b/mkrtos_user/server/app/drv/sysinfo.c index ff0a2b66b..b6a8eb4f6 100644 --- a/mkrtos_user/server/app/drv/sysinfo.c +++ b/mkrtos_user/server/app/drv/sysinfo.c @@ -21,7 +21,7 @@ void sys_info_unlock(void) int sys_info_save(void) { - int fd = fs_open("/sys_info.bin", O_CREAT | O_RDONLY, 0777); + int fd = fs_open("/sys_info.bin", O_CREAT | O_WRONLY, 0777); if (fd < 0) { return fd; @@ -40,7 +40,7 @@ int sys_info_save(void) } int sys_info_read(void) { - int fd = fs_open("/sys_info.bin", O_CREAT | O_WRONLY, 0777); + int fd = fs_open("/sys_info.bin", O_CREAT | O_RDONLY, 0777); if (fd < 0) { return fd; diff --git a/mkrtos_user/server/app/src/main.c b/mkrtos_user/server/app/src/main.c index ac1158f8a..e02af152f 100644 --- a/mkrtos_user/server/app/src/main.c +++ b/mkrtos_user/server/app/src/main.c @@ -25,11 +25,11 @@ int main(int argc, char *args[]) printf("argc:%d args[0]:%s\n", argc, args[0]); drv_init(); u_sleep_ms(100); - sys_info.devID = 12; - sys_info_save(); - sys_info.devID = 0; - sys_info_read(); - assert(sys_info.devID == 12); + // sys_info.devID = 12; + // sys_info_save(); + // sys_info.devID = 0; + // sys_info_read(); + // assert(sys_info.devID == 12); ulog_write_str(u_get_global_env()->log_hd, "app start..\n"); relay_test(); while (1) diff --git a/mkrtos_user/server/fs/fatfs/ff15/source/ffconf.h b/mkrtos_user/server/fs/fatfs/ff15/source/ffconf.h index 79575d122..13168ceee 100644 --- a/mkrtos_user/server/fs/fatfs/ff15/source/ffconf.h +++ b/mkrtos_user/server/fs/fatfs/ff15/source/ffconf.h @@ -84,7 +84,7 @@ / Locale and Namespace Configurations /---------------------------------------------------------------------------*/ -#define FF_CODE_PAGE 932 +#define FF_CODE_PAGE 437 /* This option specifies the OEM code page to be used on the target system. / Incorrect code page setting can cause a file open failure. / @@ -113,8 +113,8 @@ */ -#define FF_USE_LFN 0 -#define FF_MAX_LFN 255 +#define FF_USE_LFN 1 +#define FF_MAX_LFN 64 /* The FF_USE_LFN switches the support for LFN (long file name). / / 0: Disable LFN. FF_MAX_LFN has no effect. @@ -224,7 +224,7 @@ / System Configurations /---------------------------------------------------------------------------*/ -#define FF_FS_TINY 0 +#define FF_FS_TINY 1 /* This option switches tiny buffer configuration. (0:Normal or 1:Tiny) / At the tiny configuration, size of file object (FIL) is shrinked FF_MAX_SS bytes. / Instead of private sector buffer eliminated from the file object, common sector diff --git a/mkrtos_user/server/fs/fatfs/fs_rpc.c b/mkrtos_user/server/fs/fatfs/fs_rpc.c index 3eab384f3..f53dbd8f2 100644 --- a/mkrtos_user/server/fs/fatfs/fs_rpc.c +++ b/mkrtos_user/server/fs/fatfs/fs_rpc.c @@ -18,7 +18,7 @@ typedef struct file_desc FIL fp; } file_desc_t; -#define FILE_DESC_NR 1 +#define FILE_DESC_NR 8 static file_desc_t files[FILE_DESC_NR]; void *file_temp_buf_get(void)