From 45aa9278fe14e4537e458d6ebb6f0bba5286b88c Mon Sep 17 00:00:00 2001 From: chenyf <1343619937@qq.com> Date: Thu, 21 Nov 2024 21:22:33 +0800 Subject: [PATCH] =?UTF-8?q?fix(add):=20=E6=96=B0=E5=A2=9Eresp=E5=8A=9F?= =?UTF-8?q?=E8=83=BD,=E5=B9=B6=E5=A2=9E=E5=8A=A0=E6=9E=B6=E6=9E=84?= =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .$架构.drawio.bkp | 16 ++ .vscode/launch.json | 25 ++++ .vscode/settings.json | 3 +- .vscode/tasks.json | 23 +++ build/crc16.o | Bin 0 -> 4996 bytes build/erpc_core.o | Bin 0 -> 19687 bytes build/list.o | Bin 0 -> 4621 bytes build/port_self.o | Bin 0 -> 36697 bytes config.h | 3 + crc16.c | 14 +- crc16.o | Bin 2198 -> 0 bytes erpc_core.c | 340 +++++++++++++++++++++++++++--------------- erpc_core.h | 5 +- erpc_core.o | Bin 8141 -> 0 bytes erpc设计文档.md | 38 +++++ list.c | 5 +- list.o | Bin 1700 -> 0 bytes makefile | 8 +- picture/1.jpg | Bin 0 -> 9871 bytes picture/2.jpg | Bin 0 -> 18609 bytes picture/3.jpg | Bin 0 -> 11598 bytes port_self.c | 77 +++++++--- port_self.exe | Bin 72754 -> 111340 bytes port_self.o | Bin 10658 -> 0 bytes 架构.drawio | 45 ++++++ 25 files changed, 445 insertions(+), 157 deletions(-) create mode 100644 .$架构.drawio.bkp create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json create mode 100644 build/crc16.o create mode 100644 build/erpc_core.o create mode 100644 build/list.o create mode 100644 build/port_self.o delete mode 100644 crc16.o delete mode 100644 erpc_core.o delete mode 100644 list.o create mode 100644 picture/1.jpg create mode 100644 picture/2.jpg create mode 100644 picture/3.jpg delete mode 100644 port_self.o create mode 100644 架构.drawio diff --git a/.$架构.drawio.bkp b/.$架构.drawio.bkp new file mode 100644 index 0000000..faa5e5c --- /dev/null +++ b/.$架构.drawio.bkp @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..30290b0 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,25 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "(gdb) Launch", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/port_self.exe", //只改这里 + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": true, + "MIMode": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ], + // "preLaunchTask": "build_111" //可以新增一条 + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index db529d0..dfd61ea 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -28,5 +28,6 @@ "binaryPath": "d:\\WORK\\erpc\\port_self.exe", "binaryArgs": [] } - ] + ], + "cmake.ignoreCMakeListsMissing": true } \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..e5f231a --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,23 @@ +{ + "tasks": [ + { + "type": "cppbuild", + "label": "build_111", + "command": "make", + "args": [ + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "调试器生成的任务。" + } + ], + "version": "2.0.0" +} \ No newline at end of file diff --git a/build/crc16.o b/build/crc16.o new file mode 100644 index 0000000000000000000000000000000000000000..6e7fb7a399090d529e20d3dc31a6a4b7e692abd5 GIT binary patch literal 4996 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 Hl+XVM?KBoA literal 0 HcmV?d00001 diff --git a/build/list.o b/build/list.o new file mode 100644 index 0000000000000000000000000000000000000000..f195381c37955e6ae780ee9d095ee57cb6df7075 GIT binary patch literal 4621 zcmbVPU2Ggz6+U-o?(R72U9W#g>?DmQ!AV_+*X!7EoHQYu#7WkQTCA!jLJHc-qUjKTqiQqX=UIy_B z^1=!Gmmix9BLEx&bdmQ5&)yzX=OJ@(YH<62gRQom>$>A7Nis2{h zO`a5WKRbf<-bUVx$HS`Rojm1JKCu+`rluqMJl6h}j6i4)<2`jc0=|#6;ckG(J-;&E z{Kfgg#)pOVk8_2M$1=a5!TX4s6*ewED6D_=0kjiuQ2pM4!fixu&u0o786m!t*94K^ z_21^c^qa7u!p8g{vIYwqZ+-OQ*47r9+eCAlfw>D<%LKIvnAFaD>+dNlpIOYkg7*4r*&Tf<&wxN$M>Z2{Ua;`i+4&61Y zWJQ4Ez8q8mJoA zZlM(S8pSk)stFb^R}BXeTB6pl7j==f?UuD@n-$%%UDWW7hJg4owLrg0Y4D$9B9>@X z8;+|-o2gv1R%L6Fx%LyJbL|6>CoqzPn%LGz_96;0EvS2aRV$5lsb*q(b)nWUu#*{8 zbkf7MV$rHMi^XESR4lihV%=B)wUs%BF1z+)_EY@!{0zH+BU5axwu+|X(71s5>amwm zCqWxgP+uFSo+f>ZhO<}(b%+ULVRQ-9hgg3Mk3X(yA}3D)V;LJF*b z?Ip`;*q}Zv&G=211I2OK*jF?c>rEGXc!KqjLmyuD@l)(m zUaXik(=~z3#A!QGT9*Z|m%f2N##GfbDyZI1mDmfA63d&-9HZqOdqGRvjS4oul9Kvr zy6Kopz^;1rn>Y_IBhz=*a-GI1u&Fq0WJ)u#KyUx*c$+%ldGoAK`__ACHYw>M2S|(k z#UAaI4Q~3LnhvdXHWH^pgwhpRpr1UR3tm(sLs37U@%=zXY*3@wG;NH&w~KiG+0+h9 z{iN7911ZLi692-H#@5JCl&30*30@5nSD58{Y=r4$ur4Elc$rc9}lP$D4ML!_D|!V zThV9#=12I-`$x(Kj0{Yh|=$R!8wH$Q{=&wym10msa)1Ec@#9(d$!_dedp#GRy8G z@}~?ifPvvnZHob0(Yq7c4{3Zc4a*|P{XKXgop~;HDHV^+{0`Y2p0D@!XuxYmdE1YL zfOjFv+kQ;>yr(5C=->9k)91yWlEglYK*vvo4=|^i3V+A^u#mDC?GYip5=dATt5Xs8 z7+R-_sM7^n5%(gA(WO~RG=@@3HzkQ33?x0!(wIu^NFdRUkZtKUCAIWqk<0<0Ne-wCkq2iThdb~nJX3l`pMWctq*z#{AHT@Mz;4X?sLhZxS>ZmEhO ztxCZW1Q&B!e;wp$tkFvAAm2oU)|5oTuVr$hFgmF?N}UvbDbrb@5OG@yzmjoUcISj% z$T%g)IlIjYK=^e`y^tJw6L(TJ^fIOyRTx>@nP?^`;fanMdKX7;@}zr(GEB4r6h?32 zo#}NC>cUcCw2FfhGa$d^N#sFc^cLP}>W?0$TX4>MwP^94SEbjT!rsR`+GlxqdnCZM z0pdPF8$~2S797)GVu%s)A(q*SS!yp9EqkHi%SNe0S1M0qIEKAww)|?%vQ1ycyA{Y$ vA6{Eq^U(#zsGH)CQ}k{W;&$O(ZGyw!NogMiv18@vi literal 0 HcmV?d00001 diff --git a/build/port_self.o b/build/port_self.o new file mode 100644 index 0000000000000000000000000000000000000000..37fbaefc0c051489c72ca5ac043fc7933793bd5b GIT binary patch literal 36697 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 HsBZraK<^+D literal 0 HcmV?d00001 diff --git a/config.h b/config.h index b39ffb5..9850bae 100644 --- a/config.h +++ b/config.h @@ -8,4 +8,7 @@ #define u16 unsigned short #define u32 unsigned int +#define UNUSED(x) (void)(x) +#define ERPC_DEBUG(...) printf(__VA_ARGS__) +// #define ERPC_DEBUG(...) #endif /* _CONFIG_H_ */ \ No newline at end of file diff --git a/crc16.c b/crc16.c index 190d082..fd32d26 100644 --- a/crc16.c +++ b/crc16.c @@ -31,13 +31,13 @@ static const uint16_t crc16tab[256] = { 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0}; -uint16_t crc16(const unsigned char *buf, size_t len) { - int counter; - uint16_t crc = 0; - for (counter = 0; counter < len; counter++) - crc = (crc << 8) ^ crc16tab[((crc >> 8) ^ *buf++) & 0x00FF]; - return crc; -} +// uint16_t crc16(const unsigned char *buf, size_t len) { +// int counter; +// uint16_t crc = 0; +// for (counter = 0; counter < (int)len; counter++) +// crc = (crc << 8) ^ crc16tab[((crc >> 8) ^ *buf++) & 0x00FF]; +// return crc; +// } u16 cmd_cal_crc16(erpc_cmd_def_t *cmd) { u16 crc = 0; diff --git a/crc16.o b/crc16.o deleted file mode 100644 index 6f0997b2e66ed2a17d888bc37106f619207130a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2198 zcmYdkV`l(?Cu|H1qF@#agI-B$MG2S}Fz7HcFt`BKfB;B`0z*K8UP@v~B3J}B z;lL1ZKrgAd7`FU3a8aL}tjRi^?}vWFF2oq>a10j9bKKy_VE ze{ce|I4~GE=$oMHWnf@|s)5M>{oxSm(fQP)`Hg@_r!NqPN~9fk{l&m=-1QGg(Q6O> z?XJHLKHzZdJOE;)9elyTzx{+qx2u3hZvZ1uy#W6<2L5da3{L%)kU<{JM+9OIBijwM_aDgKA0T^yO8xr!)@~Wll zkD_I;poh4rBY+1a0ORn2I4F^508T*Nz5*}Q{{8@VEPL^n{-W;`f@8vm%|9`&sI7!9XM1h4-Qj;_NwKQ(=FQXfB*M)!VNeRKBgU9Gj;doy}H=T5KN zmUlJoi=VKakzSx&0pI-p``+KZ|L45)eyjD7^DFv0Ca!Eewej^ro{PE%{XXVDY!Fz; zaLC}X0!x6ZgIhs*!p`OylYcM1wb}Nt%;oyWai2FbO%VF5bjirnNhGK|DXi$#*3(N@ zOzmvV`|AHx=PK{fM<$0=7Kk*mq?Nd*sD!Y(++O}``^@$o)8n7leV09MbN#Z~C$ouc z8^prX%F0CDOu~F_=APvHssHlC%$J>AJ6ErCiAeQet5DB4An}l+$zria?dh1?_OIoB z|Lndod-v*DyGy-7qRg|zsy=dEklL&@$x81p|J$6qzGqkM?Oyw0?#W)Y8upx&7+0S~ zHqAN@WDfGkzqk7zd%ouW?Df0$-|YV}Up&vOF4V6iZnEAcyNi4uB~Y z7%uo}r!r149VV3|=5+VK@k9fyzXP zm^m=rLRfil)(SZ58=M8y0Ipe>f#$$i96%O75Ho|_461jS83f?6B5+xdFCelqaFzmG zRxd3xCl$y8fq(xQ7}6P&i;@k^^pYV$U=l1+l9&YIfb3^x0E>X-fT7Evz`z7_DK-Fd zA1GwOYQPF)fg~uLAtK1NDaZ(BMo_pzYF)5$Ac0(y0wsZJU@{0AxfTUgidfYk)u3Qs zFfxFQLjlOOC#d>iW(3urr~tX<1XY9(HK6(u73e~_;IL=3N0kKfEPxnNtE*I1RWT&z Xro<;F=EOsS7R<{?P0oh$krV;|qGV^` diff --git a/erpc_core.c b/erpc_core.c index 12e6915..93145f1 100644 --- a/erpc_core.c +++ b/erpc_core.c @@ -9,11 +9,14 @@ erpc_sleep erpc_sleep_tick = NULL; static list_t erpc_hw; -void clean_cache(erpc_hw_cfg_t *hw) { - for (int i = 0; i < MAX_REC_CMD_CACHE_NUM; i++) { +void clean_cache(erpc_hw_cfg_t *hw) +{ + for (int i = 0; i < MAX_REC_CMD_CACHE_NUM; i++) + { hw->rec_cache->state = ERPC_CMD_NO_ERROR; } - for (int i = 0; i < MAX_SEND_CMD_CACHE_NUM; i++) { + for (int i = 0; i < MAX_SEND_CMD_CACHE_NUM; i++) + { hw->send_cache[i].state = ERPC_CMD_NO_ERROR; } } @@ -21,29 +24,35 @@ void clean_cache(erpc_hw_cfg_t *hw) { * 注册 hardware 设备 * 线程不安全 */ -u32 erpc_hw_add(erpc_hw_cfg_t *hw) { +u32 erpc_hw_add(erpc_hw_cfg_t *hw) +{ list_t *list = &erpc_hw; - if (list->data == NULL) { + if (list->data == NULL) + { list->data = (void *)hw; clean_cache(hw); return ERPC_NO_ERROR; } list_t *list_node = malloc(sizeof(list_t)); - if (list_node == NULL) { + if (list_node == NULL) + { return ERPC_ERR_MALLOC_ERROR; } list_node->data = (void *)hw; u8 hw_ord = hw->ord; // 检查hw是否已经存在 - while (list != NULL) { + while (list != NULL) + { erpc_hw_cfg_t *hw_cfg = (erpc_hw_cfg_t *)list->data; - if (hw_cfg->ord == hw_ord) { + if (hw_cfg->ord == hw_ord) + { return ERPC_ERR_HW_EXIST; } list = list->next; } list_t *result = list_append(&erpc_hw, hw); - if (result == NULL) { + if (result == NULL) + { return ERPC_ERR_MALLOC_ERROR; } clean_cache(hw); @@ -53,14 +62,17 @@ u32 erpc_hw_add(erpc_hw_cfg_t *hw) { * 注册命令列表 * 线程不安全 */ -u32 erpc_add_cmd_list(erpc_hw_cfg_t *hw, erpc_cmd_list_t *cmd_list) { +u32 erpc_add_cmd_list(erpc_hw_cfg_t *hw, erpc_cmd_list_t *cmd_list) +{ list_t *list = &hw->cmd_list; - if (list->data == NULL) { + if (list->data == NULL) + { list->data = (void *)cmd_list; return ERPC_NO_ERROR; } list = list_append(&hw->cmd_list, cmd_list); - if (list == NULL) { + if (list == NULL) + { return ERPC_ERR_MALLOC_ERROR; } return ERPC_NO_ERROR; @@ -69,14 +81,18 @@ u32 erpc_add_cmd_list(erpc_hw_cfg_t *hw, erpc_cmd_list_t *cmd_list) { * 移除 hardware 设备 * 线程不安全 */ -u32 erpc_hw_remove(u8 hw) { +u32 erpc_hw_remove(u8 hw) +{ list_t *list = &erpc_hw; - if (list->data == NULL) { + if (list->data == NULL) + { return ERPC_ERR_NOFOND_HW; } - while (list != NULL) { + while (list != NULL) + { erpc_hw_cfg_t *hw_cfg = (erpc_hw_cfg_t *)list->data; - if (hw_cfg->ord == hw) { + if (hw_cfg->ord == hw) + { list_delete(&erpc_hw, list); free(list); return ERPC_NO_ERROR; @@ -88,27 +104,34 @@ u32 erpc_hw_remove(u8 hw) { /** * 获取 hardware 设备 */ -erpc_hw_cfg_t *erpc_hw_get(u8 hw) { +erpc_hw_cfg_t *erpc_hw_get(u8 hw) +{ list_t *list = &erpc_hw; - if (list->data == NULL) { + if (list->data == NULL) + { return NULL; } - while (list != NULL) { + while (list != NULL) + { erpc_hw_cfg_t *hw_cfg = (erpc_hw_cfg_t *)list->data; - if (hw_cfg->ord == hw) { + if (hw_cfg->ord == hw) + { return hw_cfg; } } return NULL; } u32 erpc_send_base(erpc_hw_cfg_t *hw_cfg, u8 dest_id, u16 port, u8 package_type, - u8 *data, u16 len) { + u8 *data, u16 len) +{ CHECK_IF_ERROR(hw_cfg == NULL, ERPC_ERR_NOFOND_HW); u8 cache_ord = 255; // 查找可用的发送缓存 - for (int i = 0; i < MAX_SEND_CMD_CACHE_NUM; i++) { - if (hw_cfg->send_cache[i].state == ERPC_CMD_NO_ERROR) { - printf("find send cache %d\n", i); + for (int i = 0; i < MAX_SEND_CMD_CACHE_NUM; i++) + { + if (hw_cfg->send_cache[i].state == ERPC_CMD_NO_ERROR) + { + ERPC_DEBUG("find send cache %d\n", i); cache_ord = i; break; } @@ -122,13 +145,19 @@ u32 erpc_send_base(erpc_hw_cfg_t *hw_cfg, u8 dest_id, u16 port, u8 package_type, cmd->head.dest_id = dest_id; cmd->head.port = port; cmd->head.msg_len = len; - if (data != NULL) { + if (data == NULL) + { cmd->head.msg_len = 0; + len = 0; } cmd->head.type = package_type; cmd->head.src_id = hw_cfg->local_id; - if (len > 0 && data != NULL) { - memcpy(cmd->data, data, len); + if (len > 0 && data != NULL) + { + for (int i = 0; i < len; i++) + { + cmd->data[i] = data[i]; + } } // 计算校验和 cmd_cal_crc16(cmd); @@ -137,29 +166,37 @@ u32 erpc_send_base(erpc_hw_cfg_t *hw_cfg, u8 dest_id, u16 port, u8 package_type, hw_cfg->send_cache[cache_ord].state = ERPC_CMD_WAIT_SEND; // 等待数据发送完成 int wait_time = CMD_TIMEOUT; - while (wait_time > 0) { - if (hw_cfg->send_cache[cache_ord].state == ERPC_CMD_SEND_OK) { + while (wait_time > 0) + { + if (hw_cfg->send_cache[cache_ord].state == ERPC_CMD_SEND_OK) + { break; } - if (hw_cfg->send_cache[cache_ord].state == ERPC_CMD_DEST_BUSY) { + if (hw_cfg->send_cache[cache_ord].state == ERPC_CMD_DEST_BUSY) + { return ERPC_ERR_DEST_BUSY; } - if (erpc_sleep_tick != NULL) { + if (erpc_sleep_tick != NULL) + { erpc_sleep_tick(1); } wait_time--; } u32 ret = ERPC_NO_ERROR; - do { - if (wait_time == 0) { + do + { + if (wait_time == 0) + { ret = ERPC_ERR_SEND_TIMEOUT; break; } - if (hw_cfg->send_cache[cache_ord].state == ERPC_CMD_SEND_ONCE) { + if (hw_cfg->send_cache[cache_ord].state == ERPC_CMD_SEND_ONCE) + { ret = ERPC_ERR_DEST_NO_RESPONSE; break; } - if (hw_cfg->send_cache[cache_ord].state == ERPC_CMD_SEND_REPEAT) { + if (hw_cfg->send_cache[cache_ord].state == ERPC_CMD_SEND_REPEAT) + { ret = ERPC_ERR_DEST_NO_RESPONSE; break; } @@ -167,7 +204,8 @@ u32 erpc_send_base(erpc_hw_cfg_t *hw_cfg, u8 dest_id, u16 port, u8 package_type, hw_cfg->send_cache[cache_ord].state = ERPC_CMD_NO_ERROR; return ret; } -u32 erpc_send(u8 hw, u8 dest_id, u16 port, u8 *data, u16 len) { +u32 erpc_send(u8 hw, u8 dest_id, u16 port, u8 *data, u16 len) +{ erpc_hw_cfg_t *hw_cfg = erpc_hw_get(hw); u32 ret = erpc_send_base(hw_cfg, dest_id, port, PACKAGE_TYPE_CMD_REQ, data, len); @@ -175,30 +213,42 @@ u32 erpc_send(u8 hw, u8 dest_id, u16 port, u8 *data, u16 len) { } u32 erpc_wait_resp_package(u8 hw, u8 dest_id, u16 port, u8 *reply_data, - u16 *reply_len, u32 time_out) { + u16 *reply_len, u32 time_out) +{ erpc_hw_cfg_t *hw_cfg = erpc_hw_get(hw); CHECK_IF_ERROR(hw_cfg == NULL, ERPC_ERR_NOFOND_HW); - while (time_out > 0) { - for (int i = 0; i < MAX_REC_CMD_CACHE_NUM; i++) { + while (time_out > 0) + { + for (int i = 0; i < MAX_REC_CMD_CACHE_NUM; i++) + { erpc_data_cache_t *rec_cahce = &hw_cfg->rec_cache[i]; - if (rec_cahce->state != ERPC_CMD_RESP_OK) { + if (rec_cahce->state != ERPC_CMD_RESP_OK) + { continue; } erpc_cmd_def_t *cmd = (erpc_cmd_def_t *)&rec_cahce->data[0]; - if (cmd->head.port != port) { + if (cmd->head.port != port) + { continue; } - if (cmd->head.src_id != dest_id) { + if (cmd->head.src_id != dest_id) + { continue; } - if (reply_data != NULL) { - memccpy(reply_data, cmd->data, 0, cmd->head.msg_len); - *reply_len = cmd->head.msg_len; + if (reply_data != NULL) + { + // memccpy(reply_data, cmd->data, 0, cmd->head.msg_len); + memcpy(reply_data, cmd->data, cmd->head.msg_len); + if (reply_len != NULL) + { + *reply_len = cmd->head.msg_len; + } } rec_cahce->state = ERPC_CMD_NO_ERROR; return ERPC_NO_ERROR; } - if (erpc_sleep_tick != NULL) { + if (erpc_sleep_tick != NULL) + { erpc_sleep_tick(1); } time_out--; @@ -207,29 +257,34 @@ u32 erpc_wait_resp_package(u8 hw, u8 dest_id, u16 port, u8 *reply_data, return ERPC_NO_ERROR; } u32 erpc_send_wait_reply(u8 hw, u8 dest_id, u16 port, u8 *data, u16 len, - u8 *reply_data, u16 *reply_len, u32 timeout) { + u8 *reply_data, u16 *reply_len, u32 timeout) +{ u32 ret = erpc_send(hw, dest_id, port, data, len); - if (reply_len != NULL) { + if (reply_len != NULL) + { *reply_len = 0; } CHECK_IF_ERROR(ret != ERPC_NO_ERROR, ret); - printf("send ok\n"); ret = erpc_wait_resp_package(hw, dest_id, port, reply_data, reply_len, timeout); CHECK_IF_ERROR(ret != ERPC_NO_ERROR, ret); return ERPC_NO_ERROR; } -u32 erpc_replay(u8 hw, u8 dest_id, u16 port, u8 *data_out, u16 len) { +u32 erpc_replay(u8 hw, u8 dest_id, u16 port, u8 *data_out, u16 len) +{ erpc_hw_cfg_t *hw_cfg = erpc_hw_get(hw); - u32 ret = erpc_send_base(hw_cfg, dest_id, port, PACKAGE_TYPE_CMD_REPEAT, + u32 ret = erpc_send_base(hw_cfg, dest_id, port, PACKAGE_TYPE_CMD_RESP, data_out, len); return ret; } -u32 erpc_send_data(erpc_hw_cfg_t *hw) { - for (int i = 0; i < MAX_SEND_CMD_CACHE_NUM; i++) { - if (hw->send_cache[i].state == ERPC_CMD_WAIT_SEND) { +u32 erpc_send_data(erpc_hw_cfg_t *hw) +{ + for (int i = 0; i < MAX_SEND_CMD_CACHE_NUM; i++) + { + if (hw->send_cache[i].state == ERPC_CMD_WAIT_SEND) + { erpc_cmd_def_t *cmd = (erpc_cmd_def_t *)&hw->send_cache[i].data[0]; u32 len = sizeof(erpc_cmd_head_t) + 2 + cmd->head.msg_len; hw->send_lock(); @@ -242,12 +297,16 @@ u32 erpc_send_data(erpc_hw_cfg_t *hw) { return ERPC_NO_ERROR; } -u32 erpc_rev_ack_package(erpc_hw_cfg_t *hw, erpc_cmd_def_t *cmd_rev) { - for (int i = 0; i < MAX_SEND_CMD_CACHE_NUM; i++) { +u32 erpc_rev_ack_package(erpc_hw_cfg_t *hw, erpc_cmd_def_t *cmd_rev) +{ + for (int i = 0; i < MAX_SEND_CMD_CACHE_NUM; i++) + { if (hw->send_cache[i].state == ERPC_CMD_SEND_ONCE || - hw->send_cache[i].state == ERPC_CMD_SEND_REPEAT) { + hw->send_cache[i].state == ERPC_CMD_SEND_REPEAT) + { erpc_cmd_def_t *cmd_send = (erpc_cmd_def_t *)&hw->send_cache[i].data[0]; - if (cmd_rev->head.port == cmd_send->head.port) { + if (cmd_rev->head.port == cmd_send->head.port) + { hw->send_cache[i].state = ERPC_CMD_SEND_OK; return ERPC_NO_ERROR; } @@ -255,7 +314,8 @@ u32 erpc_rev_ack_package(erpc_hw_cfg_t *hw, erpc_cmd_def_t *cmd_rev) { } return ERPC_NO_ERROR; } -u32 erpc_rev_resp_package(erpc_hw_cfg_t *hw, erpc_cmd_def_t *cmd_rev) { +u32 erpc_rev_resp_package(erpc_hw_cfg_t *hw, erpc_cmd_def_t *cmd_rev) +{ erpc_cmd_def_t cmd_send; cmd_send.head.dest_id = cmd_rev->head.src_id; cmd_send.head.port = cmd_rev->head.port; @@ -271,25 +331,30 @@ u32 erpc_rev_resp_package(erpc_hw_cfg_t *hw, erpc_cmd_def_t *cmd_rev) { return ERPC_NO_ERROR; } // 重发数据包 -u32 erpc_rev_repeat_package(erpc_hw_cfg_t *hw, erpc_cmd_def_t *cmd_rev) { - for (int i = 0; i < MAX_SEND_CMD_CACHE_NUM; i++) { +u32 erpc_rev_repeat_package(erpc_hw_cfg_t *hw, erpc_cmd_def_t *cmd_rev) +{ + for (int i = 0; i < MAX_SEND_CMD_CACHE_NUM; i++) + { if (hw->send_cache[i].state == ERPC_CMD_SEND_ONCE || - hw->send_cache[i].state == ERPC_CMD_SEND_REPEAT) { + hw->send_cache[i].state == ERPC_CMD_SEND_REPEAT) + { erpc_cmd_def_t *cmd_send = (erpc_cmd_def_t *)&hw->send_cache[i].data[0]; - if (cmd_rev->head.port == cmd_send->head.port) { + if (cmd_rev->head.port == cmd_send->head.port) + { u32 len = sizeof(erpc_cmd_head_t) + 2 + cmd_send->head.msg_len; hw->send_lock(); u32 ret = hw->write((u8 *)hw->send_cache[i].data, len); hw->send_unlock(); hw->send_cache[i].state = ERPC_CMD_SEND_REPEAT; - CHECK_IF_ERROR(ret, ERPC_ERR_HW_SEND_FAIL); // + CHECK_IF_ERROR(ret, ERPC_ERR_HW_SEND_FAIL); // return ERPC_NO_ERROR; } } } return ERPC_NO_ERROR; } -u32 erpc_send_ack_package(erpc_hw_cfg_t *hw, erpc_cmd_def_t *cmd_rev) { +u32 erpc_send_ack_package(erpc_hw_cfg_t *hw, erpc_cmd_def_t *cmd_rev) +{ erpc_cmd_def_t cmd_send; cmd_send.head.dest_id = cmd_rev->head.src_id; cmd_send.head.port = cmd_rev->head.port; @@ -305,69 +370,87 @@ u32 erpc_send_ack_package(erpc_hw_cfg_t *hw, erpc_cmd_def_t *cmd_rev) { return ERPC_NO_ERROR; } -u32 erpc_rev_package(erpc_hw_cfg_t *hw) { - for (int i = 0; i < MAX_REC_CMD_CACHE_NUM; i++) { - if (hw->rec_cache[i].state == ERPC_CMD_WAIT_SERVER_DEAL) { +u32 erpc_rev_package(erpc_hw_cfg_t *hw) +{ + for (int i = 0; i < MAX_REC_CMD_CACHE_NUM; i++) + { + if (hw->rec_cache[i].state == ERPC_CMD_WAIT_SERVER_DEAL) + { + ERPC_DEBUG("find cmd wait server deal %d\n", i); erpc_cmd_def_t *cmd = (erpc_cmd_def_t *)&hw->rec_cache[i].data[0]; // 检查crc u8 crc_result = cmd_check_crc16(cmd); // 丢弃错误数据包 - if (crc_result) { + if (crc_result) + { hw->rec_cache[i].state = ERPC_CMD_NO_ERROR; continue; } // 丢弃不是本地数据包 - if (cmd->head.dest_id != hw->local_id) { + if (cmd->head.dest_id != hw->local_id) + { hw->rec_cache[i].state = ERPC_CMD_NO_ERROR; continue; } // 处理数据包 - switch (cmd->head.type) { - case PACKAGE_TYPE_CMD_REQ: - printf("{REQ}\n"); - erpc_send_ack_package(hw, cmd); - hw->rec_cache[i].state = ERPC_CMD_WAIT_TASK_DEAL; - break; - case PACKAGE_TYPE_CMD_REQ_ACK: - case PACKAGE_TYPE_CMD_RESP_ACK: - printf("{ACK}\n"); - erpc_rev_ack_package(hw, cmd); - hw->rec_cache[i].state = ERPC_CMD_NO_ERROR; - break; - case PACKAGE_TYPE_CMD_REPEAT: - erpc_rev_repeat_package(hw, cmd); - hw->rec_cache[i].state = ERPC_CMD_NO_ERROR; - break; - case PACKAGE_TYPE_CMD_RESP: - printf("{RESP}\n"); - erpc_rev_resp_package(hw, cmd); - hw->rec_cache[i].state = ERPC_CMD_RESP_OK; - break; - default: + switch (cmd->head.type) + { + case PACKAGE_TYPE_CMD_REQ: + ERPC_DEBUG("{REQ}\n"); + erpc_send_ack_package(hw, cmd); + hw->rec_cache[i].state = ERPC_CMD_WAIT_TASK_DEAL; + break; + case PACKAGE_TYPE_CMD_REQ_ACK: + ERPC_DEBUG("{ACK}\n"); + erpc_rev_ack_package(hw, cmd); + hw->rec_cache[i].state = ERPC_CMD_NO_ERROR; + break; - break; + case PACKAGE_TYPE_CMD_REPEAT: + erpc_rev_repeat_package(hw, cmd); + hw->rec_cache[i].state = ERPC_CMD_NO_ERROR; + break; + case PACKAGE_TYPE_CMD_RESP: + ERPC_DEBUG("{RESP}\n"); + erpc_rev_resp_package(hw, cmd); + hw->rec_cache[i].state = ERPC_CMD_RESP_OK; + break; + case PACKAGE_TYPE_CMD_RESP_ACK: + ERPC_DEBUG("{RESP_ACK}\n"); + erpc_rev_ack_package(hw, cmd); + hw->rec_cache[i].state = ERPC_CMD_NO_ERROR; + break; + default: + + break; } } } return ERPC_NO_ERROR; } -void erpc_rev_package_core() { +void erpc_rev_package_core() +{ list_t *list = &erpc_hw; - if (list->data == NULL) { + if (list->data == NULL) + { return; } - while (list != NULL) { + while (list != NULL) + { erpc_hw_cfg_t *hw = (erpc_hw_cfg_t *)list->data; erpc_rev_package(hw); list = list->next; } } -u32 erpc_set_rev_cahce(u8 hw, u8 *data, u16 len) { +u32 erpc_set_rev_cahce(u8 hw, u8 *data, u16 len) +{ erpc_hw_cfg_t *hw_cfg = erpc_hw_get(hw); CHECK_IF_ERROR(hw_cfg == NULL, ERPC_ERR_NOFOND_HW); - for (int i = 0; i < MAX_REC_CMD_CACHE_NUM; i++) { - if (hw_cfg->rec_cache[i].state == ERPC_CMD_NO_ERROR) { - printf("set rev cache %d\r\n", i); + for (int i = 0; i < MAX_REC_CMD_CACHE_NUM; i++) + { + if (hw_cfg->rec_cache[i].state == ERPC_CMD_NO_ERROR) + { + ERPC_DEBUG("set rev cache %d\r\n", i); memcpy(hw_cfg->rec_cache[i].data, data, len); hw_cfg->rec_cache[i].state = ERPC_CMD_WAIT_SERVER_DEAL; return ERPC_NO_ERROR; @@ -375,59 +458,75 @@ u32 erpc_set_rev_cahce(u8 hw, u8 *data, u16 len) { } return ERPC_ERR_REC_CACHE_FULL; } -void erpc_send_deal_core() { +void erpc_send_deal_core() +{ list_t *list = &erpc_hw; - if (list->data == NULL) { + if (list->data == NULL) + { return; } - while (list != NULL) { + while (list != NULL) + { erpc_hw_cfg_t *hw = (erpc_hw_cfg_t *)list->data; erpc_send_data(hw); } - if (erpc_sleep_tick != NULL) { + if (erpc_sleep_tick != NULL) + { erpc_sleep_tick(1); } } -void erpc_rev_deal_core() { +void erpc_rev_deal_core() +{ list_t *list = &erpc_hw; - if (list->data == NULL) { + if (list->data == NULL) + { return; } - while (list != NULL) { + while (list != NULL) + { erpc_hw_cfg_t *hw = (erpc_hw_cfg_t *)list->data; - { // 遍历接收缓存 - for (int j = 0; j < MAX_REC_CMD_CACHE_NUM; j++) { - { // 发现等待处理的数据包 - if (hw->rec_cache[j].state != ERPC_CMD_WAIT_TASK_DEAL) { + { // 遍历接收缓存 + for (int j = 0; j < MAX_REC_CMD_CACHE_NUM; j++) + { + { // 发现等待处理的数据包 + if (hw->rec_cache[j].state != ERPC_CMD_WAIT_TASK_DEAL) + { continue; } } - { // 多线程下,抢占处理权限 + { // 多线程下,抢占处理权限 hw->deal_lock(); - if (hw->rec_cache[j].state == ERPC_CMD_WAIT_TASK_DEAL) { + if (hw->rec_cache[j].state == ERPC_CMD_WAIT_TASK_DEAL) + { // 获取指令的处理权限 hw->rec_cache[j].state = ERPC_CMD_WAIT_TASK_DEAL_FINISH; - } else { + } + else + { // 已经有线程抢先执行了 hw->deal_unlock(); continue; } hw->deal_unlock(); } - { // 处理指令 + { // 处理指令 // 搜索指令列表 list_t *cmd_list = &hw->cmd_list; // 链表是空的 - if (cmd_list->data == NULL) { + if (cmd_list->data == NULL) + { continue; } // 获取指令指针 erpc_cmd_def_t *cmd_def = (erpc_cmd_def_t *)hw->rec_cache[j].data; - while (cmd_list != NULL) { // 搜索指令列表 + while (cmd_list != NULL) + { // 搜索指令列表 erpc_cmd_list_t *cmd_obj = (erpc_cmd_list_t *)cmd_list->data; - if (cmd_obj->cmd == cmd_def->head.port) { - if (cmd_obj->handle != NULL) { + if (cmd_obj->cmd == cmd_def->head.port) + { + if (cmd_obj->handle != NULL) + { // 指令调用 cmd_obj->handle(hw->ord, cmd_def->head.src_id, cmd_def->head.dest_id, cmd_def->head.port, @@ -445,7 +544,8 @@ void erpc_rev_deal_core() { } list = list->next; } - if (erpc_sleep_tick != NULL) { + if (erpc_sleep_tick != NULL) + { erpc_sleep_tick(1); } } \ No newline at end of file diff --git a/erpc_core.h b/erpc_core.h index 1834a27..07e1fc5 100644 --- a/erpc_core.h +++ b/erpc_core.h @@ -31,13 +31,14 @@ typedef struct erpc_cmd_head_t { u8 msg_len; } erpc_cmd_head_t; +#define MAX_CMD_LEN (256 - sizeof(erpc_cmd_head_t)) // crc16最大支持256字节 + typedef struct erpc_cmd_def_t { erpc_cmd_head_t head; u8 crc_16[2]; - u8 *data; + u8 data[MAX_CMD_LEN]; } erpc_cmd_def_t; -#define MAX_CMD_LEN (256 - sizeof(erpc_cmd_head_t)) // crc16最大支持256字节 #define CMD_MAX_RETRY 5 // 最大重发次数 #define CMD_TIMEOUT 30 // 超时时间 tick #define MAX_REC_CMD_CACHE_NUM \ diff --git a/erpc_core.o b/erpc_core.o deleted file mode 100644 index 9d0e0bafc42b28563693fc46f2935ac98afee59f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8141 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 diff --git a/erpc设计文档.md b/erpc设计文档.md index d3f5a12..f7d5498 100644 --- a/erpc设计文档.md +++ b/erpc设计文档.md @@ -1 +1,39 @@ +## 协议设计 + +### 指令通讯 +1. 指令发送方法:
+ 采用send-ack模式,即主机发送指令后,等待目标设备的ack确认,确认后才认为指令发送成功。 +2. notify-noreply模式:
+ 接口:
+ ```c + u32 erpc_sand(u8 hw, u8 dest_id, u16 port, u8 *data, u16 len) + ``` + 描述:
+ 主机对目标设备发送一条指令,并不期待回复。其本质就是发送一次指令。 + ![](./picture/1.jpg) +3. notify-reply模式:
+ 接口:
+ ```c + //主机: + u32 erpc_send_wait_reply(u8 hw, u8 dest_id, u16 port, u8 *data, u16 len, u8 *reply_data, u16 *reply_len, u32 timeout); + //目标设备: + u32 erpc_replay(u8 hw, u8 dest_id, u16 port, u8 *data_out, u16 len); + + ``` + 描述:
+ 本质由2条指令组成。
+ 主机发送req指令,从机直接回复。主机开始等待从机指令。
+ 从机处理完成后,向主机发送rep指令,并附带回复数据。
+ 主机收到rep指令后,开始等待rep指令的ack确认。
+ ![](./picture/2.jpg) +4. 指令工作在单线程模式下:
+ 指令发送后,等待ack确认,直到确认后才认为指令发送成功。如果确认超时,则认为指令发送失败。 + 可以在上述的接口中发现 cmd 并不定义为cmd,而是用了port的称呼。port的取值范围为0~65535,可以用来表示不同的指令。
+ +4. 多device通讯方法:
+ 每个port工作是单线程的,这就意味着,如果有多个device需要同时发送指令,则需要多线程或多进程。也就意味着需要定义不同的port号,来区分不同的线程,哪怕他是相同的指令。
+ 例如:节点0x03中挂在了3个电机,需要这3个电机同时运动,此时理论上指令是相同的,但是device不同的。通讯库没有做device id的区分。为此需要将port号划分为cmd + device id的形式。cmd相同的指令,device id不同,这样就可以实现多device通讯。
+ u16(port) = u8(cmd) + u8(device_id);
+ 这样一个cmd号需要链接到多个port上。此时的cmd可叫做cmd组 + ![](./picture/3.jpg) \ No newline at end of file diff --git a/list.c b/list.c index 582a34d..392318c 100644 --- a/list.c +++ b/list.c @@ -1,6 +1,7 @@ #include "list.h" #include "stdio.h" - +#include "stdlib.h" +#include "config.h" list_t *list_create(void *data) { list_t *node = (list_t *)malloc(sizeof(list_t)); @@ -41,7 +42,7 @@ void list_print(list_t *head) list_t *node = head; while (node != NULL) { - printf("%p\n", node->data); + ERPC_DEBUG("%p\n", node->data); node = node->next; } } diff --git a/list.o b/list.o deleted file mode 100644 index e32bab7d9229e02418d4b25af71dbec74cdddd01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1700 zcmb7EL2DCH5PsWDZID_Q5slQtA{8q%YqTLm5nL^yPoxmU*pt*W*=i&<%Vr~KK@h6K zQia~V>VMFSR4w%2#hZBapcdjGC&@vKGjH-XFJ>j*JTV*=N#Hqtk}taRjfxgKvD}XNm_4#v2T_ zhkPF7I(*|{hc(7tqu!e2n_$^27(6fp+_mF^h~|x*)U6L{ARZJFz)JAo-QJ6Cw+rFg z5Uw4Dy9}BUYO}zFz`0IqoUXCsA^~wF;3wOSALJ;sd616_`tYSP$O+;?5%2l)1DGY% zB*TTZecp;lT}CmLRN4YVF};!@3;8}@qGC|_q9neXYvZq4H)K}lbBV?*y~c!chtZ;k z-4yl7Iy?A;;`h`6e8{0XUQroaC|X<}jbD%HTAs20#dyzE+(7Vr3v0Z0#^75?0LGKU zngWdHM_4JqC*A$9_ho)=?t(ep%x0D{>7-k$SDMMXb2sTZ4^lJcl}4rNo6BqFLS=P+ zF}avYo32;8=al@@X4X1uLBK;0>IkeD`wBa1G4>tyqXJoQtH_4E3=udO{wH-{N`(4^ zuwfnKH9~Ya^kOXX9uJWjda+jWPKRhF^kVho#ZQhX)ES7Q zN=M>9qRu}YE0G*!_F+$S4X59rsB;gqAdY+u;#$hg+b1{}ZCI}LOgQ~@4eK71`^9Rt z7QQ^ZGjqMls=p#xXj$YuYl{}~DJA{j_>#UXui+BXfPTluv MYf`B?z*oZj1r~KRA^-pY diff --git a/makefile b/makefile index 61c0a50..158c108 100644 --- a/makefile +++ b/makefile @@ -3,8 +3,8 @@ # 指定编译器 CC = gcc # 指定编译选项 -CFLAGS = -Wall -Wextra -std=c11 - +CFLAGS = -Wall -Wextra -std=c11 -g +BUILD_DIR = build # 源文件 SRCS = erpc_core.c \ port_self.c \ @@ -22,11 +22,11 @@ all: $(Target) # 链接目标 $(Target): $(OBJS) - $(CC) -o $@ $^ + $(CC) -o $@ $(addprefix $(BUILD_DIR)/, $^) # 编译源文件 %.o: %.c - $(CC) $(CFLAGS) -c $< -o $@ + $(CC) $(CFLAGS) -c $< -o $(BUILD_DIR)/$@ # 清理目标 clean: diff --git a/picture/1.jpg b/picture/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1ec3a8848474f2e1f5e3a8602cbd36f26266d3a9 GIT binary patch literal 9871 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 K8ghW0-v0tHKs4z9 literal 0 HcmV?d00001 diff --git a/picture/2.jpg b/picture/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3984c810b179520d01e5e66ce2ed2db245568758 GIT binary patch literal 18609 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

@SQP~VZWouRU(F;nTwf+@{ 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 YF5vrgwuI09kIPs;NZ}9v2w&^}FB47TcmMzZ literal 0 HcmV?d00001 diff --git a/port_self.c b/port_self.c index 3123aec..802063c 100644 --- a/port_self.c +++ b/port_self.c @@ -6,20 +6,48 @@ #include "erpc_core.h" #include "windows.h" #include -void hellworld() +u32 hellworld(u8 hw, u8 src_id, u8 dest_id, u16 port, u8 *data, u16 len) { - printf("Hello World!\n"); + ERPC_DEBUG("Hello World:\n"); + ERPC_DEBUG("len = %d, msg :%s\n", len, data); + // 防止编译警告 + UNUSED(hw); + UNUSED(src_id); + UNUSED(dest_id); + UNUSED(port); + UNUSED(data); + UNUSED(len); + return 0; } -void hello_cat() +u32 hello_cat(u8 hw, u8 src_id, u8 dest_id, u16 port, u8 *data, u16 len) { - printf("Hello Cat!\n"); + ERPC_DEBUG("Hello Cat!\n"); + // 防止编译警告 + UNUSED(hw); + UNUSED(src_id); + UNUSED(dest_id); + UNUSED(port); + UNUSED(data); + UNUSED(len); + return 0; } -void hello_dog(u8 hw, u8 src_id, u8 dest_id, u16 port, u8 *data, u16 len) +u32 hello_dog(u8 hw, u8 src_id, u8 dest_id, u16 port, u8 *data, u16 len) { - printf("Hello Dog!\n"); + ERPC_DEBUG("Hello Dog!\n"); + // 防止编译警告 u8 data_out[10] = "12345"; - erpc_replay(hw, dest_id, port, data_out, sizeof(data_out)); + u32 ret = erpc_replay(hw, dest_id, port, data_out, sizeof(data_out)); + ERPC_DEBUG("erpc_replay ret:%d\n", ret); + // 防止编译警告 + UNUSED(ret); + UNUSED(hw); + UNUSED(src_id); + UNUSED(dest_id); + UNUSED(port); + UNUSED(data); + UNUSED(len); + return 0; } erpc_cmd_list_t erpc_cmd_list[] = { {.cmd = 0x01, hellworld}, @@ -49,7 +77,7 @@ static void send_unlock_h() ReleaseMutex(send_lock); } u8 data[300]; -static u8 data_write(u8 *data, u32 len) +static u8 data_write(u8 *data, u16 len) { erpc_set_rev_cahce(0, data, len); return 0; @@ -66,7 +94,7 @@ erpc_hw_cfg_t self_hw_cfg = { }; void erpc_cmd_config() { - for (int i = 0; i < sizeof(erpc_cmd_list) / sizeof(erpc_cmd_list[0]); i++) + for (int i = 0; i < (int)sizeof(erpc_cmd_list) / (int)sizeof(erpc_cmd_list[0]); i++) { erpc_add_cmd_list(&self_hw_cfg, &erpc_cmd_list[i]); } @@ -78,6 +106,7 @@ void sys_sleep(u32 ms) DWORD WINAPI send_task(LPVOID lpParam) { + UNUSED(lpParam); while (1) { erpc_send_deal_core(); @@ -85,10 +114,11 @@ DWORD WINAPI send_task(LPVOID lpParam) } DWORD WINAPI rev_task(LPVOID lpParam) { + UNUSED(lpParam); while (1) { - // printf("rev_task\n"); + // ERPC_DEBUG("rev_task\n"); erpc_rev_package_core(); erpc_rev_deal_core(); } @@ -96,42 +126,47 @@ DWORD WINAPI rev_task(LPVOID lpParam) DWORD WINAPI test_task(LPVOID lpParam) { - printf("test_task\n"); + UNUSED(lpParam); + ERPC_DEBUG("test_task\n"); while (1) { - // printf("[test_task]send\n"); - u32 ret = erpc_send(self_hw_cfg.ord, self_hw_cfg.local_id, 0x01, NULL, 0); - printf("[test_task]send ret:%d\n", ret); + // ERPC_DEBUG("[test_task]send\n"); + char msg[] = "miao miao miao\n"; + u32 ret = erpc_send(self_hw_cfg.ord, self_hw_cfg.local_id, 0x01, (u8 *)msg, sizeof(msg)); + ERPC_DEBUG("[test_task]send ret:%d\n", ret); ret = erpc_send(self_hw_cfg.ord, self_hw_cfg.local_id, 0x02, NULL, 0); - printf("[test_task]send ret:%d\n", ret); + ERPC_DEBUG("[test_task]send ret:%d\n", ret); ret = erpc_send_wait_reply(self_hw_cfg.ord, self_hw_cfg.local_id, 0x03, NULL, 0, data, NULL, 1000); - printf("[test_task]send ret:%d\n", ret); + ERPC_DEBUG("[test_task]send ret:%d\n", ret); + UNUSED(ret); sys_sleep(1000); } } int main(int argc, char *argv[]) { + UNUSED(argc); + UNUSED(argv); u32 ret = 0; - printf("erpc_port_self start\n"); + ERPC_DEBUG("erpc_port_self start\n"); ret = erpc_hw_add(&self_hw_cfg); - printf("erpc_hw_add ret:%d\n", ret); + ERPC_DEBUG("erpc_hw_add ret:%d\n", ret); CHECK_IF_ERROR(ret, 0); erpc_cmd_config(); - printf("erpc_cmd_config ret:%d\n", ret); + ERPC_DEBUG("erpc_cmd_config ret:%d\n", ret); erpc_sleep_tick = sys_sleep; HANDLE threadHandle[3]; deal_lock = CreateMutex(NULL, FALSE, NULL); if (deal_lock == NULL) { - printf("创建互斥锁失败,错误代码:%d\n", GetLastError()); + ERPC_DEBUG("创建互斥锁失败\n"); return 1; } send_lock = CreateMutex(NULL, FALSE, NULL); if (send_lock == NULL) { - printf("创建互斥锁失败,错误代码:%d\n", GetLastError()); + ERPC_DEBUG("创建互斥锁失败\n"); return 1; } threadHandle[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)send_task, NULL, 0, NULL); diff --git a/port_self.exe b/port_self.exe index 5877aa259d2d35bc32a74999dfe17a3dc61b89b9..bbbc9e844168555c2bdbd4b3cfab95f457e01c86 100644 GIT binary patch literal 111340 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 Wx3?XJ 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 delta 17964 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 H4!HjpHvPhf diff --git a/port_self.o b/port_self.o deleted file mode 100644 index 7a28d65178c48a6d4864324c2fca9e47c3a89701..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10658 zcmeHNZEPGz8J^3XshigFp`?;gKeRCpIMlv4j&Y4Ca2NZM6|&V+8aD`NH=DaX`%KDTDeJDkW-KX1*uVgAU-MxB1z9`qy`kKR5dZr zJF`2t=d)=+{e^a<*?IPPKW65g*_r)HeeX_2Y0ak@`w~YX7O{*8i(_#p)G_u{fU&Lz z#JP$>VTnDFly2!By_4%1yZ#BrLK_5Gk0Q$U%t!VXiypNV;Ur7UN6c!6^UyqUZ?$@q zC8CjuYQ57?8Mtq`UPm-isMWg(yxslGc91^+5eQald;eO6bjR?pn?< zcBMuy5#7Ay^HqvroV6f!x0(eVKoJcmqC={ERh_!7s51>DDAQq9o%*Hn_%A#nlC2<0 z#O&Y1>^J-EUzg%N{q`THhr<2#o6|#0{q}3qLyG-++8%06+wtr0-sHMa&u;15+C{BX z?f84?i}BlxHNHI9+Bi3)G|t7t12ggWF7~%5YoRe{Ux?YivM4^|H&`a@qL}@40)0W5JsBCb~epiDo+` zcZ;FfNvT^DwMWN6!YKnz`QUQLwU$2PN5GGO9|1oCegymo_!00U;77oZfFA)r0)7Pi z2>223Bj88CkHG(F1b*uD>#YyzpK4^Yd1ZIr%%(Olanh$-F6_?_Z(x>Dv@}aE?qlDO z@bRLNODU#d^=?e9WrkTuYK6RMX+I8*wyLd zS6?}Q<^0pvo;kH}^w8DkUMRnG>fKk5EF68deCEuRSAO{R$wTkH`hBXcDh29;b@iR0 zU?9O*4SsqRel`8o_?`cyA8)-5rbfH(e5s`Oy>~k$ja3sel{8*0PD$^2>GKAa^uG6D zU@GZdunJ7&A>>`aRKAY92bjt-au%4%50EE-sa%H_(1(GkRPge77MRK;J}I0a+^%Oc z!?|RBbhNiQW$0Ngn@{d*ZrfTVpwVAZKp#Jw+wie(M_*sB(mK)8t#x;`k7sgQJKKxK zNV{q5?`TuDjb*ZyviE>8n91$f-M+iKODUN7C-FgalhPB}65-!;&=^m;3;0vWAr{7Q z3rC-k+=G(KNRGa;2)!Qxbs~q@&v2yZhS(c8ZsO=|$=w8^@3SFxHzKu>qX&S5Ubp1> zfP|h2w3X}q0O%f$ej?F}K=k=G#Qp?CZ49x00@1h75Ua-s&@2eC2B3#HY6cR${49`Y zeFR8&?vdy*pdM~v011mHfxf`GZ%MsxOY|&|us97QES?7v7B5M?pG))yAc}B^y${sO zQ9Wjgux$VmwjDriT>51x?E@06|0=c{uM~H?;4Qsd`HN&T?Zsa^?r%kfQ0QsK*IK6AYnTOw3&PUu|$87 z=oXNe8x6R61ZtM36Nn~qh;5T-r$qITtV0g)D_08JZCQWCkqr#YAXuqj2lVE7qsW2rlha3jW1k!P2 z+JQ(%FsH!KJ|q}y0sL-)cB6{U8R*cSB$!b>L(4bcnJPNxh(fv(IT)zN5iXoWHF^Ib zB1tenyBf{1O7i|cL^i>|vGt6RuS)X%J4De6R;rOo-v5R|T<1k8bAk7tAv6SjPP-ym zdjA)~Z%mF3?Jkw%{a5G?(80j=iqM08?_lapFz^+RqyqouK4IfO_>FlnYZwL1$|U!(5!~&M)4e`Nc`d114oc;RnY`W8 zMg$(q(aj&uPiAs-+c z8d+%+P&TdMQ6rfihToODu4$Rkg0@@FSljdFqnX@r)_7zu-EuM^*=b}Ay=V-M;YUP= zdXxg^;6BsPEg_9L)DFWM(2G{wH1lSa)~*pKr(7zVFB+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +