From 5c9384b9af606673eb1772887b901c4694369f85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E9=80=B8=E5=87=A1?= <1343619937@qq.com> Date: Sun, 12 Jan 2025 00:25:37 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .$架构.drawio.bkp | 16 - .vscode/settings.json | 7 +- build/crc16.o | Bin 4996 -> 2773 bytes build/erpc_core.o | Bin 19751 -> 15205 bytes build/erpc_port_self.o | Bin 0 -> 35990 bytes build/list.o | Bin 4621 -> 4271 bytes build/port_self.o | Bin 37593 -> 0 bytes config.h | 10 +- crc16.c | 41 +- crc16.h | 6 +- erpc_core.c | 985 ++++++++++++++++------------------------- erpc_core.h | 227 ++++------ erpc_net.c | 3 - erpc_net.h | 3 - erpc_port_self.c | 104 +++++ erpc设计文档.md | 39 -- list.c | 110 +++-- list.h | 60 ++- makefile | 2 +- picture/1.jpg | Bin 9871 -> 0 bytes picture/2.jpg | Bin 18609 -> 0 bytes picture/3.jpg | Bin 11598 -> 0 bytes port_self.c | 208 --------- port_self.exe | Bin 113101 -> 105706 bytes port_self.h | 0 port_uart_master.c | 0 spi_port.c | 3 - spi_port.h | 1 - unit_test.c | 2 - 架构.drawio | 45 -- 30 files changed, 713 insertions(+), 1159 deletions(-) delete mode 100644 .$架构.drawio.bkp create mode 100644 build/erpc_port_self.o delete mode 100644 build/port_self.o delete mode 100644 erpc_net.c delete mode 100644 erpc_net.h create mode 100644 erpc_port_self.c delete mode 100644 erpc设计文档.md delete mode 100644 picture/1.jpg delete mode 100644 picture/2.jpg delete mode 100644 picture/3.jpg delete mode 100644 port_self.c delete mode 100644 port_self.h delete mode 100644 port_uart_master.c delete mode 100644 spi_port.c delete mode 100644 spi_port.h delete mode 100644 unit_test.c delete mode 100644 架构.drawio diff --git a/.$架构.drawio.bkp b/.$架构.drawio.bkp deleted file mode 100644 index faa5e5c..0000000 --- a/.$架构.drawio.bkp +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/.vscode/settings.json b/.vscode/settings.json index dfd61ea..1f11490 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,7 @@ { "files.associations": { + "*.ndjson": "jsonl", + "*.dbclient-js": "javascript", "spi_port.h": "c", "cmd_def.h": "c", "config.h": "c", @@ -20,7 +22,10 @@ "windows.h": "c", "string.h": "c", "stdio.h": "c", - "stdlib.h": "c" + "stdlib.h": "c", + "algorithm": "c", + "initializer_list": "c", + "utility": "c" }, "makefile.launchConfigurations": [ { diff --git a/build/crc16.o b/build/crc16.o index 2af0e3998ea7227363d28c563952953fe52023eb..39c8746b1128c17edcd64f9385b113f93ca48fe7 100644 GIT binary patch delta 1053 zcmZ8gO=uHA6n<}J|I#FFen=DBT4O>hs7)=_iq*n45@-&J1&auglIEu^wn2m9uG?|buR-t5eSV;^F{@>&oi z5(dCwI~Wg}RArBMnL6nj4v4iGCV0P9{7w|~Vmn+UK(!EG<7 zQj!Uw?BLJ{v42=08qq`+`?ZG}z!zQAu(xfJqOZyQp^J6wwJ%4+9(FOGEMT8W_D_#`MLSNxnFHgg{sY5qGKnQ*!^fUcO|Lrel@D6bD@r%H{vPlWH;V! zT~Lt46s9U1ugE&4G=vQlHEklE8!eRT0pt-W`Z$RW zbVr&l6&Ch$2T=*slyrdh>=udMnuIy#%Q{D)jqds zQj)}YduWYa3~G1x0=l>OFomfFpsPlZw~Ra7Wim-#X%2LmfO@9fYh#HMJ2 zvI;_-n5)VeVMk4eXmEoAE!IP<+mVwpCKf}}@r+fuW05Bz+vaFWCccLrp&{;v(|P$; zTK|~1i>f!ux580A9l6>;G(1W~i7QhS2Ya%I*aG#q}-c``3RV@AzOEM8Z_m4>?*X+zC> zEbe&xV!CwMEfg2~mP3eH%cr9dvY{n5OM516C_rjyQfbA8Dr}bMK-_%5-I3N0iYu>5 zGX(Mi#0&!NB?XraG8;0~mseUdfJGP~zb->0P~%zNXA*KGlVwa9v^^fwv|tul!0pj?iAn}mAG`sZOB%? zz|ncqvGQYsqjR>wchKI8&_VloYMIw<@7?>p*twSyzP+c!yzaw}F1sOb7s}hUr}8jV zjt3lT@{wZ=k@38y@+DuVz4yBftIAlNu`7L^ z+PNoVxMmx=?C0}#HQ?;;OrfE24;{3X_VZXCUK{P{B>VZ;R@If9&gy2E0(-B@WKqVk za=+pFeaakG&^dH;%{H7W>Fw*IP8Ek>w*aQ_BeD8$5&(1#ZD78jxB75G`wU%yXUH>j z4#8c;_51ElF9?k?)SEpOKeavD{Nj=iqvEY&*EVim_S7AFx4-e)@lVfI8V#EG_<5J@ zoOf^ix!Bw8N%st0dE?WIwmkpV!~6O^``Zb3(X=WvkMsZGJ(&1q!)^1IKH9W%%xzis z{qyAOUu-+D=Ex7NvEo64D}>+X20U|sd?@15)YaKq8xAKdRadCjVp z$J%Y8Yp7<-<<);Y^vOGSp5F15qciYe_7hh;`^BO^HFkI0zw}4LnzOI0F^>D@-M_xF z`@+UE%hzAibyd%>t-lK1e$xlD4lKT`l&f8mGj;frpWOA$$FIJ6Y}|I;^DS#;ZdiBo zuJDl?KA&TnJl^ty!l-^z-yc3b_TGP9zjSxaj%zoy-?e(}6Suzn)S1mWZ(A?Zwm#I8Y@EMn;?lt#XR{9vdwSf@Yb@X7eG)u2`_*4R-?jbJ zhC^$LZ_)<6i|w<1QM@t`6&1La~x6V^piE=zKPo>r3K@ByF7tWp6v{;Ho zJuD2ZXc)COtAS@3c_T@8P(siJC0$vo zA#yq_*Cf=HR!EjBE}+ShMi_66$g8$I?+Zp;2_!h3fl$=xbcWncPcr5Vx!MsQH=F9%PSDB1Fh~)WLOZDiA`8|j)z|2{?v=#9q zu<0yV^Wr&H(?}^q8yEs)6ds%p6UK|fSbZ!FB86K6u}B#4C9)gUv@NA5m5o(J)E|l_ zAj9$4NCT?kHdQ_mUqYj(@<==ybR~R|SP1d8xL`d?;B;C7k$9^F?xxB*)vPTLX5#4s z#39$x2;iFrDgt4uXqFX%(-m?Dm&F4eh)ftl1JauX5`|%gFo%#X9`iT@UL;&9=%E)# z=au3KCK%2HSeIBHm5?xkaT;9|7AF!4wRHY@T`2B%2Bk0(Ml!X)b{rDSoDp2-(l0wK zs3OBo8mL8bL734d8WrhaQ#s*gBNPi%DeBmzNhlEx0GExlG#5&;WrAh?h{~TsIn=c< zhU)+kNB5&M9+adg65@u>LBxw+L#-#U@AGJnkryn&cr+hO+BTc zwg5&8Xt{h(; z2z!D_uY?d=Jn%_@;)x}^k}qy)p+4Z717~cC4hGyZ9dZSO5syr>rA$9sz|um-pe(ru zz;I(R(f0U>K1uQuWVD4?w~;G0k|`EaSWEInBhgxjz9~(&jo7}Yu5O?mh^!k)-3n5; zLJekUB3yzP;OoSdlfkq}kP_O|l4{y)BW1MtfJ~!}g_va>LqfV)GCPSjGohy%9ybz> zHrq)4B4XS~@{`2qBiTuUo5QsS1tZ*U&e4jG(4_*UNN!TKy342P4XZTMas_TTei7g) zoT^uk7Zs;zWH4k0PxP+Cqgzr`Pm207MO8q28Miz|ffCWbu^hW4$rRlRdM2Z2S;kIW zCZoNQwNyhn9a;!AT?2T`7w4M&?D$ z0Hbxl%edh{6*8?kC2L5@94VQ_7l7N1TzdQ9A2d$ef{L6;=&=t4!o!HrvY6F0J6M{^ z{3)VTvlJ*gM+}qkl0gkPOb-*9Z+}UD#h{y)yNKuX7Yv%qMKNiw7c6J2oM!!@Q2NUS z{b$T!IzO2u{ndhIDq}KprWPHFnU-Pbn+3Z~C{npurEqi=ak%IrJwxbT1(U@v6;P*+ zFhzsV7KNe_IQ$wL-;`1zb|@`<5aBR=qZnA8Q$%!)ad^r=07wofQu;2%VS2FA(d;j8 z0%`F|?xf!t2>T)`?Q*-}Fi3GRSJ*GbRW=w1ODY|Qo1*;ERMgSYp-O!*S4cvc7l3cy JF#car{|iMfC*%MC diff --git a/build/erpc_core.o b/build/erpc_core.o index bd19ae274fc13c73b2271f2afaafa66ceea44313..5c18b91197919b11682e3d7b7105d4daf1be0b3e 100644 GIT binary patch literal 15205 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

tq!A%B@rR3rY zmzT<%6x%B0!8vZ5wZ({Ws=hLF)lo;qz4M`vLW%Ag6c?{Ry4)*kT|IAPJW$8IiFZWT@9y}-cQ{WVb39pQ6`xIAogDp^m(l1fpN7t;pQ z6)&{j;du$ZP@4I9>iT&LO={uyQrFLmJEW9Wmyiw!DRK*$TF+1~HyP3(s?JA1|yTb}VXAA1@GqZ!6F5=M(yP zQG(~0@dMZ>o@*Aga4W(65AwV|q0);r`Y;!ZF76{ixtNobbGC{(mN}t?`}^z(Q$2TJ zX{X2;*$JMLeUS5ho?FQ+E6Ba|G~Hjx1BZCw3p^)Dw5gSRQi7KxdGP=*!44ebrP%ZS z^StOoo;$$31H9-~=>L#U>EOjl?t6&mdCH4;!6Rl*KldKs`KGU(i;yw0+j(JjANMDD zUJ}-0N7H+y9JYuItK&CQ*UulIU25U=)ZJ*a^p1ZDDKJw6PLI8PMt2{d>bdDtcm>-u zu2rAE$agH`e_5 zl_bFWZF*bF5Ai@hFHDZJvvUsel77wy?9I*nkQa%~y`_p5^~3J-YJZnL#C`qzbEpNt zlDo0dakbHT2d=--8%6FSZmq-Iw}Td2P{~V4Kz>4&mnt5>vdkaL(VL>Ym`nIvLf*`0 z(vs_VzU=0#g?C>dDaDm49}|vzgl9!Qih_}@1e5Fe(tf@S&R@bmvxHAVtPdbLpB^K@ zz#eW<^#)s1sKTlM+58tiqyA}Lx`pQ+;4|0q0z8OEf}8OQp5I5cNq^_g;ra8GF462x<|Y5vI6fD=!nhi+xrdlumW!k1sgiMSKL4E{@WJ>H^+M(iM1s@D_^uQR*XvwUd~-Jn6WjOmt)yyQ93R=n|Iy=Ie6vW!^+- zzD_q^=53wk+wbPfyyMh-DK}r{?Y7Nl{?HJNwx2T}7ubBBuejx9KK0Oi8GgxpRHOMW zx#eX(1he_foo@Rw9|~%|<8Hpp2cR~e=Ym^r=CfSQ_f} z_?V#E5S>e>3LG9+D5_sWl$(-@8v{k92O?5RP*W*}B(7XTboP~VNxP&j(9l9nU7~Rz z4b^CBMC0l;)TpUV8i!{xO2=AFU8ivyG}NJ~T^hGpLkUgYs&S8NXuGEF(6~VjeO*)c zXx!5p+NY`eHSUmxzNe|rYusTCy{M@#Yuu|E`iZ6vYuxJ^dQ($RYup(Poz+yj!I*`Q zmp!DY2Ky4AxdKNX`mBJyqoH4G=+7F;LnKPRzt_+~4ZWqI*YWsA@;#qrL(34m6eR}h z(9l;kv=5M+@tVf{yN2k00&=bo3z2+PfF$ld4J9?SOY=RWalh8k6nbSMY+0nChc)!9 zhCTu$wUt^n^cfA^185GUc-fZ$NqOJX)R#2$aIQ^#QbYf!q2B`ftdMeELl$yc;_d<@ zCAVo@Tti>c)Pov&QB(g_)QKJZPw6tHFQ=(2u?Or#DO2*(yBTQ zO#?JfP=gv*qj3?9>(V&NX(@%Ol$=XdO5&)hNZhc-y{~Z>G>$S}^7#SDxeGLIp~kJ% zxOE!0L*oWD?y$zu>j5e6tj3+wxGNe*4_G8$86as(xyIFNT%*P%G;XWL?bo+=eQ zEdvkzyKZcIN%3G4!9%}L8QcCz@z5@r2K}q9Yz))eT0O<#rr4%7+*GPYnBRb2u_3lT zxe>oFXz#J%*7fUgi>XKP*6xk5UVG>sb#->fY)Wq;&MM;c8m;WH#~!n>?eW%4G2HXo z?;V`)JH#6w$9t8GH$c~aO(o`Jyi5}*BwpePC>|5P4q)TG#U1aZvvX3$PYM)C{lFme d*CB#RMT&`+`DsY~l;{7*!Sn(NuNAx4{{S~h7w7;0 literal 19751 zcmd6P3wTt=m1f=UuI?*!OKLqp;vr~22$?|-47OzqxCLt57=aWa@%A*0)OvtkE43uB zVT^e=YHNtW&Lo~$#_MFVi8Fy2=kbAKoCFgOmc7|TMefHPGIglFaO975=iG ziF~h4W$fE4BrmBc_VW@7K4Vk;lFupl>ip$P<+FAF654bWFjnuEm~Iq)=3Q03 z_->0ulz$7Ke5EuACHa##clFb_eUqwOp-0ra7Ce058tZqxXySQnFKS*34y&30Z`K($ z6!_KHLQ8loa2eobpeqBvLZvjSv|3XArceXAvi=_k8OJgbTe^gnF6ovsgHOls+!{8#}0B?V>K*ufw6D_5FP_0YV$P9E%qJLfxVw1G+-a?BaDd>*L zwQvG`4KXIneAlusB~q$muLNQv!-2}7#)8-zEwM&lb?m}WV@XRa@Gfe4S%13F>FO74 z2)n@exD}ukw+v7?;>h`a69x_i#>diiu)cBd!1y>sLKwTc5%;V!fpL;_vp6>dL((8P zcHD;{0OPzgBo3c?_Z_SAom#0M=Z_ktt zCv$T0FL4VF6G%BA3hM>@O^V;~(ZikBkVUSsM~B9Ye!n);1TK{LarBsbLivoamrQ*pAW0ikv`xtOxNFtH58Sg(@TN?d{x4E zu?tte4)$2!I)y}Hp7O^=Vt^b@VFyAP3p+0jbI1 z>Q?{{2R=?77{}^-2&-!p__4qhfLACY-2DRtVk{UyUj~c;;CHm#8}Rjq#1kdvg8oei z<`NdYPon(JtTQ7729MRHqbyk)8?oY5Mm?odj4EP0Pa)qDqcL&?ZkCCs_V}3NI0DC- zzOp{G4l|01ut}q>646%4vX171k07L9%+qX4r(eHLzkg`Yon3ErRbv79w`O>KNvx*G z2S4BV7wVsnVT_+e)1bP)i3*4g#w6kV~hdN>fQj#U?x)PT7LfUgRj z`O1~Kn2;bTUQ;U^pPv3ug=GvB{_YP8H5yU~wIJ9h3$=vh#MSq}DzkD*)L6>~iWO(p z(XWGVVq{H{RWaq$oF@AJ@cDF%6Ckj3@O#Hc397;5g#nj!cI5WrVs9X}s>Vl$0%J-@ z!T9LG17j@edeH%e#+KYt^^43Ek1~oLYd(ty43;&RN3cAwM$q522Ug%$N8@tlvSjvr?7fdiuOxKTnSb=mMJa($+Aej_9c3u>J zHbTYlQ7X{2LxIm(4>b5=fiGMPd=Yc@=b_F~szGzxP~f@XG5iqIzyKBaA_g~g?$J|t zR-9HBi)x~m1vTsJsH#jId6Y6#yaILSw+N+sRE?3xUM21Ixb~-ZQ!&{lR=c<80#_9I zmsZ5L;4!m~zK!N5@JzN~n5?U^j(%2H^dBDcG*yahO=Aasx}_x-nR)oY745|76T)LO zVR0;?|KAxN$m##Tg@-kQpTG+7X3jc%9+{ghw`CpOA-E_p9jwHj;O73ds`N*0A@m}% z%LH}MFN94DCou=B#V1X;6ie5v5ruux!2`cy(R;>d_9UI8n5!?{BFv!}Ce^E-6)Y5f zb+n50(txeJ5S@2RZQ0eGx|-icgZT!}`s6y`V&{X$@{ZDo#3rVaMux+Nwd=7d1Y-#? zei<7SZ1vTqPZ)85+Pd;QCeB+n>bN>4#AXyuR(%i6Z8sUM%2b(b$ZfL4_kMr7Dr5Vh z?YzmF`|<6XbC3B^cj07p&;Rze?WQboI^Y{ICb8y=Pd*is?h~VBW9U4&0Z)jNY~kM2 z&EMNtNhNLlDrh~{SU?*xEE^LSkeB}nTI)@^+M)d!?6Xc54#54_CPXgQ0dfdnZ?>71 zJ`*?+)|a%H#Ev;}QFwEi7nyBBp4vy#m>WtZ8#TG3mXGC6;;5;=ft_Oi`qP9}WwwIV z9wyaoJ11=+>&SHsiK`=WtYF`bc{FfYZR@W7SAoV>4omr_(c}{sl{Fk$M|))D%ZZ8R zmR0&6L_ge&<09iQnS{vnyTT;F7gIX(k-zC6gBHJ@imBTxSXnvGN-su;$nn+9HTb*cb^MWv6Pf zGXVY!mJ%fWvVhKG0bWuQ+d-@Fs_{3+rhx(##8C&fDVW}}j z%Eg#WivUwOj9&#{Dtq8yIy0v7ef)xesa%NtTLWM!e~jNwz*N?njCBB}ay!lg_X4JJ z8P0Bw0H)H0>~I_~m0O|ANx)Rj$-p@1y^x+dCuO{n15z(Qq`fY<_b(d!#<_i39ABs@3aouMcdjQ$^tBh{_TW;mPL z!oAF9x;nbMT7BZy-__UN+7)T`wRc59;c*Hf?1NMz6lIQG1z&?4o6XhN*4-QRC0BEB zQQIMF6YMa%!R|0WFYY5$)!|C1B(+FFI!w`uVQQ?>*wNhGzpEnxDUOzo?l4sKI)thU z&qJa1&Yn;x)VV9v)ZZKG4DV&OKJWh#&37OMovt4PJ^;uZ1i%;%_3i5mMS6QX+WR2x zRB9dmqbCv-{awzh?LT$7~!f0WBE;YzJO=uCX-<-uxBATMdoC}

uc*1an)4~Rd7jF4Z2M;ZmwF}K;GJfeik%aoR)~T$I+rnL)FH0vV!Agl+c>B8`f?N zqVG~$+fa=@)5wj14b_OT)##)YWPLz%zL|oqUB}YmsOrGRhR~|UjaylI97&T$2z+jq zvlX5*4CnpcHSmx}Og7BvSKUs-##!Ygl5+YcfT9z|SvFO5uCkMB9VYdVcP%hp=L6oS zNmf%Qx;H2S1Dzf2YDQXhu1z~f5?CG$ECQ!c#e^Hh(Ue_8AP9m9)%rB3SW>F90>cZk6Kguob{!QS>Lnyoj#2xikmGiwN3dzf=$dJCy6 zQT<&K*&vVwp56$iyKqw*sy0qJg{r=(qN>7e61auwQ=21bPgdP5s#fMnoF#CJ!20v@ zpC${orq4&t!OOoqvYJ#%GL;N+k%wO-(is= zdp0$y5#osSHMNMJ;AShT2`NHqb=B%%Ahf2jrUuDKM4KixtX&_dZEQd?()i$JS!+$z z+8U-}n)u`4rQ%p4p$&yu?S_p3E1Z*Qbv0Y9kS4SAJkjej=sf`VRG_!&k2szu+; zjNceuu@pMdOxc;uq~J5Wwp=N5%Pb5{DAU4>eA|o-LQZgY1<58t_by17ZkyF02!5c+ zX=Ibbq`-8TlzAQID~L#Gn;04i#{I}}($bc$U9y02=O9iR_io&{xr&WWa_ADq{me3M zC&r!ZoJcf84r~gyHNkmr7@T^JmeO?ngDlX-dMw80kbmAVX3z+;onUh*hv9i1IcSM=-gpn>i8A7vGZy<@n zcFO_Gh)C^d|3eq~iZ0{i4=n8>#zLjtT=Fk!tdy;pGZ)iytC2%dWj}HGz%0>2U51PL z*mk00R&NA)^cW(e+fM9JT9A8sBR!FDG_FUj)Pwe9bZu5c!Z`UCFj)jft+6Ock6Od8 z^eD_xwP<%q7kTXyaj)%GWICp&OX|Hzd#&)xis7@8&ZHe%jSOkW4r#}B>v;>YNry^P z`g-Dqtdxe(Mw70%Lw(rV2}4$EROGK)WHAQj==Npj%{AOfomXTHhV7_k^&K`n z`h^b zbr?nRSt;r;7Ar+%a&;K@CF$re0!qiZIAmc4H)ctC$=sNHF3%Ckxnhnw%i(TX(=eJrx}(RqrzZ1#iA=7V(W91!J|1z29Hil zGI+GuGI$ZH8>1D<;Q1oqjxJN3CXIVj8P_&lq~HIgvT<{QLZMyZKFr4Zg;sRVM%M?b zG){(aBvdRMwci?*vLE)BC8@RlK1(gyavS@rCAFYfXnCMOYUz_&9+)ecYo?2(c!-w& z#z8eTbW0~bnJbe}-Eh5C%$54EZP4yh@>jTL@J zt@4&A79#(p>fUC??hpamHW+H9iE59RQV<hLt!v)S}Bcxdg|S!ecXhO01MqXvvu_j%>QRo8gKgh1@wEVntLeR8bK^kIS{p zU5Y1IXe}8R%C?mGW!9n^N5V}Vk#LvV0~#JRg5$@~#z~=>XO7aWL@j;T3?=b#C{J;c zsaKALLVJ)C!zf2b87$5==9{^0yE((mHga5EEQ)PK%}mw_6G(W_Jd& zXIkx4qLK#)-7q0CsA-&#IShN|N;hc{ubou_=9!>+AvZHoZZ`DSaX0SVma+$wYBuDd>4}aa#EdfI{%OKA_=7y| zFZj$VQFA6(Nmt<~Vl8x|b8=i*6efC*D6`#0BRa~LD2r51k~fD-7ixK!7?T^AH+lWf zN_~nn6}>+}`g|o_L)_o>%lB5^9lCpIDZo;JT5@N3dskCOKk^6@xm>;JKyADM>1f|o)<$AF!yP#4 zk#JLQ6dUM1`9Nt15UzM_@yNKr(o|N*2=*A?Ts7 zBvnvh{?wuwyC3H6bEmm8%Dvk-Kg~TSc>Z(T`40CC@Z16JJk8Ud<9QW4>ohl`JaZdQ zAK+>BeJ}Amds>t`%@xFGAK>XHxUsc^yFYqI$?}{gR;PJ_7yt?C>!KykHlDXvNpx*9 z%X#KGDR%HBo^E$X!MlgMC-S28v@lQK4|+Sd+e&iDK4|WA{x|NaAtPs1aMOIBXRqh3 zR!*kc><^bITkYvBg1?3PoX_zE5Ax;a%RF~2pJJPr$8%2eDd)KJb)FCN4)dHgKJzrs zJH(x>Jd0|<^a0MbgY$s1zt3k=@fOb~jt4oHh5e7Y?^`6_1^H?HyqI+QH80*Eip&~5 z?KyI#Ya7qJ1XuQg@o~Gy$IU^$rVW*T&D~}$cj=1mnh6iSc_csGJjaa{ZG48U4E#Um z=~NmkcJmqLN8J7aY2!S_Go7Ckio@sTJ3Kwg^EdE3`1=sg+l|K^ykd~29pbZ>)7|p{ zpEJOxp5g_AJhLC#?TJ?T`C^E&*?WDKh12XapH(JgkO_bMAh+9#o)rzY@N{Rt=%5Tz z$7!3F%e{z@rxexY+=i|zmt9B9TfwYs$oPP4m;xKxt$5xh`ZNCsue25Ca`!2o*2-On zcuqO@9^$?h?zPR$;c2IVqnJ0GEqpebmpwm#NKiu{-JbERP|5?(pckcB8ZE{;eh(Gq z&v^cNUO=ssA0qF}*~Y!*2TIgnG(}PyFEQWX)1Kw?SCG4=t>aVI@tNy*!6|NE!7I;k zSCsP;+z$VjbI&Qx&BJ(*Iv$rUqE@#)&2OpE(L{~ze~M?E;_g=Js43+<_Yj}g!gI+1 z8HW^lPB~9AWzWMm+7rDA>gSLn{sYw)d1o3qbcClJ;jUABMma)rg!^is%MS>VUqM4G z{pZ|mA3VgVtY0+As&j>^9*y85V?2q{7XDD$}_g{EPMYJ^nW>@Vb9pYvuRw-+Qth` z^D?CFLln|Ehsb>^j_~Y*yksR0JjSyh<7MmUe$RtEJId!Rr+b!}&!<-KZ2NzC2|_c_ zQN=vN{s|10C1l+U?xM&X0ECzSrC7y3zaZ1_pokz)-?=qjwiFr`0-o^GmBu-Lj zMUOKlhLv(tODpTai+0u=!5dS&^3x1r%PHqGd0LG3srpeYyw$TftdP601P*$;XVsAH z;7RI0+fBWxuntkhOT`CPuU_UWQPXozcVGM7(!NMrDRiw^-Vycf+UHx}-u1xd z(#>}-_4V|2?~XJ@?~q?JFot~y!>2jp2F^Qu9+&wXEdX%Q_CN6otB0yg@8h=B8BW`d zi{Os)S#)bJqWRuV=1biQX};abe5pG$&G%R`U+S(=^ED>(rEaz@KKo^xV6^N_Ju0yH zY~9K7QqNEF6s0Tm zyj1W#ka^w~^f=EOwzC&=T=R*~@=xkPu_f1DFWa}|rXFnHPHyTky_Wm6i-5rZ}=VTudxxo zPe8u_B&GaTLr>x0MauiC$AaF^kl%he*g>3HOL>2)p=UHi-%Zh<7dzNH8uzZot-&F# zth)}7|adHLhAiK@HVth|a=_@pH573TLoAfEEdy4P&}YKzC_qzQe+;($GU1 z+OMG@4ShpHKh@AoG%O|GtD(&rYS+*O4SiojM{qVE>wZf^JMao>CNwqJfQCK;h`eF2 z(|}YBjr&IpeGG`s4&BT^&XIic0ZCjRASvYuP5ldvdq+e6qN#;AF_ThC0m-^;8hTVy zpVYWFG;~cvSsqQ8p{Alz6Uk5O+ycB=m`z| zBOuwD4Y^p>&DM}lL**K(*H9Rctox{jzOSK=G@lJ;SxT~o$~DvsNJ^nIFUj|WhW=bb z&ui$ch6*uP$hv+F^=arCKvLe9H10)>dr#vWc@|$TAStg%<2GnqpT-^1(0|v|H#9B> zr{7Y_JU~)|)f(5Vp-*ZELscxx+Y1}D|dqLyg(zr_+_p!!dQK8x`0wmil(YUgf zc6`kzuYVn9tksC0d^Rb(z~D73h8GDFKgM<|s=<8t!b&})6a#n;<0p6o?GWy?*@|PR zS7}=n$NUvAw1J9a{uUV8D#bD128K38am)xXwEc-=-UEgkFnVDg5X zYZG}A{=*NPuXvUx@s%a~cOS|Q;?G?eLCM$aN>6kUc<6uobSE?5=^qr2DR}7r`b@lj zrg+eakW+#CM7Ccm9&{^scH%zCrK+K$!9)McM^#E-^(Y>6J$SyHK#7C-iU+{}9_#gV zoKDbO#gi#`=>PYWBs1WtT=7tU+0;u6i^+C1K)cE1Dsc@KugL(&-pJC5khMvp7W>Nc!SVBk^iG{@GXpHtD;#xWvToyEL~t zf|Cu?w`kUxocL5#RZjc>GcGUw(WjOcNB!q?qEv>y@ReWhilfPJPY-=DBjDypM+D!1 Y(}^Q}9gdG1@plH|sV#z!80GW70n&*|e*gdg diff --git a/build/erpc_port_self.o b/build/erpc_port_self.o new file mode 100644 index 0000000000000000000000000000000000000000..07103e83d6f2a86897bd90e173d5875ff833472b GIT binary patch literal 35990 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 X0za$FwMX^@tcU1dTu7H#`?CK72)K15 literal 0 HcmV?d00001 diff --git a/build/list.o b/build/list.o index f195381c37955e6ae780ee9d095ee57cb6df7075..f613a8d0b959eaf51a6e019d7c64be9da308770b 100644 GIT binary patch literal 4271 zcmcInO>7&-6@J6r5m#DKqDWPiYR6p{ik+qw^%Gf^)i|cDFs5MH7VOGF1qU1ctRy<* zl30?G>>x#J)d2(ptyKsqQaFgwQx8!uJw!^0x*Q6Labt~RD>+6M-1R!_%BH+1Q0f0=G9m> zRY}$H_7meU^GPgSF7MY@k9~)DD~%5Ok?;qlo&^wxp?Iv+%-coY_uTwi(S&$|qm8zI zQ~?g*|1S-^@VUX^u?Aui$NCSg0YZPsdv2%!ByFM%U>xU;3eAh)jh+y?S3QgVZXj>k z<)JEhCr)}4(NbC)dIKbRW8)2A9JL2cyqWmm$x{uyd#F7^-ZeLF3+i!*pPNmteV$zX z`%rT2VmP@r+xtNnJN`zd$+g5za`lZJs0OzJsBbSM?;>({wl}#J7UILWm>85%hvc14 zsv#-Q?jU7*#Oqi~>~6QCvYWgc*U&Atu8bysl?s{6Xj>xi>Ssf*eEP-2JZEUqwnek{ z_ybDPjZID;CU(gD@w&t@3M5Y@daETlim%s2t#nCcMiUM&*>NE}BnPnFK#kN5IXrBP$A)7=#z3J`wXM^cqGOGql5#SOr|n{y@iSfs>Zb&DA8JmfF2|{NMTGQg}(egs$9E|wI)Ezaf%KE)d&U)bVR6Wou0b- zP4n^vPfA?5VhU*Ls(ER4dK#Ey5PtFO^z`LP^QE&>(}@=$0BvfpYL{~hwv{z!(Iove4aG+2^6lIa|OlHNl0{ z4P1)qh31Z&O&v3`LpM`}bpEw+?iTP92Pj~tSjh-jz>=J%mo_PttFi%h{}HAa7SDtw z50DaAhc0Pysg+Cu>-jDl_aLy#5!xhy^;dB`KSe1b+*6*(@+Fg1IsLGl|`I1M!26 zf%q{$khN^eAq73>-Pc_|BW~+v)7>M-yofOCVoz&PUC|C|T`Up|AHcMuOzF_|3H=-T zDV;^}&XX`V_IfPEy z`q9Y?m;mma(K@>`eb4vdj$>>pN;!m%z*KY)`5i8apF)3<)EQ%E`n-t8`lg~Zl6dcr z&h?RHnAdp?;7Q(9ABKR){`PN4`{@7d1?bjs{vtt~$K&|N{elGtQdjEF^*R`i(kcW8 zA;$jQ5yG0$GR8lfoER+R?1kmA(ZQARF>`Em0L1|TJvTC#vorZBu3VsngSQD5A<@Hx zj8n;4^X1qgIl_AFerB$vg=?{6kV!S6^iD2leb%{r+T;JrOA>MI;>+kdSo1C2v zwBWqdHb@1|Pfku4&$zQvDwcCA17&M*0Qc0;apPPym#-M{oY~V^By(w zzIZhGyi1bTgAotoUxg{m=Ud03lFDle@@-k9Zn;1`i1}cs{YH4`yBe7Ybxdul#sTb^9Tm!z0Ow|f7rTem!P-bocKaqfyc*QBevc22o34gwHw J9sjQc{tIt6{Luga 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 diff --git a/build/port_self.o b/build/port_self.o deleted file mode 100644 index 33c53e0fe4de0f5bba0bb253563ffc8c31cbacab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37593 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 F`CtD->Tm!6 diff --git a/config.h b/config.h index 9850bae..6237f32 100644 --- a/config.h +++ b/config.h @@ -9,6 +9,14 @@ #define u32 unsigned int #define UNUSED(x) (void)(x) + + +#define ERPC_DEBUG_ENABLE 1 +#if(ERPC_DEBUG_ENABLE == 1) #define ERPC_DEBUG(...) printf(__VA_ARGS__) -// #define ERPC_DEBUG(...) +#else +#define ERPC_DEBUG(...) +#endif + + #endif /* _CONFIG_H_ */ \ No newline at end of file diff --git a/crc16.c b/crc16.c index fd32d26..c125018 100644 --- a/crc16.c +++ b/crc16.c @@ -1,6 +1,6 @@ #include "crc16.h" -static const uint16_t crc16tab[256] = { +static const u16 crc16tab[256] = { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, @@ -31,38 +31,7 @@ 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 < (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; - u32 counter = 0; - crc = (crc << 8) ^ crc16tab[((crc >> 8) ^ cmd->head.src_id) & 0x00FF]; - crc = (crc << 8) ^ crc16tab[((crc >> 8) ^ cmd->head.dest_id) & 0x00FF]; - crc = (crc << 8) ^ crc16tab[((crc >> 8) ^ cmd->head.msg_len) & 0x00FF]; - crc = (crc << 8) ^ crc16tab[((crc >> 8) ^ cmd->head.type) & 0x00FF]; - crc = (crc << 8) ^ crc16tab[((crc >> 8) ^ cmd->head.port) & 0x00FF]; - for (counter = 0; counter < cmd->head.msg_len; counter++) - crc = (crc << 8) ^ crc16tab[((crc >> 8) ^ cmd->data[counter]) & 0x00FF]; - cmd->crc_16[0] = (u8)(crc >> 8); - cmd->crc_16[1] = (u8)(crc & 0x00FF); - return crc; -} -/** - * 检查crc16校验 - * return 0:校验成功 - * return 1:校验失败 - */ -u8 cmd_check_crc16(erpc_cmd_def_t *cmd) { - u16 crc = cmd_cal_crc16(cmd); - if (cmd->crc_16[0] != (u8)(crc >> 8) || - cmd->crc_16[1] != (u8)(crc & 0x00FF)) { - return 1; - } - return 0; -} \ No newline at end of file +inline u16 crc16_cal(u16 data,u16 crc) +{ + return (crc << 8) ^ crc16tab[((crc >> 8) ^ data) & 0x00FF]; +} diff --git a/crc16.h b/crc16.h index adb86fb..c722b4e 100644 --- a/crc16.h +++ b/crc16.h @@ -8,10 +8,8 @@ extern "C" { #include #include #include "config.h" -#include "erpc_core.h" -uint16_t crc16(const unsigned char *buf, size_t len); -u8 cmd_check_crc16(erpc_cmd_def_t *cmd); -u16 cmd_cal_crc16(erpc_cmd_def_t *cmd); +u16 crc16_cal(u16 data,u16 crc); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/erpc_core.c b/erpc_core.c index 05fb2ee..965dcec 100644 --- a/erpc_core.c +++ b/erpc_core.c @@ -1,614 +1,413 @@ #include "erpc_core.h" - #include "crc16.h" - -/** - * 操作系统相关 - */ - -erpc_sleep erpc_sleep_tick = NULL; - -static list_t erpc_hw; -void clean_cache(erpc_hw_cfg_t *hw) +#include "string.h" +void cal_crc16(erpc_msg_t *msg) { - 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++) - { - hw->send_cache[i].state = ERPC_CMD_NO_ERROR; - } + u16 crc = 0; + crc = crc16_cal(msg->src_id, crc); + crc = crc16_cal(msg->dest_id, crc); + crc = crc16_cal(msg->type, crc); + crc = crc16_cal(msg->len, crc); + for (int i = 0; i < msg->len; i++) + { + crc = crc16_cal(msg->data[i], crc); + } + msg->crc = crc; } -/** - * 注册 hardware 设备 - * 线程不安全 - */ -u32 erpc_hw_add(erpc_hw_cfg_t *hw) +u8 check_crc16(erpc_msg_t *msg) { - list_t *list = &erpc_hw; - 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) - { - return ERPC_ERR_MALLOC_ERROR; - } - list_node->data = (void *)hw; - u8 hw_ord = hw->ord; - // 检查hw是否已经存在 - while (list != NULL) - { - erpc_hw_cfg_t *hw_cfg = (erpc_hw_cfg_t *)list->data; - if (hw_cfg->ord == hw_ord) + u16 crc = 0; + crc = crc16_cal(msg->src_id, crc); + crc = crc16_cal(msg->dest_id, crc); + crc = crc16_cal(msg->type, crc); + crc = crc16_cal(msg->len, crc); + for (int i = 0; i < msg->len; i++) { - return ERPC_ERR_HW_EXIST; + crc = crc16_cal(msg->data[i], crc); } - list = list->next; - } - list_t *result = list_append(&erpc_hw, hw); - if (result == NULL) - { - return ERPC_ERR_MALLOC_ERROR; - } - clean_cache(hw); - return ERPC_NO_ERROR; -} -/** - * 注册命令列表 - * 线程不安全 - */ -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) - { - list->data = (void *)cmd_list; - return ERPC_NO_ERROR; - } - list = list_append(&hw->cmd_list, cmd_list); - if (list == NULL) - { - return ERPC_ERR_MALLOC_ERROR; - } - return ERPC_NO_ERROR; -} -/** - * 移除 hardware 设备 - * 线程不安全 - */ -u32 erpc_hw_remove(u8 hw) -{ - list_t *list = &erpc_hw; - if (list->data == NULL) - { - return ERPC_ERR_NOFOND_HW; - } - while (list != NULL) - { - erpc_hw_cfg_t *hw_cfg = (erpc_hw_cfg_t *)list->data; - if (hw_cfg->ord == hw) - { - list_delete(&erpc_hw, list); - free(list); - return ERPC_NO_ERROR; - } - list = list->next; - } - return ERPC_ERR_NOFOND_HW; -} -/** - * 获取 hardware 设备 - */ -erpc_hw_cfg_t *erpc_hw_get(u8 hw) -{ - list_t *list = &erpc_hw; - if (list->data == NULL) - { - return NULL; - } - while (list != NULL) - { - erpc_hw_cfg_t *hw_cfg = (erpc_hw_cfg_t *)list->data; - 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) -{ - 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) - { - // ERPC_DEBUG("find send cache %d\n", i); - cache_ord = i; - break; - } - } - - CHECK_IF_ERROR(cache_ord == 255, ERPC_ERR_SEND_CACHE_FULL); - // 准备数据 - hw_cfg->send_cache[cache_ord].state = ERPC_CMD_DATA_DEAL; - erpc_cmd_def_t *cmd = - (erpc_cmd_def_t *)&hw_cfg->send_cache[cache_ord].data[0]; - cmd->head.dest_id = dest_id; - cmd->head.port = port; - cmd->head.msg_len = len; - 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) - { - for (int i = 0; i < len; i++) - { - cmd->data[i] = data[i]; - } - } - // 计算校验和 - cmd_cal_crc16(cmd); - - // 发送数据 - 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) - { - break; - } - if (hw_cfg->send_cache[cache_ord].state == ERPC_CMD_DEST_BUSY) - { - return ERPC_ERR_DEST_BUSY; - } - if (erpc_sleep_tick != NULL) - { - erpc_sleep_tick(1); - } - wait_time--; - } - u32 ret = ERPC_NO_ERROR; - do - { - if (wait_time == 0) - { - printf("send timeout,state:%d\n", hw_cfg->send_cache[cache_ord].state); - ret = ERPC_ERR_SEND_TIMEOUT; - break; - } - 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) - { - ret = ERPC_ERR_DEST_NO_RESPONSE; - break; - } - } while (0); - hw_cfg->send_cache[cache_ord].state = ERPC_CMD_NO_ERROR; - return ret; -} -u32 erpc_boardcast(u16 port, u8 *data, u16 len) -{ - list_t *list = &erpc_hw; - if (list->data == NULL) - { - return ERPC_ERR_NOFOND_HW; - } - while (list != NULL) - { - erpc_hw_cfg_t *hw_cfg = (erpc_hw_cfg_t *)list->data; - 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) - { - // ERPC_DEBUG("find send cache %d\n", i); - cache_ord = i; - break; - } - } - if (cache_ord == 255) - { - continue; - } - // 准备数据 - hw_cfg->send_cache[cache_ord].state = ERPC_CMD_DATA_DEAL; - erpc_cmd_def_t *cmd = - (erpc_cmd_def_t *)&hw_cfg->send_cache[cache_ord].data[0]; - cmd->head.dest_id = ERPC_BOARDCAST_ID; - cmd->head.port = port; - cmd->head.src_id = hw_cfg->local_id; - cmd->head.msg_len = len; - if (data == NULL) - { - cmd->head.msg_len = 0; - } - if (len > 0 && data != NULL) - { - for (int i = 0; i < len; i++) - { - cmd->data[i] = data[i]; - } - } - // 计算校验和 - cmd_cal_crc16(cmd); - hw_cfg->send_cache[cache_ord].state = ERPC_CMD_WAIT_SEND; - } + return crc == msg->crc; } -u32 erpc_send(u8 hw, u8 dest_id, u16 port, u8 *data, u16 len) +static erpc_cache_t *find_free_cache(erpc_hw_t *hw) { - 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); - return ret; -} - -u32 erpc_wait_resp_package(u8 hw, u8 dest_id, u16 port, u8 *reply_data, - 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++) + for (int i = 0; i < ERPC_MSG_CACHE_SIZE; i++) { - erpc_data_cache_t *rec_cahce = &hw_cfg->rec_cache[i]; - 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) - { - continue; - } - if (cmd->head.src_id != dest_id) - { - continue; - } - 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) + + if (hw->send_cache[i].state == CACHE_FREE) { - *reply_len = cmd->head.msg_len; + return &hw->send_cache[i]; } - } - rec_cahce->state = ERPC_CMD_NO_ERROR; - return ERPC_NO_ERROR; } - if (erpc_sleep_tick != NULL) + return NULL; +} +// static erpc_cache_t *clean_ack_cache(erpc_hw_t *hw, u8 dest_id) +// { +// return NULL; +// } +static erpc_cache_t *find_ack_cache(erpc_hw_t *hw, u8 dest_id, u16 port) +{ + for (int i = 0; i < ERPC_MSG_CACHE_SIZE; i++) { - erpc_sleep_tick(1); - } - time_out--; - } - CHECK_IF_ERROR(time_out == 0, ERPC_ERR_DEST_NO_REPLY); - 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) -{ - u32 ret = erpc_send(hw, dest_id, port, data, len); - if (reply_len != NULL) - { - *reply_len = 0; - } - CHECK_IF_ERROR(ret != ERPC_NO_ERROR, ret); - 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) -{ - erpc_hw_cfg_t *hw_cfg = erpc_hw_get(hw); - 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) - { - 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(); - u8 ret = hw->write((u8 *)hw->send_cache[i].data, len); - hw->send_unlock(); - CHECK_IF_ERROR(ret != 0, ERPC_ERR_HW_SEND_FAIL); - hw->send_cache[i].state = ERPC_CMD_SEND_ONCE; - } - } - 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++) - { - if (hw->send_cache[i].state == ERPC_CMD_SEND_ONCE || - 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) - { - hw->send_cache[i].state = ERPC_CMD_SEND_OK; - return ERPC_NO_ERROR; - } - } - } - return ERPC_NO_ERROR; -} -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; - cmd_send.head.msg_len = 0; - cmd_send.head.type = PACKAGE_TYPE_CMD_RESP_ACK; - cmd_send.head.src_id = hw->local_id; - cmd_cal_crc16(&cmd_send); - u32 len = sizeof(erpc_cmd_head_t) + 2 + cmd_send.head.msg_len; - hw->send_lock(); - u8 ret = hw->write((u8 *)&cmd_send, len); - hw->send_unlock(); - CHECK_IF_ERROR(ret != 0, ERPC_ERR_HW_SEND_FAIL); - 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++) - { - if (hw->send_cache[i].state == ERPC_CMD_SEND_ONCE || - 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) - { - 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); // - return ERPC_NO_ERROR; - } - } - } - return ERPC_NO_ERROR; -} -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; - cmd_send.head.msg_len = 0; - cmd_send.head.type = PACKAGE_TYPE_CMD_REQ_ACK; - cmd_send.head.src_id = hw->local_id; - cmd_cal_crc16(&cmd_send); - u32 len = sizeof(erpc_cmd_head_t) + 2 + cmd_send.head.msg_len; - hw->send_lock(); - u8 ret = hw->write((u8 *)&cmd_send, len); - hw->send_unlock(); - CHECK_IF_ERROR(ret != 0, ERPC_ERR_HW_SEND_FAIL); - 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) - { - hw->deal_lock(); - if (hw->rec_cache[i].state == ERPC_CMD_WAIT_SERVER_DEAL) - { - hw->rec_cache[i].state = ERPC_CMD_SERVER_DEAL; - } - else - { - hw->deal_unlock(); - continue; - } - hw->deal_unlock(); - // 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) - { - hw->rec_cache[i].state = ERPC_CMD_NO_ERROR; - continue; - } - // 丢弃不是本地数据包 - 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: - 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; - - 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() -{ - list_t *list = &erpc_hw; - if (list->data == NULL) - { - return; - } - 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) -{ - 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) - { - // 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; - } - } - return ERPC_ERR_REC_CACHE_FULL; -} -void erpc_send_deal_core() -{ - list_t *list = &erpc_hw; - if (list->data == NULL) - { - return; - } - while (list != NULL) - { - erpc_hw_cfg_t *hw = (erpc_hw_cfg_t *)list->data; - erpc_send_data(hw); - } - if (erpc_sleep_tick != NULL) - { - erpc_sleep_tick(1); - } -} - -void erpc_rev_deal_core() -{ - list_t *list = &erpc_hw; - if (list->data == NULL) - { - return; - } - 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) - { - continue; - } + erpc_cache_t *cache = &hw->send_cache[i]; + if (cache->state == CACHE_REC_ACK && cache->msg.src_id == dest_id && cache->msg.port == port) + { + return cache; } - { // 多线程下,抢占处理权限 - hw->deal_lock(); - if (hw->rec_cache[j].state == ERPC_CMD_WAIT_TASK_DEAL) - { - // 获取指令的处理权限 - hw->rec_cache[j].state = ERPC_CMD_WAIT_TASK_DEAL_FINISH; - } - else - { - // 已经有线程抢先执行了 - hw->deal_unlock(); - continue; - } - hw->deal_unlock(); - } - { // 处理指令 - // 搜索指令列表 - list_t *cmd_list = &hw->cmd_list; - // 链表是空的 - 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) - { // 搜索指令列表 - erpc_cmd_list_t *cmd_obj = (erpc_cmd_list_t *)cmd_list->data; - if (cmd_obj->cmd == cmd_def->head.port) + } + return NULL; +} +static u8 check_port_send_available(erpc_hw_t *hw, u8 port) +{ + for (int i = 0; i < ERPC_MSG_CACHE_SIZE; i++) + { + erpc_cache_t *cache = &hw->send_cache[i]; + if (cache->state != CACHE_FREE) + { + if (cache->msg.port == 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, - cmd_def->data, cmd_def->head.msg_len); - } - - break; + return 0; } - cmd_list = cmd_list->next; - } } - // 处理完成 丢弃缓存 , 无论是否执行指令,都需要把数据包丢弃 - hw->rec_cache[j].state = ERPC_CMD_NO_ERROR; - } } - list = list->next; - } - if (erpc_sleep_tick != NULL) - { - erpc_sleep_tick(1); - } + return 1; } +static void free_port_ack_cache(erpc_hw_t *hw, u16 port) +{ + for (int i = 0; i < ERPC_MSG_CACHE_SIZE; i++) + { + erpc_cache_t *cache = &hw->recv_cache[i]; + if (cache->state == CACHE_REC_ACK) + { + if (cache->msg.port == port) + { + cache->state = CACHE_FREE; + } + } + } +} +static u32 send_data(erpc_hw_t *hw, erpc_cache_t *cache, u16 port, u16 *timeout) +{ + free_port_ack_cache(hw, port); + cache->state = CACHE_WAIT_SEND; + // 等待发送完成 + while (*timeout) + { + if (cache->state == CACHE_SEND_OK) + { + return 0; + } + else if (cache->state == CACHE_SEND_HW_ERR) + { + return ERPC_ERR_SEND_HW_ERR; + } + else + { + hw->sleep(1); + } + (*timeout)--; + } + + if (*timeout == 0) + { + return ERPC_ERR_SEND_TIMEOUT; + } + return 0; +} +static u32 wait_ack(erpc_hw_t *hw, erpc_cache_t *rec, u8 dest_id, u16 port, u16 *timeout) +{ + while (*timeout) + { + rec = find_ack_cache(hw, dest_id, port); + if (rec != NULL) + { + return 0; + } + hw->sleep(1); + (*timeout)--; + } + if (timeout == 0) + { + return ERPC_ERR_SEND_ACK_TIMEOUT; + } + return 0; +} + u32 send_request(erpc_hw_t *hw, u8 dest_id, u16 port, u8 *data, u16 len, u16 timeout, u8 retry) +{ + erpc_cache_t *cache = find_free_cache(hw); + CHECK_DEAL(cache == NULL, ERPC_ERR_NO_FREE_SEND_CACHE); + hw->lock(); + if (check_port_send_available(hw, port) == 0) + { + hw->unlock(); + return ERPC_ERR_SEND_PORT_IS_INUSE; + } + cache->msg.dest_id = dest_id; + cache->state = CACHE_IN_USE; + hw->unlock(); + cache->msg.src_id = hw->local_id; + cache->msg.type = ERPC_MSG_TYPE_REQUEST; + cache->msg.len = len; + cache->msg.port = port; + memcpy(cache->msg.data, data, len); + cal_crc16(&cache->msg); + erpc_cache_t *rec = NULL; + u16 timeout_copy = timeout; + while (retry--) + { + /** + * 发送失败应该立即返回,不能retry + */ + u32 ret = send_data(hw, cache, port, &timeout); + if (ret) + { + cache->state = CACHE_FREE; + return ret; + } + // 等待ack + ret = wait_ack(hw, rec, dest_id, port, &timeout); + if (ret == 0) + { + break; + } + timeout = timeout_copy; + } + CHECK_DEAL(retry == 0, ERPC_ERR_SEND_ACK_TIMEOUT); + // 释放cache + cache->state = CACHE_FREE; + rec->state = CACHE_FREE; + return 0; +} + +static erpc_cache_t *find_response_cache(erpc_hw_t *hw, u8 dest_id, u16 port) +{ + for (int i = 0; i < ERPC_MSG_CACHE_SIZE; i++) + { + erpc_cache_t *cache = &hw->recv_cache[i]; + if (cache->state == CACHE_GET_RESP && cache->msg.src_id == dest_id && cache->msg.port == port) + { + return cache; + } + } + return NULL; +} +static void free_response_cache(erpc_hw_t *hw, u8 dest_id, u16 port) +{ + for (int i = 0; i < ERPC_MSG_CACHE_SIZE; i++) + { + erpc_cache_t *cache = &hw->recv_cache[i]; + if (cache->state == CACHE_GET_RESP && cache->msg.src_id == dest_id && cache->msg.port == port) + { + cache->state = CACHE_FREE; + } + } +} +static u32 send_ack(erpc_hw_t *hw, u8 dest_id, u16 port, u16 time_out) +{ + erpc_cache_t *cache = find_free_cache(hw); + CHECK_DEAL(cache == NULL, ERPC_ERR_NO_FREE_SEND_CACHE); + hw->lock(); + if (check_port_send_available(hw, port) == 0) + { + hw->unlock(); + return ERPC_ERR_SEND_PORT_IS_INUSE; + } + cache->msg.dest_id = dest_id; + cache->state = CACHE_IN_USE; + hw->unlock(); + cache->msg.src_id = hw->local_id; + cache->msg.type = ERPC_MSG_TYPE_ACK; + cache->msg.len = 0; + cache->msg.port = port; + cal_crc16(&cache->msg); + u32 ret = send_data(hw, cache, port, &time_out); + return ret; +} +/** + * 发送请求,等待响应 + * @param hw 硬件接口 + * @param dest_id 目标ID + * @param port 端口号 + * @param data_out 请求数据 + * @param len_out 请求数据长度 + * @param data_in 响应数据 + * @param len_in 响应数据长度 + * @param send_timeout 发送超时时间 + * @param recv_timeout 接收超时时间 + * @param retry 重试次数 + * @return 0 成功,其他失败 + */ + u32 send_request_wait_response(erpc_hw_t *hw, u8 dest_id, u16 port, u8 *data_out, u16 len_out, u8 *data_in, u16 *len_in, u16 send_timeout, u16 recv_timeout, u8 retry) +{ + free_response_cache(hw, dest_id, port); + u32 ret = send_request(hw, dest_id, port, data_out, len_out, send_timeout, retry); + CHECK_DEAL(ret != 0, ret); + while (recv_timeout) + { + erpc_cache_t *rec = find_response_cache(hw, dest_id, port); + if (rec != NULL) + { + // 拷贝数据 + int len = rec->msg.len; + if (len > *len_in) + { + len = *len_in; + } + memcpy(data_in, rec->msg.data, len); + *len_in = len; + rec->state = CACHE_FREE; + break; + } + recv_timeout--; + hw->sleep(1); + } + CHECK_DEAL(recv_timeout == 0, ERPC_ERR_NO_CMD_RETURN); + ret = send_ack(hw, dest_id, port, send_timeout); + CHECK_DEAL(ret != 0, ret); + return 0; +} + + u32 send_response(erpc_hw_t *hw, erpc_cache_t *cache_rec, u8 *data, u16 len, u16 timeout, u8 retry) +{ + erpc_cache_t *cache = find_free_cache(hw); + CHECK_DEAL(cache == NULL, ERPC_ERR_NO_FREE_SEND_CACHE); + hw->lock(); + if (check_port_send_available(hw, cache->msg.port) == 0) + { + hw->unlock(); + return ERPC_ERR_SEND_PORT_IS_INUSE; + } + cache->msg.dest_id = cache_rec->msg.src_id; + cache->state = CACHE_IN_USE; + hw->unlock(); + cache->msg.src_id = hw->local_id; + cache->msg.type = ERPC_MSG_TYPE_ACK; + cache->msg.len = 0; + cache->msg.port = cache_rec->msg.port; + memcpy(cache->msg.data, data, len); + cal_crc16(&cache->msg); + u16 timeout_copy = timeout; + erpc_cache_t *rec = NULL; + while (retry--) + { + u32 ret = send_data(hw, cache, cache->msg.port, &timeout); + if (ret) + { + cache->state = CACHE_FREE; + return ret; + } + // 等待ack + ret = wait_ack(hw, rec,cache->msg.dest_id,cache->msg.port, &timeout); + if (ret == 0) + { + break; + } + timeout = timeout_copy; + } + CHECK_DEAL(retry == 0, ERPC_ERR_SEND_ACK_TIMEOUT); + // 释放cache + cache->state = CACHE_FREE; + rec->state = CACHE_FREE; + return 0; +} + +u32 write_rec_cache(erpc_hw_t *hw, u8 *data, u16 len) +{ + for (int i = 0; i < ERPC_MSG_CACHE_SIZE; i++) + { + if (hw->recv_cache[i].state == CACHE_FREE) + { + hw->lock(); + u8 *data_in = (u8 *)&hw->recv_cache[i].msg; + for (int j = 0; j < len; j++) + { + data_in[j] = data[j]; + } + hw->recv_cache[i].state = CACHE_GET_DATA; + hw->unlock(); + return 0; + } + + } + return 1; +} + void send_core(erpc_hw_t *hw) +{ + for (int i = 0; i < ERPC_MSG_CACHE_SIZE; i++) + { + erpc_cache_t *cache = &hw->send_cache[i]; + if (cache->state == CACHE_WAIT_SEND) + { + u32 ret = hw->send((u8 *)&cache->msg, cache->msg.len + ERPC_MSG_HEADER_SIZE); + if (ret == 0) + { + cache->state = CACHE_SEND_OK; + } + else + { + cache->state = CACHE_SEND_HW_ERR; + } + } + } +} + + void recv_core(erpc_hw_t *hw) +{ + for (int i = 0; i < ERPC_MSG_CACHE_SIZE; i++) + { + erpc_cache_t *cache = &hw->recv_cache[i]; + if (cache->state == CACHE_GET_DATA) + { + if (check_crc16(&cache->msg) == 1) + { + cache->state = CACHE_GET_MSG; + } + else + { + cache->state = CACHE_FREE; + } + } + switch (cache->state) + { + case CACHE_GET_MSG: + { + switch (cache->msg.type) + { + case ERPC_MSG_TYPE_ACK: + { + cache->state = CACHE_REC_ACK; + } + break; + case ERPC_MSG_TYPE_RESPONSE: + { + cache->state = CACHE_GET_RESP; + } + break; + case ERPC_MSG_TYPE_REQUEST: + { + cache->state = CACHE_WAIT_HANDLE; + } + break; + default: + break; + } + } + break; + + default: + break; + } + } +} + +void recv_handle(erpc_hw_t *hw) +{ + for (int i = 0; i < ERPC_MSG_CACHE_SIZE; i++) + { + erpc_cache_t *cache = &hw->recv_cache[i]; + if (cache->state == CACHE_WAIT_HANDLE) + { + + cache->state = CACHE_FREE; + } + } +} \ No newline at end of file diff --git a/erpc_core.h b/erpc_core.h index 0f19aaf..280997a 100644 --- a/erpc_core.h +++ b/erpc_core.h @@ -1,145 +1,110 @@ -#ifndef ERPC_CORE_H_ -#define ERPC_CORE_H_ - -#include -#include -#include - +#ifndef _ERPC_CORE_H_ +#define _ERPC_CORE_H_ #include "config.h" #include "list.h" -#define ERPC_VERSION "0.0.1" +#define ERPC_VERSION_MAJOR 1 +#define ERPC_VERSION_MINOR 0 +#define ERPC_VERSION_PATCH 0 -typedef enum package_type { - PACKAGE_TYPE_DEV_POWER_ON = 0, - PACKAGE_TYPE_CMD_REQ, - PACKAGE_TYPE_CMD_REQ_ACK, - PACKAGE_TYPE_CMD_RESP, - PACKAGE_TYPE_CMD_RESP_ACK, - PACKAGE_TYPE_CMD_REPEAT, // crc校验失败,请求重发 - PACKAGE_TYPE_DEV_POWER_OFF, - PACKAGE_TYPE_CMD_SERCH_DEV_ONLINE, -} package_type; +#define ERPC_MSG_HEADER_SIZE 9 +#define ERPC_MSG_DATA_MAX_SIZE (256 - ERPC_MSG_HEADER_SIZE + 2) +#define ERPC_MSG_CACHE_SIZE 16 // Maximum number of messages in cache -// 广播ID -#define ERPC_BOARDCAST_ID 0xff +#define ERPC_SEND_TIMEOUT 30 // 发送超时时间,单位tick +typedef struct erpc_msg_t +{ + u8 src_id; + u8 dest_id; + u8 type; + u16 port; + u16 len; + u16 crc; + u8 data[ERPC_MSG_DATA_MAX_SIZE]; +} erpc_msg_t; -typedef struct erpc_cmd_head_t { - u8 src_id; - u8 dest_id; - u8 type; // package_type - u16 port; // 指令号,指令号=端口号 - 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[MAX_CMD_LEN]; -} erpc_cmd_def_t; - -#define CMD_MAX_RETRY 5 // 最大重发次数 -#define CMD_TIMEOUT 30 // 超时时间 tick -#define MAX_REC_CMD_CACHE_NUM \ - 10 // 最大接收指令缓存数量,接受指令优先级>处理指令优先级 -#define MAX_SEND_CMD_CACHE_NUM \ - 10 // 最大发送指令缓存数量,发送指令优先级>接收指令优先级 -typedef enum erpc_status { - ERPC_CMD_NO_ERROR, // 发送cache,接收cache空闲 - ERPC_CMD_DATA_DEAL, // 发送cache数据组织中 - ERPC_CMD_WAIT_SERVER_DEAL, // 等待服务线程处理接受cache - ERPC_CMD_SERVER_DEAL, // 服务线程处理接受cache - ERPC_CMD_WAIT_TASK_DEAL, // 等待任务线程处理指令 - ERPC_CMD_WAIT_TASK_DEAL_FINISH, // 等待任务线程处理指令完成 - ERPC_CMD_WAIT_SEND, // 等待服务线程处理发送cache - ERPC_CMD_SEND_ONCE, // 发送指令成功 - ERPC_CMD_SEND_REPEAT, // 发送指令重发 - ERPC_CMD_SEND_OK, // 发送指令成功 - ERPC_CMD_DEST_BUSY, // 目标设备忙 - ERPC_CMD_RESP_OK, // 指令响应成功 -} erpc_status; - -typedef struct erpc_data_cache_t { - u8 state; - u8 data[256]; -} erpc_data_cache_t; - -typedef u32 (*erpc_cmd_handle_t)(u8 src_id, u8 dest_id, u16 port, u8 *data, - u16 len); - -typedef struct erpc_cmd_list_t { - u16 cmd; - u32 (*handle)(u8 hw, u8 src_id, u8 dest_id, u16 port, u8 *data, u16 len); -} erpc_cmd_list_t; -typedef enum ERPC_ROLE { - ERPC_ROLE_MASTER, - ERPC_ROLE_SLAVE, -} ERPC_ROLE; -typedef struct erpc_hw_cfg_t { - u8 ord; - u8 local_id; - u8 (*write)(u8 *data, u16 len); - void (*send_lock)(void); - void (*send_unlock)(void); - erpc_data_cache_t rec_cache[MAX_REC_CMD_CACHE_NUM]; - erpc_data_cache_t send_cache[MAX_SEND_CMD_CACHE_NUM]; - void (*deal_lock)(void); - void (*deal_unlock)(void); - list_t cmd_list; -} erpc_hw_cfg_t; - -#define CHECK_IF_ERROR(condition, error) \ - if (condition) { \ - return error; \ - } -#define CHECK_IF_ERROR_AND_DO(condition, error, action) \ - if (condition) { \ - action; \ - return error; \ - } -typedef enum erpc_error { - ERPC_NO_ERROR = 0, - ERPC_ERR_NOFOND_HW, - ERPC_ERR_SEND_CACHE_FULL, - ERPC_ERR_SEND_TIMEOUT, - ERPC_ERR_HW_SEND_FAIL, // 硬件层发来的错误 erpc_hw_cfg_t.write返回错误 - ERPC_ERR_DEST_BUSY, - ERPC_ERR_DEST_NO_RESPONSE, // 目标设备无响应 - ERPC_ERR_DEST_NO_REPLY, // 目标设备无回复或者回复超时 - ERPC_ERR_MALLOC_ERROR, // malloc失败,内存不足 - ERPC_ERR_HW_EXIST, // 硬件已经存在 - ERPC_ERR_HW_NOT_EXIST, // 硬件不存在 - ERPC_ERR_REC_CACHE_FULL, // 接收缓存满 +typedef struct erpc_cache_t +{ + u8 state; + erpc_msg_t msg; +} erpc_cache_t; +typedef enum erpc_msg_type +{ + ERPC_MSG_TYPE_REQUEST = 0, + ERPC_MSG_TYPE_ACK, + ERPC_MSG_TYPE_RESPONSE, +}erpc_msg_type; +typedef enum erpc_cache_state +{ + CACHE_FREE = 0, + // 占用 + CACHE_IN_USE, + // 发送cache + CACHE_WAIT_SEND, + CACHE_SEND_OK, + CACHE_SEND_HW_ERR, + // 接收cache + CACHE_GET_DATA, // 发现数据 + CACHE_GET_MSG, // 发现完整消息 + CACHE_REC_ACK, // 收到ACK + CACHE_GET_RESP, // 收到RESP数据包 + CACHE_WAIT_HANDLE, // 等待处理 +} erpc_cache_state; +typedef enum erpc_error +{ + ERPC_OK = 0, + // 发送REQ + ERPC_ERR_NO_FREE_SEND_CACHE, // 没有空闲的发送缓存 + ERPC_ERR_SEND_TIMEOUT, // 发送REQ超时 + ERPC_ERR_SEND_ACK_TIMEOUT, // 发送REQ成功,但是没有收到ACK + ERPC_ERR_SEND_PORT_IS_INUSE, // 发送失败,端口已被占用 + ERPC_ERR_SEND_HW_ERR, // 发送失败,硬件错误 + // 接收REQ + ERPC_ERR_NO_CMD_RETURN, // 发生REQ成功,但是没有收到RESP包 } erpc_error; -typedef void (*erpc_sleep)(u32 tick); +typedef struct erpc_hw_t +{ + u8 local_id; + void (*lock)(void); + void (*unlock)(void); + void (*sleep)(u32 ms); + u32 (*send)(u8 *data, u16 len); + erpc_cache_t send_cache[ERPC_MSG_CACHE_SIZE]; + erpc_cache_t recv_cache[ERPC_MSG_CACHE_SIZE]; + list_t handler_list; +} erpc_hw_t; -void erpc_send_deal_core(); // 发送指令处理线程 -u32 erpc_set_rev_cahce(u8 hw, u8 *data, u16 len); // 写入接受缓存 -void erpc_rev_package_core(); // 处理接受到的包,通讯层面处理 -void erpc_rev_deal_core(); // 处理接受到的指令,业务层面处理 -extern erpc_sleep erpc_sleep_tick; +typedef struct handler_list_t +{ + u16 port; + void (*handle)(erpc_hw_t *hw, erpc_cache_t *cache, u8 *data, u16 len); +} handler_list_t; -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); +#define CHECK_DEAL(condition, error) \ + if ((condition)) \ + return error; /** - * 单纯发送消息 + * 内核函数,需要手动sleep */ -u32 erpc_send(u8 hw, u8 dest_id, u16 port, u8 *data, u16 len); -/** - * 发送消息并等待回复 - */ -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); +void send_core(erpc_hw_t *hw); +void recv_core(erpc_hw_t *hw); +void recv_handle(erpc_hw_t *hw); /** - * 广播消息 + * 用户函数 */ -u32 erpc_boardcast(u16 port, u8 *data, u16 len); +u32 send_request(erpc_hw_t *hw, u8 dest_id, u16 port, u8 *data, u16 len, u16 timeout, u8 retry); +u32 send_request_wait_response(erpc_hw_t *hw, u8 dest_id, u16 port, u8 *data_out, u16 len_out, u8 *data_in, u16 *len_in, u16 send_timeout, u16 recv_timeout, u8 retry); +u32 send_response(erpc_hw_t *hw, erpc_cache_t *cache, u8 *data, u16 len, u16 timeout, u8 retry); +u32 write_rec_cache(erpc_hw_t *hw, u8 *data, u16 len); +/** + * 注册处理函数 + */ +#define EXPORT_ERPC_HANDLE(hw, _port, _handle) \ + static handler_list_t _A##_handle = \ + { \ + .port = _port,\ +.handle = _handle,\ +};\ +EXPORT_LIST_NODE(hw.list,_A##_handle); - -#endif /* ERPC_CORE_H_ */ \ No newline at end of file +#endif /* _ERPC_CORE_H_ */ \ No newline at end of file diff --git a/erpc_net.c b/erpc_net.c deleted file mode 100644 index 3c9b91f..0000000 --- a/erpc_net.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "erpc_net.h" -#include "erpc_core.h" - diff --git a/erpc_net.h b/erpc_net.h deleted file mode 100644 index 3d38351..0000000 --- a/erpc_net.h +++ /dev/null @@ -1,3 +0,0 @@ -#include "erpc_core.h" - -u32 erpc_find_all(); \ No newline at end of file diff --git a/erpc_port_self.c b/erpc_port_self.c new file mode 100644 index 0000000..372a0d3 --- /dev/null +++ b/erpc_port_self.c @@ -0,0 +1,104 @@ +#include "erpc_core.h" + +#include +#include + +HANDLE hMutex; + +static void lock() +{ + WaitForSingleObject(hMutex, INFINITE); +} + +static void unlock() +{ + ReleaseMutex(hMutex); +} +static void sleep(u32 ms) +{ + Sleep(ms); +} +extern erpc_hw_t port_self; +static u32 erpc_send(u8 *data, u16 len) +{ + write_rec_cache(&port_self,data,len); +} +erpc_hw_t port_self = { + .lock = lock, + .unlock = unlock, + .sleep = sleep, + .local_id = 0x12, + .send = erpc_send, +}; + + +static void test1(){ + +} +DWORD WINAPI fun(LPVOID lpParam) +{ + UNUSED(lpParam); + while (1) + { + Sleep(1000); + } +} +DWORD WINAPI send_thread(LPVOID lpParam) +{ + UNUSED(lpParam); + while (1) + { + send_core(&port_self); + Sleep(1); + } +} +DWORD WINAPI recv_thread(LPVOID lpParam) +{ + UNUSED(lpParam); + while (1) + { + recv_core(&port_self); + Sleep(1); + } +} + +DWORD WINAPI recv_handle_thread(LPVOID lpParam) +{ + UNUSED(lpParam); + while (1) + { + recv_handle(&port_self); + Sleep(1); + } +} + +int main() +{ + hMutex = CreateMutex(NULL, FALSE, TEXT("MyMutex")); + + if (hMutex == NULL) + { + printf("CreateMutex error: %d\n", GetLastError()); + return 1; + } + + HANDLE hThreads[4]; + + hThreads[0] = CreateThread(NULL, 0, fun, NULL, 0, NULL); + hThreads[1] = CreateThread(NULL, 0, send_thread, NULL, 0, NULL); + hThreads[2] = CreateThread(NULL, 0, recv_thread, NULL, 0, NULL); + hThreads[3] = CreateThread(NULL, 0, recv_handle_thread, NULL, 0, NULL); + // 等待所有线程完成 + WaitForMultipleObjects(4, hThreads, TRUE, INFINITE); + + // 关闭线程句柄 + for (int i = 0; i < 4; i++) + { + CloseHandle(hThreads[i]); + } + + // 关闭Mutex句柄 + CloseHandle(hMutex); + + return 0; +} diff --git a/erpc设计文档.md b/erpc设计文档.md deleted file mode 100644 index f7d5498..0000000 --- a/erpc设计文档.md +++ /dev/null @@ -1,39 +0,0 @@ - -## 协议设计 - -### 指令通讯 -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 392318c..2638010 100644 --- a/list.c +++ b/list.c @@ -1,90 +1,86 @@ #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)); - if (node == NULL) - { - return NULL; - } - node->data = data; - node->next = NULL; - return node; -} +#include +#include -list_t *list_append(list_t *head, void *data) +int list_node_add(list_t *list, void *data) { - list_t *node = list_create(data); - if (node == NULL) + list_node_t *new_node = (list_node_t *)malloc(sizeof(list_node_t)); + if (new_node == NULL) { - return NULL; + return LIST_ERR_MALLOC_FAILED; } - if (head == NULL) + new_node->data = data; + new_node->next = NULL; + if (*list == NULL) { - return NULL; + *list = new_node; } else { - list_t *tail = head; - while (tail->next != NULL) + list_node_t *node = *list; + while (node->next != NULL) { - tail = tail->next; + node = node->next; } - tail->next = node; + node->next = new_node; } - return head; -} -void list_print(list_t *head) -{ - list_t *node = head; - while (node != NULL) - { - ERPC_DEBUG("%p\n", node->data); - node = node->next; - } + return LIST_OK; } - -/** - * Destroy a list and all its nodes. - * @param head The head of the list. - */ -void list_destroy(list_t *head) +int list_node_remove(list_t *list, void *data) { - list_t *node = head; - while (node != NULL) + if (*list == NULL) { - list_t *next = node->next; - free(node); - node = next; + return LIST_ERR_LIST_IS_NULL; } -} -/** - * Delete a node from the list. - * @param head The head of the list. - */ -void list_delete(list_t *head, void *data) -{ - list_t *node = head; - list_t *prev = NULL; + list_node_t *node = *list; + list_node_t *prev = NULL; while (node != NULL) { if (node->data == data) { if (prev == NULL) { - head = node->next; + if (node->next != NULL) + { + *list = node->next; + } + else + { + *list = NULL; + } } else { - prev->next = node->next; + if (node->next != NULL) + { + prev->next = node->next; + } + else + { + prev->next = NULL; + } } free(node); - return; + return LIST_OK; } prev = node; node = node->next; } + return 0; +} +int list_size(list_t *list) +{ + if (*list == NULL) + { + return -1; + } + int size = 0; + list_node_t *node = *list; + while (node != NULL) + { + size++; + node = node->next; + } + return size; } diff --git a/list.h b/list.h index 786051e..d5877fb 100644 --- a/list.h +++ b/list.h @@ -1,17 +1,47 @@ -#ifndef _LIST_H_ -#define _LIST_H_ +#ifndef LIST_H +#define LIST_H +#ifdef __cplusplus +extern "C" +{ +#endif // __cplusplus + typedef struct list_node_t + { + void *data; + struct list_node_t *next; + } list_node_t; + typedef list_node_t *list_t; + typedef enum list_error + { + LIST_OK = 0, + LIST_ERR_LIST_IS_NULL = 1, + LIST_ERR_MALLOC_FAILED, + } list_error; + /** + * @brief 创建一个节点,如果list为NULL,则创建一个空链表,否则创建一个节点并添加到链表尾部 + * @param list 链表指针 + * @param data 数据指针 + */ + int list_node_add(list_t *list, void *data); + /** + * @brief 从链表中删除节点 + * @param list 链表指针 + * @param data 数据指针 + */ + int list_node_remove(list_t *list, void *data); + int list_size(list_t *list); -typedef struct list_t { - void *data; - struct list_t *next; -} list_t; - -list_t *list_create(void *data); -list_t *list_append(list_t *head, void *data); -void list_print(list_t *head); -void list_destroy(list_t *head); -void list_delete(list_t *head, void *data); - - -#endif /* _LIST_H_ */ \ No newline at end of file +/** + * @param list 链表 + * @param data 要添加的数据不要取地址,在宏定义里面自动取地址 + * @warning 这种方式增加节点,会导致无法确定节点添加的先后顺序,更换编译环境后可能会影响编译效率 + */ +#define EXPORT_LIST_NODE(list, data) \ + int __attribute__((constructor)) export_list_node_##list_##data(void) \ + { \ + return list_node_add(&list, (void *)&data); \ + } +#ifdef __cplusplus +} +#endif // __cplusplus +#endif // LIST_H diff --git a/makefile b/makefile index 158c108..90c8dfa 100644 --- a/makefile +++ b/makefile @@ -7,7 +7,7 @@ CFLAGS = -Wall -Wextra -std=c11 -g BUILD_DIR = build # 源文件 SRCS = erpc_core.c \ - port_self.c \ + erpc_port_self.c \ crc16.c\ list.c diff --git a/picture/1.jpg b/picture/1.jpg deleted file mode 100644 index 1ec3a8848474f2e1f5e3a8602cbd36f26266d3a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9871 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 K8ghW0-v0tHKs4z9 diff --git a/picture/2.jpg b/picture/2.jpg deleted file mode 100644 index 3984c810b179520d01e5e66ce2ed2db245568758..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18609 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

@SQP~VZWouRU(F;nTwf+@{ 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 YF5vrgwuI09kIPs;NZ}9v2w&^}FB47TcmMzZ diff --git a/port_self.c b/port_self.c deleted file mode 100644 index 5c752d1..0000000 --- a/port_self.c +++ /dev/null @@ -1,208 +0,0 @@ - -// #ifndef WINDOWS -// #error "This file is for Windows only" -// #endif - -#include "erpc_core.h" -#include "windows.h" -#include -u32 hellworld(u8 hw, u8 src_id, u8 dest_id, u16 port, u8 *data, u16 len) -{ - 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; -} -u32 hello_cat(u8 hw, u8 src_id, u8 dest_id, u16 port, u8 *data, u16 len) -{ - ERPC_DEBUG("Hello Cat!\n"); - // 防止编译警告 - UNUSED(hw); - UNUSED(src_id); - UNUSED(dest_id); - UNUSED(port); - UNUSED(data); - UNUSED(len); - return 0; -} - - - -u32 hello_dog(u8 hw, u8 src_id, u8 dest_id, u16 port, u8 *data, u16 len) -{ - ERPC_DEBUG("Hello Dog!\n"); - // 防止编译警告 - u8 data_out[10] = "12345"; - 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}, - {.cmd = 0x02, hello_cat}, - {.cmd = 0x03, hello_dog}, -}; - -HANDLE deal_lock; -HANDLE send_lock; - -static void deal_lock_h() -{ - WaitForSingleObject(deal_lock, INFINITE); -} - -static void deal_unlock_h() -{ - ReleaseMutex(deal_lock); -} -static void send_lock_h() -{ - WaitForSingleObject(send_lock, INFINITE); -} - -static void send_unlock_h() -{ - ReleaseMutex(send_lock); -} -u8 data[300]; -static u8 data_write(u8 *data, u16 len) -{ - erpc_set_rev_cahce(0, data, len); - return 0; -} - -erpc_hw_cfg_t self_hw_cfg = { - .ord = 0, - .deal_lock = deal_lock_h, - .deal_unlock = deal_unlock_h, - .send_lock = send_lock_h, - .send_unlock = send_unlock_h, - .local_id = 0x01, - .write = data_write, -}; -void erpc_cmd_config() -{ - 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]); - } -} -void sys_sleep(u32 ms) -{ - Sleep(ms); -} - -DWORD WINAPI send_task(LPVOID lpParam) -{ - UNUSED(lpParam); - while (1) - { - erpc_send_deal_core(); - } -} -DWORD WINAPI rev_package_task(LPVOID lpParam) -{ - UNUSED(lpParam); - - while (1) - { - // ERPC_DEBUG("rev_task\n"); - erpc_rev_package_core(); - erpc_rev_deal_core(); - } -} - -DWORD WINAPI rev_deal_task(LPVOID lpParam) -{ - UNUSED(lpParam); - - while (1) - { - // ERPC_DEBUG("rev_task\n"); - erpc_rev_package_core(); - erpc_rev_deal_core(); - } -} - -DWORD WINAPI test_task(LPVOID lpParam) -{ - UNUSED(lpParam); - ERPC_DEBUG("test_task\n"); - while (1) - { - // 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); - ERPC_DEBUG("[test_task]send ret:%d\n", ret); - u16 reply_len = 30; - u8 data[reply_len]; - ret = erpc_send_wait_reply(self_hw_cfg.ord, self_hw_cfg.local_id, 0x03, NULL, 0, data, &reply_len, 1000); - ERPC_DEBUG("[test_task]send ret:%d\n", ret); - for (int i = 0; i < reply_len; i++) - { - ERPC_DEBUG("%c", data[i]); - } - ERPC_DEBUG("\n"); - - UNUSED(ret); - sys_sleep(1000); - } -} - -int main(int argc, char *argv[]) -{ - UNUSED(argc); - UNUSED(argv); - u32 ret = 0; - ERPC_DEBUG("erpc_port_self start\n"); - ret = erpc_hw_add(&self_hw_cfg); - ERPC_DEBUG("erpc_hw_add ret:%d\n", ret); - CHECK_IF_ERROR(ret, 0); - erpc_cmd_config(); - ERPC_DEBUG("erpc_cmd_config ret:%d\n", ret); - erpc_sleep_tick = sys_sleep; - - HANDLE threadHandle[4]; - deal_lock = CreateMutex(NULL, FALSE, NULL); - if (deal_lock == NULL) - { - ERPC_DEBUG("创建互斥锁失败\n"); - return 1; - } - send_lock = CreateMutex(NULL, FALSE, NULL); - if (send_lock == NULL) - { - ERPC_DEBUG("创建互斥锁失败\n"); - return 1; - } - threadHandle[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)send_task, NULL, 0, NULL); - threadHandle[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)rev_package_task, NULL, 0, NULL); - threadHandle[3] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)rev_deal_task, NULL, 0, NULL); - threadHandle[4] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)test_task, NULL, 0, NULL); - - WaitForSingleObject(threadHandle[0], INFINITE); - WaitForSingleObject(threadHandle[1], INFINITE); - WaitForSingleObject(threadHandle[2], INFINITE); - WaitForSingleObject(threadHandle[3], INFINITE); - CloseHandle(threadHandle[0]); - CloseHandle(threadHandle[1]); - CloseHandle(threadHandle[2]); - CloseHandle(threadHandle[3]); - return 0; -} \ No newline at end of file diff --git a/port_self.exe b/port_self.exe index d6c9988ee1bd156f85e8cd869b1cf622c8a90bb6..76558d0757100386d7a1da340e95155dd7ce30f1 100644 GIT binary patch literal 105706 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

`+A4_VTb#Z4)<^6#hvDfESqjw<#6wExSw*k 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 literal 113101 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�nosB7#hK-`y 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 H<<9>Fzm@+c diff --git a/port_self.h b/port_self.h deleted file mode 100644 index e69de29..0000000 diff --git a/port_uart_master.c b/port_uart_master.c deleted file mode 100644 index e69de29..0000000 diff --git a/spi_port.c b/spi_port.c deleted file mode 100644 index e2c613d..0000000 --- a/spi_port.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "spi_port.h" - - diff --git a/spi_port.h b/spi_port.h deleted file mode 100644 index d6fb834..0000000 --- a/spi_port.h +++ /dev/null @@ -1 +0,0 @@ -#include "config.h" \ No newline at end of file diff --git a/unit_test.c b/unit_test.c deleted file mode 100644 index 2bf60ca..0000000 --- a/unit_test.c +++ /dev/null @@ -1,2 +0,0 @@ -#include "erpc_core.h" - diff --git a/架构.drawio b/架构.drawio deleted file mode 100644 index c2f7795..0000000 --- a/架构.drawio +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -