From cdb4adb0abacf58d44093d0c72f3208f6a9f6369 Mon Sep 17 00:00:00 2001 From: zhangzheng <1358745329@qq.com> Date: Sat, 23 Sep 2023 13:15:09 +0800 Subject: [PATCH] =?UTF-8?q?rpc=E5=9F=BA=E6=9C=AC=E5=8F=AF=E7=94=A8?= =?UTF-8?q?=EF=BC=88=E5=85=A8=E9=9D=99=E6=80=81=E5=AE=9E=E7=8E=B0=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 4 +- mkrtos_user/lib/sys_util/inc/u_rpc.h | 628 ++++++++++++++++-------- mkrtos_user/server/shell/src/rpc_test.c | 247 +++++----- 3 files changed, 553 insertions(+), 326 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index b657a9e50..7ab041e34 100755 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -10,8 +10,8 @@ "cwd": "${fileDirname}", "environment": [], "externalConsole": false, - // "miDebuggerPath": "/opt/homebrew/bin/arm-none-eabi-gdb", - "miDebuggerPath": "/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gdb", + "miDebuggerPath": "/opt/homebrew/bin/arm-none-eabi-gdb", + // "miDebuggerPath": "/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gdb", "miDebuggerServerAddress": "127.0.0.1:3333", "MIMode": "gdb", "setupCommands": [ diff --git a/mkrtos_user/lib/sys_util/inc/u_rpc.h b/mkrtos_user/lib/sys_util/inc/u_rpc.h index 21dc9bbb3..02b6fd96f 100644 --- a/mkrtos_user/lib/sys_util/inc/u_rpc.h +++ b/mkrtos_user/lib/sys_util/inc/u_rpc.h @@ -1,4 +1,14 @@ -#pragma once + +/** + * @file u_rpc.h + * @author zhangzheng (1358745329@qq.com) + * @brief + * @version 0.1 + * @date 2023-09-23 + * + * @copyright Copyright (c) 2023 + * + */ #include "u_types.h" #include "u_thread.h" @@ -9,6 +19,9 @@ #include #include +extern msg_tag_t dispatch_test(msg_tag_t tag, ipc_msg_t *msg); + +/*rpc变量定义宏*/ #define RPC_TYPE_DEF(type) \ typedef struct rpc_##type \ { \ @@ -30,7 +43,7 @@ static inline void rpc_memcpy(void *dst, void *src, size_t size) } } -/*定义变量初始化宏*/ +/*定义变量初始化宏函数*/ #define RPC_TYPE_INIT(data_type) \ static inline void rpc_var_##data_type##_init(data_type *d) \ { \ @@ -40,13 +53,19 @@ static inline void rpc_memcpy(void *dst, void *src, size_t size) tmp[i] = 0; \ } \ } +/*RPC的初始化函数定义*/ #define RPC_TYPE_INIT_WITHOUT_IMPL(data_type) \ static inline void rpc_var_##data_type##_init(data_type *d) +/*定义一个call函数*/ #define RPC_TYPE_INIT_FUNC_CALL(data_type, d) \ rpc_var_##data_type##_init(d) /*end*/ /*普通数据定义*/ +/** + * @brief 客户端消息填充到buf + * + */ #define RPC_CLI_MSG_TO_BUF(data_type, len_type) \ static inline int rpc_cli_msg_to_buf_##data_type(data_type *d, uint8_t *buf, len_type len) \ { \ @@ -60,7 +79,10 @@ static inline void rpc_memcpy(void *dst, void *src, size_t size) } #define RPC_CLI_MSG_TO_BUF_WITHOUT_IMPL(data_type, len_type) \ static inline int rpc_cli_msg_to_buf_##data_type(data_type *d, uint8_t *buf, len_type len) - +/** + * @brief 服务端buf填充到消息 + * + */ #define RPC_SVR_BUF_TO_MSG(data_type, len_type) \ static inline int rpc_svr_buf_to_msg_##data_type(data_type *d, uint8_t *buf, len_type len, len_type max) \ { \ @@ -72,10 +94,17 @@ static inline void rpc_memcpy(void *dst, void *src, size_t size) d->data = *((typeof(d->data) *)(buf + len)); \ return sizeof(d->data) + rpc_align(len, __alignof(d->data)); \ } - +/** + * @brief 服务端buf填充到消息定义 + * + */ #define RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(data_type, len_type) \ static inline int rpc_svr_buf_to_msg_##data_type(data_type *d, uint8_t *buf, len_type len, len_type max) +/** + * @brief 客户端buf填充到消息 + * + */ #define RPC_CLI_BUF_TO_MSG(data_type, len_type) \ static inline int rpc_cli_buf_to_msg_##data_type(data_type *d, uint8_t *buf, len_type len, len_type max) \ { \ @@ -87,9 +116,18 @@ static inline void rpc_memcpy(void *dst, void *src, size_t size) d->data = *((typeof(d->data) *)(buf + len)); \ return sizeof(d->data) + rpc_align(len, __alignof(d->data)); \ } + +/** + * @brief 客户端buf填充到消息定义 + * + */ #define RPC_CLI_BUF_TO_MSG_WITHOUT_IMPL(data_type, len_type) \ static inline int rpc_cli_buf_to_msg_##data_type(data_type *d, uint8_t *buf, len_type len, len_type max) +/** + * @brief 服务端消息填充到buf + * + */ #define RPC_SVR_MSG_TO_BUF(data_type, len_type) \ static inline int rpc_svr_msg_to_buf_##data_type(data_type *d, uint8_t *buf, len_type len) \ { \ @@ -101,22 +139,45 @@ static inline void rpc_memcpy(void *dst, void *src, size_t size) *((typeof(d->data) *)(buf + len)) = d->data; \ return sizeof(d->data) + rpc_align(len, __alignof(d->data)); \ } + +/** + * @brief 服务端消息填充到buf定义 + * + */ #define RPC_SVR_MSG_TO_BUF_WITHOUT_IMPL(data_type, len_type) \ static inline int rpc_svr_msg_to_buf_##data_type(data_type *d, uint8_t *buf, len_type len) +/** + * @brief 客户端rpc类型转换为服务端类型 + * + */ +#define RPC_CLI_TYPE_TRAN_TO_SVR_TYPE(cli_type, svr_type) \ + static inline void rpc_cli_##cli_type##_tran_to_svr_##svr_type(cli_type *cli, svr_type *svr) \ + { \ + cli->data = svr->data; \ + } + /*end*/ +/** + * @brief 该宏用于定义一个普通的rpc类型 + * + */ #define RPC_TYPE_DEF_ALL(type) \ RPC_TYPE_DEF(type); \ RPC_CLI_MSG_TO_BUF(rpc_##type##_t, int) \ RPC_CLI_BUF_TO_MSG(rpc_##type##_t, int) \ RPC_SVR_BUF_TO_MSG(rpc_##type##_t, int) \ RPC_SVR_MSG_TO_BUF(rpc_##type##_t, int) \ - RPC_TYPE_INIT(rpc_##type##_t) + RPC_TYPE_INIT(rpc_##type##_t) \ + RPC_CLI_TYPE_TRAN_TO_SVR_TYPE(rpc_##type##_t, rpc_##type##_t) RPC_TYPE_DEF_ALL(int) //!< 定义所有的 -//!< 数组定义 +/** + * @brief 数组类型的rpc类型定义 + * + */ #define RPC_ARRAY_TYPE_DEF(len_type, data_type, length) \ typedef struct rpc_array_##len_type##_##data_type##_##length \ { \ @@ -124,52 +185,110 @@ RPC_TYPE_DEF_ALL(int) //!< 定义所有的 data_type data[length]; \ } rpc_array_##len_type##_##data_type##_##length##_t -RPC_ARRAY_TYPE_DEF(uint32_t, uint8_t, 32); -RPC_CLI_MSG_TO_BUF_WITHOUT_IMPL(rpc_array_uint32_t_uint8_t_32_t, int) -{ - if (rpc_align(d->len, __alignof(d->len) + sizeof(d->len)) > IPC_MSG_SIZE) - { - return -ETOLONG; +/** + * @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(d->len, __alignof(d->len) + sizeof(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(d->len, __alignof(d->len) + sizeof(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(d->len, __alignof(d->len) + sizeof(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(d->len, __alignof(d->len) + sizeof(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) \ + { \ } - 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_uint32_t_uint8_t_32_t, int) -{ - if (rpc_align(d->len, __alignof(d->len) + sizeof(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; -} //!< end +/** + * @brief 定义一个32字节长度的数组 + * + */ +RPC_ARRAY_DEF(uint32_t, uint8_t, 32) -//!< ref数组定义 +/** + * @brief 引用类型的数组定义,数组的数据来自其它地方 + * + */ #define RPC_REF_ARRAY_TYPE_DEF(len_type, data_type, length) \ typedef struct rpc_ref_array_##len_type##_##data_type##_##length \ { \ @@ -177,53 +296,71 @@ RPC_CLI_BUF_TO_MSG_WITHOUT_IMPL(rpc_array_uint32_t_uint8_t_32_t, int) data_type *data; \ } rpc_ref_array_##len_type##_##data_type##_##length##_t -RPC_REF_ARRAY_TYPE_DEF(uint32_t, uint8_t, 32); -RPC_CLI_MSG_TO_BUF_WITHOUT_IMPL(rpc_ref_array_uint32_t_uint8_t_32_t, int) -{ - if (rpc_align(d->len, __alignof(d->len) + sizeof(d->len)) >= IPC_MSG_SIZE) - { - return -ETOLONG; +/** + * @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(d->len, __alignof(d->len) + sizeof(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(d->len, __alignof(d->len) + sizeof(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; \ } - 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(d->len, __alignof(d->len) + sizeof(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; -} //!< end -//!< 映射类型定义 +/** + * @brief 定义一个32自己长度的引用数组 + * + */ +RPC_REF_ARRAY_DEF(uint32_t, uint8_t, 32) + +/** + * @brief Construct a new rpc type def object + * + */ RPC_TYPE_DEF(obj_handler_t); +/** + * @brief Construct a new rpc cli msg to buf without impl object + * + */ RPC_CLI_MSG_TO_BUF_WITHOUT_IMPL(rpc_obj_handler_t_t, int) { if (sizeof(d->data) + rpc_align(len, __alignof(d->data)) > IPC_MSG_SIZE) @@ -234,10 +371,18 @@ RPC_CLI_MSG_TO_BUF_WITHOUT_IMPL(rpc_obj_handler_t_t, int) *((umword_t *)(buf + len)) = vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, d->data).raw; return sizeof(d->data) + rpc_align(len, __alignof(d->data)); } +/** + * @brief Construct a new rpc cli buf to msg without impl object + * + */ RPC_CLI_BUF_TO_MSG_WITHOUT_IMPL(rpc_obj_handler_t_t, int) { return len; } +/** + * @brief Construct a new rpc svr msg to buf without impl object + * + */ RPC_SVR_MSG_TO_BUF_WITHOUT_IMPL(rpc_obj_handler_t_t, int) { if (sizeof(d->data) + rpc_align(len, __alignof(d->data)) > IPC_MSG_SIZE) @@ -248,20 +393,34 @@ RPC_SVR_MSG_TO_BUF_WITHOUT_IMPL(rpc_obj_handler_t_t, int) *((umword_t *)(buf + len)) = vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, d->data).raw; return sizeof(d->data) + rpc_align(len, __alignof(d->data)); } +/** + * @brief Construct a new rpc svr buf to msg without impl object + * + */ RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(rpc_obj_handler_t_t, int) { return len; } +/** + * @brief Construct a new rpc type init without impl object + * + */ +RPC_TYPE_INIT_WITHOUT_IMPL(rpc_obj_handler_t_t) +{ +} //!< end -#define RPC_DIR_IN 1 -#define RPC_DIR_OUT 2 -#define RPC_DIR_INOUT 4 +#define RPC_DIR_IN 1 //!< 输入类型 +#define RPC_DIR_OUT 2 //!< 输出类型 +#define RPC_DIR_INOUT 4 //!< 输入输出类型 -#define RPC_TYPE_DATA 1 -#define RPC_TYPE_BUF 2 +#define RPC_TYPE_DATA 1 //!< 数据类型 +#define RPC_TYPE_BUF 2 //!< 映射类型 -/*客户端吧数据放到buf里面去*/ +/** + * @brief 客户端吧数据放到buf里面去 + * + */ #define RPC_CLI_MSG_TO_BUF_IN(rpc_type, var_type, var, dir, buf, off) \ do \ { \ @@ -297,8 +456,11 @@ RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(rpc_obj_handler_t_t, int) } \ } while (0) -/*客户端往映射缓冲区里面填充数据*/ -#define PRC_CLI_FILL_MAP_BUF(rpc_type, var_type, var, dir, buf, off) \ +/** + * @brief 客户端往映射缓冲区里面填充数据 + * + */ +#define PRC_CLI_FILL_MAP_BUF(rpc_type, var_type, var, dir, buf, off) \ do \ { \ if (rpc_type == RPC_TYPE_BUF) \ @@ -315,8 +477,11 @@ RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(rpc_obj_handler_t_t, int) } \ } while (0) -/*服务端吧数据放到buf里面去*/ -#define RPC_SVR_MSG_TO_BUF_IN(rpc_type, var_type, var, dir, buf, off) \ +/** + * @brief 服务端吧数据放到buf里面去 + * + */ +#define RPC_SVR_MSG_TO_BUF_OUT(rpc_type, var_type, var, dir, buf, off) \ do \ { \ if (rpc_type == RPC_TYPE_DATA) \ @@ -333,8 +498,11 @@ RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(rpc_obj_handler_t_t, int) } \ } while (0) -/*服务端从buf里面取出数据*/ -#define RPC_SVR_BUF_TO_MSG_OUT(rpc_type, var_type, var, dir, buf, off, max) \ +/** + * @brief 服务端从buf里面取出数据 + * + */ +#define RPC_SVR_BUF_TO_MSG_IN(rpc_type, var_type, var, dir, buf, off, max) \ do \ { \ if (rpc_type == RPC_TYPE_DATA) \ @@ -350,13 +518,16 @@ RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(rpc_obj_handler_t_t, int) } \ } \ } while (0) - -#define PRC_SVR_FILL_MAP_BUF(rpc_type, var_type, var, dir, buf, off) \ +/** + * @brief 填充映射数据 + * + */ +#define PRC_SVR_FILL_MAP_BUF(rpc_type, var_type, var, dir, buf, off) \ do \ { \ if (rpc_type == RPC_TYPE_BUF) \ { \ - if (dir == RPC_DIR_OUT || dir == RPC_DIR_INOUT) \ + if (dir == RPC_DIR_OUT || dir == RPC_DIR_INOUT) \ { \ int ret = rpc_svr_msg_to_buf_##var_type(var, (uint8_t *)(buf), off); \ if (ret < 0) \ @@ -367,100 +538,157 @@ RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(rpc_obj_handler_t_t, int) } \ } \ } while (0) - -#define RPC_GENERATION_CALL1(struct_type, op, func_name, type0, dir0, rpc_type0, name0) \ - msg_tag_t struct_type##_##func_name##_call(obj_handler_t hd, type0 *var0) \ - { \ - void *buf; \ - ipc_msg_t *msg_ipc; \ - \ - thread_msg_buf_get(THREAD_MAIN, (umword_t *)(&buf), NULL); \ - msg_ipc = (ipc_msg_t *)buf; \ - \ - int off = 0; \ - int ret = -1; \ - int op_val = op; \ - /*拷贝op*/ \ - rpc_memcpy(msg_ipc->msg_buf, &op_val, sizeof(op_val)); \ - off += rpc_align(sizeof(op_val), __alignof(op)); \ - \ - RPC_CLI_MSG_TO_BUF_IN(rpc_type0, type0, var0, dir0, (uint8_t *)msg_ipc->msg_buf, off); \ - PRC_CLI_FILL_MAP_BUF(rpc_type0, type0, var0, dir0, (uint8_t *)msg_ipc->msg_buf, off); \ - msg_tag_t tag = ipc_call(hd, msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), 0, 0), \ - ipc_timeout_create2(0, 0)); \ - \ - if (msg_tag_get_val(tag) < 0) \ - { \ - return tag; \ - } /*拷贝返回的数据*/ \ - off = 0; \ - RPC_CLI_BUF_TO_MSG_OUT(rpc_type0, type0, var0, dir0, (uint8_t *)msg_ipc->msg_buf, off, tag.msg_buf_len *WORD_BYTES); \ - return tag; \ +/** + * @brief 该宏用于生成一个客户端的调用函数(传递一个参数) + * + */ +#define RPC_GENERATION_CALL1(struct_type, op, func_name, cli_type0, svr_type0, dir0, rpc_type0, name0) \ + msg_tag_t struct_type##_##func_name##_call(obj_handler_t hd, cli_type0 *var0) \ + { \ + void *buf; \ + ipc_msg_t *msg_ipc; \ + \ + thread_msg_buf_get(THREAD_MAIN, (umword_t *)(&buf), NULL); \ + msg_ipc = (ipc_msg_t *)buf; \ + \ + int off = 0; \ + int off_map = 0; \ + int ret = -1; \ + int op_val = op; \ + /*拷贝op*/ \ + rpc_memcpy(msg_ipc->msg_buf, &op_val, sizeof(op_val)); \ + off += rpc_align(sizeof(op_val), __alignof(op)); \ + \ + RPC_CLI_MSG_TO_BUF_IN(rpc_type0, cli_type0, var0, dir0, (uint8_t *)msg_ipc->msg_buf, off); \ + PRC_CLI_FILL_MAP_BUF(rpc_type0, cli_type0, var0, dir0, (uint8_t *)msg_ipc->map_buf, off_map); \ + /*msg_tag_t tag = dispatch_test(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_map, WORD_BYTES), 0), msg_ipc);*/ \ + msg_tag_t tag = ipc_call(hd, msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), 0, 0), \ + ipc_timeout_create2(0, 0)); \ + \ + if (msg_tag_get_val(tag) < 0) \ + { \ + return tag; \ + } /*拷贝返回的数据*/ \ + off = 0; \ + RPC_CLI_BUF_TO_MSG_OUT(rpc_type0, cli_type0, var0, dir0, (uint8_t *)msg_ipc->msg_buf, off, tag.msg_buf_len *WORD_BYTES); \ + return tag; \ } -#define RPC_GENERATION_DISPATCH1(struct_type, op, func_name, \ - type0, dir0, rpc_type0, name0) \ - msg_tag_t struct_type##_##func_name##_dispatch(struct_type *obj, msg_tag_t tag, ipc_msg_t *ipc_msg) \ - { \ - type0 var0; \ - size_t op_val; \ - uint8_t *value = (uint8_t *)(ipc_msg->msg_buf); \ - int off = 0; \ - \ - RPC_TYPE_INIT_FUNC_CALL(type0, &var0); \ - \ - /*取得op*/ \ - op_val = *((typeof(op) *)value); \ - off += sizeof(typeof(op)); \ - off = rpc_align(off, __alignof(typeof(op))); \ - \ - RPC_SVR_BUF_TO_MSG_OUT(rpc_type0, type0, &var0, dir0, value, off, tag.msg_buf_len *WORD_BYTES); \ - \ - short ret_val = struct_type##_##func_name##_op(obj, &var0); \ - \ - if (ret_val < 0) \ - { \ - return msg_tag_init4(0, 0, 0, ret_val); \ - } \ - off = 0; \ - RPC_SVR_MSG_TO_BUF_IN(rpc_type0, type0, &var0, dir0, value, off); \ - return msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), 0, ret_val); \ +/** + * @brief 该宏用于生成服务端的分发函数(一个参数) + * + */ +#define RPC_GENERATION_DISPATCH1(struct_type, op, func_name, \ + cli_type0, svr_type0, dir0, rpc_type0, name0) \ + msg_tag_t struct_type##_##func_name##_dispatch(struct_type *obj, msg_tag_t tag, ipc_msg_t *ipc_msg) \ + { \ + svr_type0 var0; \ + size_t op_val; \ + uint8_t *value = (uint8_t *)(ipc_msg->msg_buf); \ + int off = 0; \ + \ + RPC_TYPE_INIT_FUNC_CALL(svr_type0, &var0); \ + \ + /*取得op*/ \ + op_val = *((typeof(op) *)value); \ + off += sizeof(typeof(op)); \ + off = rpc_align(off, __alignof(typeof(op))); \ + \ + RPC_SVR_BUF_TO_MSG_IN(rpc_type0, svr_type0, &var0, dir0, value, off, tag.msg_buf_len *WORD_BYTES); \ + \ + short ret_val = struct_type##_##func_name##_op(obj, &var0); \ + \ + if (ret_val < 0) \ + { \ + return msg_tag_init4(0, 0, 0, ret_val); \ + } \ + off = 0; \ + int off_map = 0; \ + RPC_SVR_MSG_TO_BUF_OUT(rpc_type0, svr_type0, &var0, dir0, value, off); \ + PRC_SVR_FILL_MAP_BUF(rpc_type0, svr_type0, &var0, dir0, value, off_map); \ + return msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_map, WORD_BYTES), ret_val); \ + } +/** + * @brief 该宏用于生成一个服务端的实现(一个参数) + * + */ +#define RPC_GENERATION_OP1(struct_type, op, func_name, cli_type0, svr_type0, dir0, rpc_type0, name0) \ + short struct_type##_##func_name##_op(struct_type *obj, svr_type0 *name0) + +#define RPC_GENERATION_CALL2(struct_type, op, func_name, \ + cli_type0, svr_type0, dir0, rpc_type0, name0, \ + cli_type1, svr_type1, dir1, rpc_type1, name1) \ + msg_tag_t struct_type##_##func_name##_call(obj_handler_t hd, cli_type0 *var0, cli_type1 *var1) \ + { \ + void *buf; \ + ipc_msg_t *msg_ipc; \ + \ + thread_msg_buf_get(THREAD_MAIN, (umword_t *)(&buf), NULL); \ + msg_ipc = (ipc_msg_t *)buf; \ + \ + int off = 0; \ + int off_buf = 0; \ + int ret = -1; \ + int op_val = op; \ + /*拷贝op*/ \ + rpc_memcpy(msg_ipc->msg_buf, &op_val, sizeof(op_val)); \ + off += rpc_align(sizeof(op_val), __alignof(op)); \ + \ + RPC_CLI_MSG_TO_BUF_IN(rpc_type0, cli_type0, var0, dir0, (uint8_t *)msg_ipc->msg_buf, off); \ + PRC_CLI_FILL_MAP_BUF(rpc_type0, cli_type0, var0, dir0, (uint8_t *)msg_ipc->map_buf, off_buf); \ + RPC_CLI_MSG_TO_BUF_IN(rpc_type1, cli_type1, var1, dir1, (uint8_t *)msg_ipc->msg_buf, off); \ + PRC_CLI_FILL_MAP_BUF(rpc_type1, cli_type1, var1, dir1, (uint8_t *)msg_ipc->map_buf, off_buf); \ + /*msg_tag_t tag = dispatch_test(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), 0), msg_ipc); */ \ + msg_tag_t tag = ipc_call(hd, msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), 0, 0), \ + ipc_timeout_create2(0, 0)); \ + \ + if (msg_tag_get_val(tag) < 0) \ + { \ + return tag; \ + } /*拷贝返回的数据*/ \ + off = 0; \ + RPC_CLI_BUF_TO_MSG_OUT(rpc_type0, cli_type0, var0, dir0, (uint8_t *)msg_ipc->msg_buf, off, tag.msg_buf_len *WORD_BYTES); \ + RPC_CLI_BUF_TO_MSG_OUT(rpc_type1, cli_type1, var1, dir1, (uint8_t *)msg_ipc->msg_buf, off, tag.msg_buf_len *WORD_BYTES); \ + return tag; \ } -#define RPC_GENERATION_OP1(struct_type, op, func_name, type0, dir0, rpc_type0, name0) \ - short struct_type##_##func_name##_op(struct_type *obj, type0 *name0) - -#define RPC_GENERATION_CALL2(struct_type, op, func_name, \ - type0, dir0, rpc_type0, name0, \ - type1, dir1, rpc_type1, name1) \ - msg_tag_t struct_type##_##func_name##_call(obj_handler_t hd, type0 *var0, type1 *var1) \ - { \ - void *buf; \ - ipc_msg_t *msg_ipc; \ - \ - thread_msg_buf_get(THREAD_MAIN, (umword_t *)(&buf), NULL); \ - msg_ipc = (ipc_msg_t *)buf; \ - \ - int off = 0; \ - int off_buf = 0; \ - int ret = -1; \ - int op_val = op; \ - /*拷贝op*/ \ - rpc_memcpy(msg_ipc->msg_buf, &op_val, sizeof(op_val)); \ - off += rpc_align(sizeof(op_val), __alignof(op)); \ - \ - RPC_CLI_MSG_TO_BUF_IN(rpc_type0, type0, var0, dir0, (uint8_t *)msg_ipc->msg_buf, off); \ - PRC_CLI_FILL_MAP_BUF(rpc_type0, type0, var0, dir0, (uint8_t *)msg_ipc->msg_buf, off_buf); \ - RPC_CLI_MSG_TO_BUF_IN(rpc_type1, type1, var1, dir1, (uint8_t *)msg_ipc->msg_buf, off); \ - PRC_CLI_FILL_MAP_BUF(rpc_type1, type1, var1, dir1, (uint8_t *)msg_ipc->msg_buf, off_buf); \ - msg_tag_t tag = ipc_call(hd, msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), 0, 0), \ - ipc_timeout_create2(0, 0)); \ - \ - if (msg_tag_get_val(tag) < 0) \ - { \ - return tag; \ - } /*拷贝返回的数据*/ \ - off = 0; \ - RPC_CLI_BUF_TO_MSG_OUT(rpc_type0, type0, var0, dir0, (uint8_t *)msg_ipc->msg_buf, off, tag.msg_buf_len *WORD_BYTES); \ - RPC_CLI_BUF_TO_MSG_OUT(rpc_type1, type1, var1, dir1, (uint8_t *)msg_ipc->msg_buf, off, tag.msg_buf_len *WORD_BYTES); \ - return tag; \ +#define RPC_GENERATION_DISPATCH2(struct_type, op, func_name, \ + cli_type0, svr_type0, dir0, rpc_type0, name0, \ + cli_type1, svr_type1, dir1, rpc_type1, name1) \ + msg_tag_t struct_type##_##func_name##_dispatch(struct_type *obj, msg_tag_t tag, ipc_msg_t *ipc_msg) \ + { \ + svr_type0 var0; \ + svr_type1 var1; \ + size_t op_val; \ + uint8_t *value = (uint8_t *)(ipc_msg->msg_buf); \ + int off = 0; \ + \ + RPC_TYPE_INIT_FUNC_CALL(svr_type0, &var0); \ + RPC_TYPE_INIT_FUNC_CALL(svr_type1, &var1); \ + \ + /*取得op*/ \ + op_val = *((typeof(op) *)value); \ + off += sizeof(typeof(op)); \ + off = rpc_align(off, __alignof(typeof(op))); \ + \ + RPC_SVR_BUF_TO_MSG_IN(rpc_type0, svr_type0, &var0, dir0, value, off, tag.msg_buf_len *WORD_BYTES); \ + RPC_SVR_BUF_TO_MSG_IN(rpc_type1, svr_type1, &var1, dir1, value, off, tag.msg_buf_len *WORD_BYTES); \ + \ + short ret_val = struct_type##_##func_name##_op(obj, &var0, &var1); \ + \ + if (ret_val < 0) \ + { \ + return msg_tag_init4(0, 0, 0, ret_val); \ + } \ + off = 0; \ + int off_map = 0; \ + RPC_SVR_MSG_TO_BUF_OUT(rpc_type0, svr_type0, &var0, dir0, value, off); \ + RPC_SVR_MSG_TO_BUF_OUT(rpc_type1, svr_type1, &var1, dir1, value, off); \ + PRC_SVR_FILL_MAP_BUF(rpc_type0, svr_type0, &var0, dir0, ipc_msg->map_buf, off_map); \ + PRC_SVR_FILL_MAP_BUF(rpc_type1, svr_type1, &var1, dir1, ipc_msg->map_buf, off_map); \ + return msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_map, WORD_BYTES), ret_val); \ } + +#define RPC_GENERATION_OP2(struct_type, op, func_name, \ + cli_type0, svr_type0, dir0, rpc_type0, name0, \ + cli_type1, svr_type1, dir1, rpc_type1, name1) \ + short struct_type##_##func_name##_op(struct_type *obj, svr_type0 *name0, svr_type1 *name1) diff --git a/mkrtos_user/server/shell/src/rpc_test.c b/mkrtos_user/server/shell/src/rpc_test.c index e9a500fee..10e8f9b2e 100644 --- a/mkrtos_user/server/shell/src/rpc_test.c +++ b/mkrtos_user/server/shell/src/rpc_test.c @@ -9,140 +9,139 @@ typedef struct test_svr static test_svr_t test; -RPC_GENERATION_OP1(test_svr_t, 0, register, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, var0) +#if 0 +RPC_GENERATION_OP1(test_svr_t, 0, register, rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0) { printf("var0 val is %d\n", var0->data); + var0->data = 0x112233; return 1; } -// RPC_GENERATION_DISPATCH1(test_svr_t, 0, register, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, var0) -msg_tag_t test_svr_t_register_dispatch(test_svr_t *obj, msg_tag_t tag, ipc_msg_t *ipc_msg) +RPC_GENERATION_DISPATCH1(test_svr_t, 0, register, rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0) +RPC_GENERATION_CALL1(test_svr_t, 0, register, rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0) +#endif +#if 0 +RPC_GENERATION_OP2(test_svr_t, 0, query, + rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0, + rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var1) { - rpc_int_t var0; - size_t op_val; - uint8_t *value = (uint8_t *)(ipc_msg->msg_buf); - int off = 0; - rpc_var_rpc_int_t_init(&var0); - op_val = *((typeof(0) *)value); - off += sizeof(typeof(0)); - off = rpc_align(off, __alignof(typeof(0))); - do - { - if (1 == 1) - { - if (1 == 1 || 1 == 4) - { - int ret = rpc_svr_buf_to_msg_rpc_int_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); - short ret_val = test_svr_t_register_op(obj, &var0); - if (ret_val < 0) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret_val)}); - } - off = 0; - do - { - if (1 == 1) - { - if (1 == 2 || 1 == 4) - { - int ret = rpc_svr_msg_to_buf_rpc_int_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); - return ((msg_tag_t){.flags = (0), .msg_buf_len = ((((off) / ((sizeof(void *)))) + (((off) % ((sizeof(void *)))) ? 1 : 0))), .map_buf_len = (0), .prot = (ret_val)}); + printf("var0 val is %d\n", var0->data); + printf("var1 val is %d\n", var1->data); + var0->data = 0x112233; + var1->data = 0x123456; + return 2; } -// RPC_GENERATION_CALL1(test_svr_t, 0, register, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, var0) -msg_tag_t test_svr_t_register_call(obj_handler_t hd, rpc_int_t *var0) + +RPC_GENERATION_DISPATCH2(test_svr_t, 0, query, + rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0, + rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var1) +RPC_GENERATION_CALL2(test_svr_t, 0, query, + rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0, + rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var1) + +msg_tag_t dispatch_test(msg_tag_t tag, ipc_msg_t *msg) { - void *buf; - ipc_msg_t *msg_ipc; - thread_msg_buf_get(2, (umword_t *)(&buf), ((void *)0)); - msg_ipc = (ipc_msg_t *)buf; - int off = 0; - int ret = -1; - int op_val = 0; - rpc_memcpy(msg_ipc->msg_buf, &op_val, sizeof(op_val)); - off += rpc_align(sizeof(op_val), __alignof(0)); - do - { - if (1 == 1) - { - if (1 == 1 || 1 == 4) - { - int ret = rpc_cli_msg_to_buf_rpc_int_t(var0, (uint8_t *)((uint8_t *)msg_ipc->msg_buf), 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 == 1 || 1 == 4) - { - int ret = rpc_cli_msg_to_buf_rpc_int_t(var0, (uint8_t *)((uint8_t *)msg_ipc->msg_buf), off); - if (ret < 0) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)}); - } - off = ret; - } - } - } while (0); - // msg_tag_t tag = ipc_call(hd, ((msg_tag_t){.flags = (0), .msg_buf_len = ((((off) / ((sizeof(void *)))) + (((off) % ((sizeof(void *)))) ? 1 : 0))), .map_buf_len = (0), .prot = (0)}), ipc_timeout_create2(0, 0)); - msg_tag_t tag = test_svr_t_register_dispatch(&test, ((msg_tag_t){.flags = (0), .msg_buf_len = ((((off) / ((sizeof(void *)))) + (((off) % ((sizeof(void *)))) ? 1 : 0))), .map_buf_len = (0), .prot = (0)}), msg_ipc); - - if (((int16_t)((tag).prot)) < 0) - { - return tag; - } - off = 0; - do - { - if (1 == 1) - { - if (1 == 2 || 1 == 4) - { - int ret = rpc_cli_buf_to_msg_rpc_int_t(var0, (uint8_t *)((uint8_t *)msg_ipc->msg_buf), 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); - return tag; + tag = test_svr_t_query_dispatch(&test, tag, msg); } -// msg_tag_t tag = test_svr_t_register_dispatch(&test, ((msg_tag_t){.flags = (0), .msg_buf_len = ((((off) / ((sizeof(void *)))) + (((off) % ((sizeof(void *)))) ? 1 : 0))), .map_buf_len = (0), .prot = (0)}), msg_ipc); +#endif -// RPC_GENERATION_CALL2(test_svr_t, 1, query, -// rpc_ref_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, var0, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, var1) +#if 0 +RPC_GENERATION_OP2(test_svr_t, 0, query, + rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0, + rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var1) +{ + printf("var0 val is %s\n", var0->data); + printf("var1 val is %s\n", var1->data); + strcpy(var0->data, "...."); + var0->len = 5; + strcpy(var1->data, "____"); + var1->len = 5; + return 2; +} +RPC_GENERATION_DISPATCH2(test_svr_t, 0, query, + rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0, + rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var1) + +RPC_GENERATION_CALL2(test_svr_t, 0, query, + rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0, + rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var1) + +msg_tag_t dispatch_test(msg_tag_t tag, ipc_msg_t *msg) +{ + tag = test_svr_t_query_dispatch(&test, tag, msg); +} +#endif +#if 0 +RPC_GENERATION_OP2(test_svr_t, 0, query, + rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0, + rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1) +{ + printf("var0 val is %s\n", var0->data); + strcpy(var0->data, "...."); + var0->len = 5; + return 2; +} + +RPC_GENERATION_DISPATCH2(test_svr_t, 0, query, + rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0, + rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1) + +RPC_GENERATION_CALL2(test_svr_t, 0, query, + rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0, + rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1) + +msg_tag_t dispatch_test(msg_tag_t tag, ipc_msg_t *msg) +{ + tag = test_svr_t_query_dispatch(&test, tag, msg); +} +#endif +RPC_GENERATION_OP2(test_svr_t, 0, query, + rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_OUT, RPC_TYPE_BUF, var0, + rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1) +{ + printf("dispath ok.\n"); + var0->data = vpage_create_raw3(0, 0, 30).raw; + return 2; +} + +RPC_GENERATION_DISPATCH2(test_svr_t, 0, query, + rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_OUT, RPC_TYPE_BUF, var0, + rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1) +RPC_GENERATION_CALL2(test_svr_t, 0, query, + rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_OUT, RPC_TYPE_BUF, var0, + rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1) + +msg_tag_t dispatch_test(msg_tag_t tag, ipc_msg_t *msg) +{ + tag = test_svr_t_query_dispatch(&test, tag, msg); +} void rpc_test(void) { - rpc_int_t var0 = {.data = 1}; - msg_tag_t tag = test_svr_t_register_call(15, &var0); - - rpc_ref_array_uint32_t_uint8_t_32_t str_tst = { - .data = "test", - .len = strlen("test") + 1}; - - // test_svr_t_query_call(15, &str_tst, &var0); + msg_tag_t tag; +#if 0 + rpc_int_t var0 = {.data = 456}; + tag = test_svr_t_register_call(15, &var0); + printf("ret:%d, val is 0x%x\n", msg_tag_get_val(tag), var0.data); +#endif +#if 0 + rpc_int_t var1 = {.data = 123}; + tag = test_svr_t_query_call(15, &var0, &var1); + printf("ret:%d, val is 0x%x, val is 0x%x\n", msg_tag_get_val(tag), var0.data, var1.data); +#endif +#if 0 + uint8_t data_cache[10] = "test"; + uint8_t data_cache1[10] = "tttt"; + rpc_ref_array_uint32_t_uint8_t_32_t var0 = { + .data = data_cache, + .len = strlen(data_cache) + 1}; + rpc_ref_array_uint32_t_uint8_t_32_t var1 = { + .data = data_cache1, + .len = strlen(data_cache1) + 1}; + tag = test_svr_t_query_call(15, &var0, &var1); + printf("ret:%d, val is %s, val is %s.\n", msg_tag_get_val(tag), var0.data, var1.data); +#endif + rpc_obj_handler_t_t var0 = {.data = 0}; + rpc_obj_handler_t_t var1 = {.data = 12}; + tag = test_svr_t_query_call(15, &var0, &var1); + printf("ret:%d\n", msg_tag_get_val(tag)); } \ No newline at end of file