<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta name="generator" content="pdf2htmlEX">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<link rel="stylesheet" href="https://static.pudn.com/base/css/base.min.css">
<link rel="stylesheet" href="https://static.pudn.com/base/css/fancy.min.css">
<link rel="stylesheet" href="https://static.pudn.com/prod/directory_preview_static/6251b2f96caf5961924318d1/raw.css">
<script src="https://static.pudn.com/base/js/compatibility.min.js"></script>
<script src="https://static.pudn.com/base/js/pdf2htmlEX.min.js"></script>
<script>
try{
pdf2htmlEX.defaultViewer = new pdf2htmlEX.Viewer({});
}catch(e){}
</script>
<title></title>
</head>
<body>
<div id="sidebar" style="display: none">
<div id="outline">
</div>
</div>
<div id="pf1" class="pf w0 h0" data-page-no="1"><div class="pc pc1 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/6251b2f96caf5961924318d1/bg1.jpg"><div class="c x1 y1 w2 h2"><div class="t m0 x0 h3 y2 ff1 fs0 fc0 sc0 ls0 ws0"> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span></div></div><div class="t m0 x2 h4 y3 ff1 fs0 fc0 sc0 ls0 ws0">E-mail:for_rest@foxmail.com <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span><span class="ff2">老衲五木出品</span> </div><div class="t m0 x1 h5 y4 ff3 fs1 fc0 sc0 ls0 ws0"> </div><div class="t m0 x1 h5 y5 ff3 fs1 fc0 sc0 ls0 ws0"> </div><div class="t m0 x3 h5 y6 ff3 fs1 fc0 sc0 ls0 ws0">LwIP<span class="_ _0"> </span>协议栈源码详解 </div><div class="t m0 x4 h6 y7 ff4 fs2 fc0 sc0 ls0 ws0"> <span class="ff3 fs3">——TCP/IP<span class="_ _1"> </span>协议的实现 </span></div><div class="t m0 x1 h5 y8 ff3 fs1 fc0 sc0 ls0 ws0"> </div><div class="t m0 x5 h5 y9 ff3 fs1 fc0 sc0 ls0 ws0"> </div><div class="t m0 x1 h5 ya ff3 fs1 fc0 sc0 ls0 ws0"> </div><div class="t m0 x6 h7 yb ff4 fs4 fc0 sc0 ls0 ws0"> </div><div class="t m0 x6 h7 yc ff4 fs4 fc0 sc0 ls0 ws0"> </div><div class="t m0 x6 h7 yd ff4 fs4 fc0 sc0 ls0 ws0"> </div><div class="t m0 x6 h7 ye ff4 fs4 fc0 sc0 ls0 ws0">Created by.. 老衲五木 </div><div class="t m0 x6 h7 yf ff4 fs4 fc0 sc0 ls0 ws0"> at.. UESTC </div><div class="t m0 x6 h7 y10 ff4 fs4 fc0 sc0 ls0 ws0">Contact me.. <span class="fc1">for_rest@fox<span class="_ _2"></span>mail.com</span> </div><div class="t m0 x6 h7 y11 ff4 fs4 fc0 sc0 ls0 ws0"> <span class="fc1">540535649@qq<span class="_ _2"></span>.com</span> </div><div class="t m0 x6 h7 y12 ff4 fs4 fc0 sc0 ls0 ws0"> </div><div class="t m0 x7 h5 y13 ff3 fs1 fc0 sc0 ls0 ws0"> </div><div class="t m0 x1 h5 y14 ff3 fs1 fc0 sc0 ls0 ws0"> </div><div class="t m0 x1 h5 y15 ff3 fs1 fc0 sc0 ls0 ws0"> </div><div class="t m0 x2 h8 y16 ff2 fs5 fc0 sc0 ls0 ws0"> </div></div><div class="pi" data-data='{"ctm":[1.611639,0.000000,0.000000,1.611639,0.000000,0.000000]}'></div></div>
</body>
</html>
<div id="pf2" class="pf w0 h0" data-page-no="2"><div class="pc pc2 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/6251b2f96caf5961924318d1/bg2.jpg"><div class="c x1 y1 w2 h2"><div class="t m0 x0 h3 y2 ff1 fs0 fc0 sc0 ls0 ws0"> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span></div></div><div class="t m0 x2 h4 y3 ff1 fs0 fc0 sc0 ls0 ws0">E-mail:for_rest@foxmail.com <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span><span class="ff2">老衲五木出品</span> </div><div class="t m0 x8 h7 y17 ff4 fs4 fc0 sc0 ls0 ws0">前言 </div><div class="t m0 x9 h8 y18 ff2 fs5 fc0 sc0 ls0 ws0">最近一个项目用到<span class="_"> </span>LwIP,恰好看到网上讨论的<span class="_ _2"></span>人比较多,所以有了写这篇学习笔记的</div><div class="t m0 x2 h8 y19 ff2 fs5 fc0 sc0 ls0 ws0">冲动,<span class="_ _3"></span>一是为了打发点发呆的时间,<span class="_ _3"></span>二是为了吹过的那些<span class="_ _4"> </span>NB。<span class="_ _3"></span>往往决定做一件事是简单的,</div><div class="t m0 x2 h8 y1a ff2 fs5 fc0 sc0 ls0 ws0">而坚持做完这件事却是漫长曲折的,<span class="_ _5"></span>但终究还是写完了,<span class="_ _5"></span>时间开销大概为四个月,<span class="_ _5"></span>内存开销</div><div class="t m0 x2 h8 y1b ff2 fs5 fc0 sc0 ls0 ws0">无法估计。<span class="_ _6"></span>。 </div><div class="t m0 x9 h8 y1c ff2 fs5 fc0 sc0 ls0 ws0">这篇文章覆盖了<span class="_ _4"> </span>LwIP<span class="_ _4"> </span>协议大部分的内容,<span class="_ _7"></span>但是并不全面。<span class="_ _7"></span>它主要讲解了<span class="_ _4"> </span>LwIP<span class="_ _4"> </span>协议最重</div><div class="t m0 x2 h8 y1d ff2 fs5 fc0 sc0 ls0 ws0">要也是最常被用到的部分,<span class="_ _8"></span>包括内存管理,<span class="_ _8"></span>底层网络接口管理,<span class="_ _8"></span>ARP<span class="_ _4"> </span>层,<span class="_ _8"></span>IP<span class="_ _4"> </span>层,<span class="_ _8"></span>TCP<span class="_ _4"> </span>层,<span class="_ _5"></span>A<span class="_ _2"></span>PI</div><div class="t m0 x2 h8 y1e ff2 fs5 fc0 sc0 ls0 ws0">层等,这些部分是<span class="_ _4"> </span>LwIP<span class="_ _4"> </span>的典型应用中经常涉及到的。而<span class="_ _4"> </span>LwIP<span class="_ _4"> </span>协议的其他部分,包括<span class="_ _4"> </span>UDP,</div><div class="t m0 x2 h8 y1f ff2 fs5 fc0 sc0 ls0 ws0">DHCP,DNS,IGMP,SNMP,PPP<span class="_ _4"> </span>等不具有使用共性的部分,这篇文档暂时未涉及。 </div><div class="t m0 x9 h8 y20 ff2 fs5 fc0 sc0 ls0 ws0">原来文章是发在空间中的,<span class="_ _5"></span>每节每节依次更新,<span class="_ _5"></span>后来又改发为博客,<span class="_ _5"></span>再后来就干脆懒得</div><div class="t m0 x2 h8 y21 ff2 fs5 fc0 sc0 ls0 ws0">发了。<span class="_ _8"></span>现在终于搞定,<span class="_ _8"></span>于是将所有文章汇总。<span class="_ _8"></span>绞尽脑汁的想写一段空前绝后,<span class="_ _8"></span>人见人爱的序</div><div class="t m0 x2 h8 y22 ff2 fs5 fc0 sc0 ls0 ws0">言,但越写越觉得像是猫儿抓的一样。就这样,P<span class="_ _2"></span>S:由于本人文笔有限,情商又低,下里巴</div><div class="t m0 x2 h8 y23 ff2 fs5 fc0 sc0 ls0 ws0">人一枚,<span class="_ _5"></span>所以文中的很多语句可能让您很纠结,<span class="_ _5"></span>您可以通过邮箱与我联系。<span class="_ _5"></span>共同探讨才是进</div><div class="t m0 x2 h8 y24 ff2 fs5 fc0 sc0 ls0 ws0">步的关键。 </div><div class="t m0 x9 h8 y25 ff2 fs5 fc0 sc0 ls0 ws0">最后,<span class="_ _8"></span>欢迎读者以任何方式使用与转载,<span class="_ _3"></span>但请保留作者相关信息,<span class="_ _8"></span>酱紫!<span class="_ _3"></span>码字。<span class="_ _6"></span>。<span class="_ _6"></span>。<span class="_ _8"></span>世界</div><div class="t m0 x2 h8 y26 ff2 fs5 fc0 sc0 ls0 ws0">上最痛苦的事情莫过于此。<span class="_ _6"></span>。<span class="_ _6"></span>。 </div><div class="t m0 x9 h8 y27 ff2 fs5 fc0 sc0 ls0 ws0"> ——老衲五木 </div></div><div class="pi" data-data='{"ctm":[1.611639,0.000000,0.000000,1.611639,0.000000,0.000000]}'></div></div>
<div id="pf3" class="pf w0 h0" data-page-no="3"><div class="pc pc3 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/6251b2f96caf5961924318d1/bg3.jpg"><div class="c x1 y1 w2 h2"><div class="t m0 x0 h3 y2 ff1 fs0 fc0 sc0 ls0 ws0"> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span></div></div><div class="t m0 x2 h4 y3 ff1 fs0 fc0 sc0 ls0 ws0">E-mail:for_rest@foxmail.com <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span><span class="ff2">老衲五木出品</span> </div><div class="t m0 xa h9 y28 ff4 fs6 fc0 sc0 ls0 ws0">目录 </div><div class="t m0 x2 h8 y18 ff1 fs5 fc0 sc0 ls0 ws0">1 <span class="_"> </span><span class="ff2">移植综述</span>---------------------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>-----------<span class="_ _a"> </span>4 </div><div class="t m0 x2 h8 y19 ff1 fs5 fc0 sc0 ls0 ws0">2 <span class="_"> </span><span class="ff2">动态内存管理</span>-------------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>-----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>------------<span class="_ _a"> </span>6 </div><div class="t m0 x2 h8 y1a ff1 fs5 fc0 sc0 ls0 ws0">3 <span class="_"> </span><span class="ff2">数据包<span class="_ _4"> </span></span>pbuf<span class="_"> </span>---------------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>-------------<span class="_ _a"> </span>9 </div><div class="t m0 x2 h8 y1b ff1 fs5 fc0 sc0 ls0 ws0">4 <span class="_"> </span> <span class="_"> </span>pbuf<span class="_"> </span><span class="ff2">释放<span class="_ _b"></span></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>---13 </div><div class="t m0 x2 h8 y1c ff1 fs5 fc0 sc0 ls0 ws0">5 <span class="_"> </span><span class="ff2">网络接口结构</span>-------------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>-----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>-----------16 </div><div class="t m0 x2 h8 y1d ff1 fs5 fc0 sc0 ls0 ws0">6 <span class="_"> </span><span class="ff2">以太网数据接收</span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>------------20 </div><div class="t m0 x2 h8 y1e ff1 fs5 fc0 sc0 ls0 ws0">7 <span class="_"> </span> <span class="_"> </span>ARP<span class="_"> </span><span class="ff2">表<span class="_ _c"> </span></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>-----23 </div><div class="t m0 x2 h8 y1f ff1 fs5 fc0 sc0 ls0 ws0">8 <span class="_"> </span> <span class="_"> </span>ARP<span class="_"> </span><span class="ff2">表查询<span class="_ _c"> </span></span>--------<span class="_ _9"></span>----------------<span class="_ _9"></span>-----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>------26 </div><div class="t m0 x2 h8 y20 ff1 fs5 fc0 sc0 ls0 ws0">9 <span class="_"> </span> <span class="_"> </span>ARP<span class="_"> </span><span class="ff2">层流程<span class="_ _c"> </span></span>--------<span class="_ _9"></span>----------------<span class="_ _9"></span>-----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>------28 </div><div class="t m0 x2 h8 y21 ff1 fs5 fc0 sc0 ls0 ws0">10 <span class="_"> </span> <span class="_"> </span>IP<span class="_"> </span><span class="ff2">层输入<span class="_ _d"> </span></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>-31 </div><div class="t m0 x2 h8 y22 ff1 fs5 fc0 sc0 ls0 ws0">1<span class="_ _9"></span>1 <span class="_"> </span> <span class="_"> </span>IP<span class="_"> </span><span class="ff2">分片重装<span class="_ _4"> </span></span>1<span class="_ _e"> </span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>------------34 </div><div class="t m0 x2 h8 y23 ff1 fs5 fc0 sc0 ls0 ws0">12 <span class="_"> </span> <span class="_"> </span>IP<span class="_"> </span><span class="ff2">分片重装<span class="_ _4"> </span></span>2<span class="_ _b"></span>------------------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----37 </div><div class="t m0 x2 h8 y24 ff1 fs5 fc0 sc0 ls0 ws0">13 <span class="_"> </span> <span class="_"> </span>ICMP<span class="_"> </span><span class="ff2">处理<span class="_ _c"> </span></span>--------<span class="_ _9"></span>----------------<span class="_ _9"></span>-----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>------40 </div><div class="t m0 x2 h8 y25 ff1 fs5 fc0 sc0 ls0 ws0">14 <span class="_"> </span> <span class="_"> </span>TCP<span class="_"> </span><span class="ff2">建立与断开<span class="_ _4"> </span></span>---------<span class="_ _9"></span>-----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>--------------43 </div><div class="t m0 x2 h8 y26 ff1 fs5 fc0 sc0 ls0 ws0">15 <span class="_"> </span> <span class="_"> </span>TCP<span class="_"> </span><span class="ff2">状态转换<span class="_ _4"> </span></span>-------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>--------------46 </div><div class="t m0 x2 h8 y27 ff1 fs5 fc0 sc0 ls0 ws0">16 <span class="_"> </span> <span class="_"> </span>TCP<span class="_"> </span><span class="ff2">控制块<span class="_ _4"> </span></span>-----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>-------------49 </div><div class="t m0 x2 h8 y29 ff1 fs5 fc0 sc0 ls0 ws0">17 <span class="_"> </span> <span class="_"> </span>TCP<span class="_"> </span><span class="ff2">建立流程<span class="_ _4"> </span></span>-------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>--------------53 </div><div class="t m0 x2 h8 y2a ff1 fs5 fc0 sc0 ls0 ws0">18 <span class="_"> </span> <span class="_"> </span>TCP<span class="_"> </span><span class="ff2">状态机<span class="_ _4"> </span></span>-----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>-------------56 </div><div class="t m0 x2 h8 y2b ff1 fs5 fc0 sc0 ls0 ws0">19 <span class="_"> </span> <span class="_"> </span>TCP<span class="_"> </span><span class="ff2">输入输出函数<span class="_ _4"> </span></span>1<span class="_ _e"> </span>------------------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>-----------60 </div><div class="t m0 x2 h8 y2c ff1 fs5 fc0 sc0 ls0 ws0">20 <span class="_"> </span> <span class="_"> </span>TCP<span class="_"> </span><span class="ff2">输入输出函数<span class="_ _4"> </span></span>2<span class="_ _e"> </span>------------------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>-----------63 </div><div class="t m0 x2 h8 y2d ff1 fs5 fc0 sc0 ls0 ws0">21 <span class="_"> </span> <span class="_"> </span>TCP<span class="_"> </span><span class="ff2">滑动窗口<span class="_ _4"> </span></span>-------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>--------------66 </div><div class="t m0 x2 h8 y2e ff1 fs5 fc0 sc0 ls0 ws0">22 <span class="_"> </span> <span class="_"> </span>TCP<span class="_"> </span><span class="ff2">超时与重传<span class="_ _4"> </span></span>---------<span class="_ _9"></span>-----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>--------------69 </div><div class="t m0 x2 h8 y2f ff1 fs5 fc0 sc0 ls0 ws0">23 <span class="_"> </span> <span class="_"> </span>TCP<span class="_"> </span><span class="ff2">慢启动与拥塞避免<span class="_ _d"> </span></span>-----------------------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>--73 </div><div class="t m0 x2 h8 y30 ff1 fs5 fc0 sc0 ls0 ws0">24 <span class="_"> </span> <span class="_"> </span>TCP<span class="_"> </span><span class="ff2">快速恢复重传和<span class="_ _4"> </span></span>Nagle<span class="_"> </span><span class="ff2">算法<span class="_ _c"> </span></span>---------<span class="_ _9"></span>----------------<span class="_ _9"></span>-----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>---------76 </div><div class="t m0 x2 h8 y31 ff1 fs5 fc0 sc0 ls0 ws0">25 <span class="_"> </span> <span class="_"> </span>TCP<span class="_"> </span><span class="ff2">坚持与保活定时器<span class="_ _d"> </span></span>-----------------------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>--80 </div><div class="t m0 x2 h8 y32 ff1 fs5 fc0 sc0 ls0 ws0">26 <span class="_"> </span> <span class="_"> </span>TCP<span class="_"> </span><span class="ff2">定时器<span class="_ _4"> </span></span>-----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>-------------84 </div><div class="t m0 x2 h8 y33 ff1 fs5 fc0 sc0 ls0 ws0">27 <span class="_"> </span> <span class="_"> </span>TCP<span class="_"> </span><span class="ff2">终结与小结<span class="_ _4"> </span></span>---------<span class="_ _9"></span>-----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>--------------88 </div><div class="t m0 x2 h8 y34 ff1 fs5 fc0 sc0 ls0 ws0">28 <span class="_"> </span> <span class="_"> </span>API<span class="_"> </span><span class="ff2">实现及相关数据结构<span class="_ _b"></span></span>------------------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>-----91 </div><div class="t m0 x2 h8 y35 ff1 fs5 fc0 sc0 ls0 ws0">29 <span class="_"> </span> <span class="_"> </span>API<span class="_"> </span><span class="ff2">消息机制<span class="_ _e"> </span></span>------------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>-----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>---------94 </div><div class="t m0 x2 h8 y36 ff1 fs5 fc0 sc0 ls0 ws0">30 <span class="_"> </span> <span class="_"> </span>API<span class="_"> </span><span class="ff2">函数及编程实例<span class="_ _e"> </span></span>-------<span class="_ _9"></span>----------------<span class="_ _9"></span>-----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>----------------<span class="_ _9"></span>-----------97 </div><div class="t m0 x2 h8 y37 ff2 fs5 fc0 sc0 ls0 ws0"> </div></div><div class="pi" data-data='{"ctm":[1.611639,0.000000,0.000000,1.611639,0.000000,0.000000]}'></div></div>
<div id="pf4" class="pf w0 h0" data-page-no="4"><div class="pc pc4 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/6251b2f96caf5961924318d1/bg4.jpg"><div class="c x1 y1 w2 h2"><div class="t m0 x0 h3 y2 ff1 fs0 fc0 sc0 ls0 ws0"> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span></div></div><div class="t m0 x2 h4 y3 ff1 fs0 fc0 sc0 ls0 ws0">E-mail:for_rest@foxmail.com <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span><span class="ff2">老衲五木出品</span> </div><div class="t m0 x2 h8 y38 ff2 fs5 fc0 sc0 ls0 ws0"> </div><div class="t m0 x2 ha y39 ff5 fs7 fc0 sc0 ls0 ws0">1 <span class="_ _0"> </span><span class="ff2">移植综述</span></div><div class="t m0 xb ha y3a ff2 fs7 fc0 sc0 ls0 ws0">移植综述<span class="_ _f"></span>移植综述</div><div class="t m0 xb ha y39 ff2 fs7 fc0 sc0 ls0 ws0">移植综述<span class="ff5"> </span></div><div class="t m0 x9 h8 y3b ff2 fs5 fc0 sc0 ls0 ws0">如果你认为所谓的毅力是每分每秒的<span class="_ _5"></span>“艰苦忍耐”<span class="_ _5"></span>式的奋斗,<span class="_ _5"></span>那这是一种很不足的心理</div><div class="t m0 x2 h8 y3c ff2 fs5 fc0 sc0 ls0 ws0">状态。<span class="_ _8"></span>毅力是一种习惯,<span class="_ _8"></span>毅力是一种状态,<span class="_ _8"></span>毅力是一种生活。<span class="_ _8"></span>看了这么久的代码觉得是不是</div><div class="t m0 x2 h8 y3d ff2 fs5 fc0 sc0 ls0 ws0">该写点东西了,<span class="_ _7"></span>不然怎么对得起某人口中所说的科研人员这个光荣称号。<span class="_ _7"></span>初见这如山如海的</div><div class="t m0 x2 h8 y3e ff2 fs5 fc0 sc0 ls0 ws0">代码,着实看出了一身冷汗。现在想想其实也不是那么难,那么多革命先辈经过<span class="_ _10"> </span><span class="ff1">N<span class="_ _10"> </span></span>长时间</div><div class="t m0 x2 h8 y3f ff2 fs5 fc0 sc0 ls0 ws0">才搞出来的东东怎么可能让你个毛小子几周之内搞懂。<span class="_ _7"></span>我见到的只是冰川的一小角,<span class="_ _7"></span>万里长</div><div class="t m0 x2 h8 y40 ff2 fs5 fc0 sc0 ls0 ws0">征的一小步,<span class="_ _3"></span>九头牛身上的一小毛<span class="ff1">…</span>再用某人的话说,<span class="_ _3"></span>写吧,<span class="_ _3"></span>昏写,<span class="_ _3"></span>瞎写,<span class="_ _9"></span>胡写,<span class="_ _3"></span>乱写,<span class="_ _3"></span>写</div><div class="t m0 x2 h8 y41 ff2 fs5 fc0 sc0 ls0 ws0">写就懂了。<span class="ff1"> </span></div><div class="t m0 x9 h8 y42 ff2 fs5 fc0 sc0 ls0 ws0">我想我很适合当一个歌颂者,<span class="_ _8"></span>青春在风中飘着。<span class="_ _8"></span>你知道,<span class="_ _8"></span>就算大雨让这座城市颠倒,<span class="_ _8"></span>我</div><div class="t m0 x2 h8 y43 ff2 fs5 fc0 sc0 ls0 ws0">会给你怀抱;<span class="_ _8"></span>受不了,<span class="_ _8"></span>看见你背影来到,<span class="_ _8"></span>写下我度秒如年难捱的离骚;<span class="_ _8"></span>就算整个世界被寂寞</div><div class="t m0 x2 h8 y44 ff2 fs5 fc0 sc0 ls0 ws0">绑票,<span class="_ _3"></span>我也不会奔跑;<span class="_ _3"></span>逃不了,<span class="_ _3"></span>最后谁也都苍老,<span class="_ _8"></span>写下我,<span class="_ _3"></span>时间和琴声交错的城堡。<span class="_ _3"></span>我正在</div><div class="t m0 x2 h8 y45 ff2 fs5 fc0 sc0 ls0 ws0">听的歌。扯远了<span class="ff1">… </span></div><div class="t m0 xb h8 y46 ff2 fs5 fc0 sc0 ls0 ws0">正题,嵌入式产品连入<span class="_ _4"> </span><span class="ff1">Internet<span class="_"> </span></span>网,<span class="_ _9"></span>这个<span class="_ _4"> </span><span class="ff1">MS<span class="_"> </span></span>是个愈演愈烈的趋势。<span class="_ _9"></span>想想,<span class="_ _9"></span>你可以足不</div><div class="t m0 x2 h8 y47 ff2 fs5 fc0 sc0 ls0 ws0">出户对你的产品进行配置,<span class="_ _5"></span>并获取你关心的数据信息,<span class="_ _5"></span>多好。<span class="_ _5"></span>这也许也是物联网世界最基本</div><div class="t m0 x2 h8 y48 ff2 fs5 fc0 sc0 ls0 ws0">的雏形。<span class="_ _11"></span>当然,<span class="_ _11"></span>你的产品要有如此功能,<span class="_ _11"></span>那可不容易,<span class="_ _11"></span>至少它得有个目前很<span class="_ _4"> </span><span class="ff1">Fashion<span class="_"> </span></span>的<span class="_ _4"> </span><span class="ff1">TCP/IP</span></div><div class="t m0 x2 h8 y49 ff2 fs5 fc0 sc0 ls0 ws0">协议栈。<span class="ff1">L<span class="_ _3"></span>WIP<span class="_ _1"> </span><span class="ff2">是一套用于嵌入式系统的开放源代码<span class="_ _10"> </span></span>TCP/IP<span class="_ _1"> </span><span class="ff2">协议栈。在你的嵌入式处理器</span></span></div><div class="t m0 x2 h8 y4a ff2 fs5 fc0 sc0 ls0 ws0">不是很<span class="_ _4"> </span><span class="ff1">NB</span>,内部<span class="_ _4"> </span><span class="ff1">Flash<span class="_"> </span></span>和<span class="_ _4"> </span><span class="ff1">Ram<span class="_"> </span></span>不是很强大的情况下,用它还是很合适滴。<span class="ff1"> </span></div><div class="t m0 xb h8 y4b ff1 fs5 fc0 sc0 ls0 ws0">L<span class="_ _3"></span>WIP<span class="_"> </span><span class="ff2">的设计者为像我这样的懒惰者提供了详细的移植说明文档,<span class="_ _3"></span>当然这还不够,<span class="_ _3"></span>他们</span></div><div class="t m0 x2 h8 y4c ff2 fs5 fc0 sc0 ls0 ws0">还尽可能的包揽了大部分工作,<span class="_ _6"></span>懒人们只要做很少的工作就功德圆满了。<span class="_ _12"></span>纵观整个移植过程,</div><div class="t m0 x2 h8 y4d ff2 fs5 fc0 sc0 ls0 ws0">使用者需要完成以下几个方面的东西:<span class="ff1"> </span></div><div class="t m0 xb h8 y4e ff2 fs5 fc0 sc0 ls0 ws0">首先是<span class="_ _4"> </span><span class="ff1">L<span class="_ _3"></span>WIP<span class="_"> </span><span class="ff2">协议内部使用的数据类型的定义,<span class="_ _8"></span>如<span class="_ _4"> </span><span class="ff1">u8_t</span>,<span class="_ _3"></span><span class="ff1">s8_t<span class="ff2">,<span class="_ _8"></span><span class="ff1">u16_t<span class="ff2">,<span class="_ _8"></span><span class="ff1">u32_t<span class="_"> </span><span class="ff2">等等等等。</span></span></span></span></span></span></span></span></div><div class="t m0 x2 h8 y4f ff2 fs5 fc0 sc0 ls0 ws0">由于所移植平台处理器的不同和使用的编译器的不同,这些数据类型必须重新定义。想想,</div><div class="t m0 x2 h8 y50 ff2 fs5 fc0 sc0 ls0 ws0">一个<span class="_ _4"> </span><span class="ff1">int<span class="_"> </span></span>型数据在<span class="_ _4"> </span><span class="ff1">64<span class="_"> </span></span>位处理器上其长度为<span class="_ _4"> </span><span class="ff1">8<span class="_"> </span></span>个字节,<span class="_ _5"></span>在<span class="_ _4"> </span><span class="ff1">32<span class="_"> </span></span>位处理器上为<span class="_ _4"> </span><span class="ff1">4<span class="_"> </span></span>个字节,<span class="_ _8"></span>而在<span class="_ _4"> </span><span class="ff1">16</span></div><div class="t m0 x2 h8 y51 ff2 fs5 fc0 sc0 ls0 ws0">位处理器上就只有两个字节了。<span class="_ _12"></span>因此这部分需要使用者根据处理器位数和和使用的编译器的</div><div class="t m0 x2 h8 y52 ff2 fs5 fc0 sc0 ls0 ws0">特点来编写。<span class="_ _13"></span>所以在<span class="_ _4"> </span><span class="ff1">ARM7<span class="_"> </span></span>处理器上使用的<span class="_ _4"> </span><span class="ff1">typedef unsigned int u32_t<span class="_"> </span></span>移植语句用在<span class="_ _4"> </span><span class="ff1">64<span class="_"> </span></span>位处</div><div class="t m0 x2 h8 y53 ff2 fs5 fc0 sc0 ls0 ws0">理器的移植过程中那肯定是行不通的了。<span class="ff1"> </span></div><div class="t m0 xb h8 y54 ff2 fs5 fc0 sc0 ls0 ws0">其次是<span class="_ _2"></span>实<span class="_ _2"></span>现与<span class="_ _2"></span>信号<span class="_ _2"></span>量和<span class="_ _2"></span>邮<span class="_ _2"></span>箱操作<span class="_ _2"></span>相<span class="_ _2"></span>关的<span class="_ _2"></span>函数<span class="_ _2"></span>,<span class="_ _2"></span>比如<span class="_ _2"></span>建立<span class="_ _2"></span>、删<span class="_ _2"></span>除、<span class="_ _2"></span>等<span class="_ _2"></span>待、<span class="_ _2"></span>释放<span class="_ _2"></span>等。<span class="_ _2"></span>如果</div><div class="t m0 x2 h8 y55 ff2 fs5 fc0 sc0 ls0 ws0">在裸机上直接跑<span class="_ _4"> </span><span class="ff1">L<span class="_ _3"></span>WIP<span class="ff2">,<span class="_ _9"></span>这点实现起来比较麻烦,<span class="_ _3"></span>使用者必须自己去建立一套信号量和邮箱</span></span></div><div class="t m0 x2 h8 y56 ff2 fs5 fc0 sc0 ls0 ws0">相关的机制。<span class="_ _8"></span>一般情况下,<span class="_ _8"></span>在使用<span class="_ _4"> </span><span class="ff1">L<span class="_ _3"></span>WIP<span class="_"> </span><span class="ff2">的嵌入式系统中都会有操作系统的支持,<span class="_ _8"></span>而在操作</span></span></div><div class="t m0 x2 h8 y57 ff2 fs5 fc0 sc0 ls0 ws0">系统中信号量和邮箱往往是最基本的进程通信机制了。<span class="_ _14"></span><span class="ff1">UC/OSII<span class="_"> </span><span class="ff2">应该算是最简单的嵌入式操</span></span></div><div class="t m0 x2 h8 y58 ff2 fs5 fc0 sc0 ls0 ws0">作系统了吧,它也无例外的能够提供信号量和邮箱机制,只要我们将<span class="_ _15"> </span><span class="ff1">UC/OSII<span class="_ _15"> </span></span>中的相关函</div><div class="t m0 x2 h8 y59 ff2 fs5 fc0 sc0 ls0 ws0">数做相应的封装,就可满足<span class="_ _4"> </span><span class="ff1">L<span class="_ _3"></span>WIP<span class="_ _16"> </span><span class="ff2">的需求。</span>L<span class="_ _3"></span>WIP<span class="_"> </span><span class="ff2">使用邮箱和信号量来实现上层应用与协议</span></span></div><div class="t m0 x2 h8 y5a ff2 fs5 fc0 sc0 ls0 ws0">栈间、下层硬件驱动与协议栈间的信息交互。<span class="ff1">L<span class="_ _3"></span>WIP<span class="_ _1"> </span><span class="ff2">协议模拟了<span class="_ _10"> </span></span>TCP/IP<span class="_ _1"> </span><span class="ff2">协议的分层思想,</span></span></div><div class="t m0 x2 h8 y5b ff2 fs5 fc0 sc0 ls0 ws0">表面上看<span class="_ _4"> </span><span class="ff1">L<span class="_ _3"></span>WIP<span class="_ _16"> </span><span class="ff2">也是有分层思想的,但从实现上看,</span>L<span class="_ _3"></span>WIP<span class="_"> </span><span class="ff2">只在一个进程内实现了各个层次</span></span></div><div class="t m0 x2 h8 y5c ff2 fs5 fc0 sc0 ls0 ws0">的所有工作。具体如下:<span class="_ _9"></span><span class="ff1">L<span class="_ _3"></span>WIP<span class="_"> </span><span class="ff2">完成相关初始化后,<span class="_ _9"></span>会阻塞在一个邮箱上,<span class="_ _9"></span>等待接收数据进</span></span></div><div class="t m0 x2 h8 y5d ff2 fs5 fc0 sc0 ls0 ws0">行处理。这个邮箱内的数据可能来自底层硬件驱动接收到的数据包,也可能来自应用程序。</div><div class="t m0 x2 h8 y5e ff2 fs5 fc0 sc0 ls0 ws0">当在该邮箱内取得数据后,<span class="_ _9"></span><span class="ff1">L<span class="_ _3"></span>WIP<span class="_"> </span><span class="ff2">会对数据进行解析,<span class="_ _3"></span>然后再依次调用协议栈内部上层相关</span></span></div><div class="t m0 x2 h8 y5f ff2 fs5 fc0 sc0 ls0 ws0">处理函数处理数据。处理结束后,<span class="ff1">L<span class="_ _3"></span>WIP<span class="_"> </span><span class="ff2">继续阻塞在邮箱上等待下一批数据。当然<span class="_ _16"> </span></span>L<span class="_ _3"></span>WIP<span class="_"> </span><span class="ff2">还</span></span></div><div class="t m0 x2 h8 y60 ff2 fs5 fc0 sc0 ls0 ws0">有一大串的内存管理机制用以避免在各层间交互数据时大量的时间和内存开销,<span class="_ _12"></span>这将在后续</div><div class="t m0 x2 h8 y61 ff2 fs5 fc0 sc0 ls0 ws0">讲解中慢慢道来。<span class="_ _8"></span>当然,<span class="_ _8"></span>但这样的设计使得代码理解难度加大,<span class="_ _8"></span>这一点让人头大。<span class="_ _8"></span>信号量也</div></div><div class="pi" data-data='{"ctm":[1.611639,0.000000,0.000000,1.611639,0.000000,0.000000]}'></div></div>
<div id="pf5" class="pf w0 h0" data-page-no="5"><div class="pc pc5 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/6251b2f96caf5961924318d1/bg5.jpg"><div class="c x1 y1 w2 h2"><div class="t m0 x0 h3 y2 ff1 fs0 fc0 sc0 ls0 ws0"> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span><span class="_"> </span><span class="fc2 sc0"> </span></div></div><div class="t m0 x2 h4 y3 ff1 fs0 fc0 sc0 ls0 ws0">E-mail:for_rest@foxmail.com <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span> <span class="_"> </span><span class="ff2">老衲五木出品</span> </div><div class="t m0 x2 h8 y38 ff2 fs5 fc0 sc0 ls0 ws0">可以用在应用程序与协议栈的互相通信中。<span class="_ _5"></span>比如,<span class="_ _5"></span>应用程序要发送数据了,<span class="_ _5"></span>它先把数据发到</div><div class="t m0 x2 h8 y62 ff1 fs5 fc0 sc0 ls0 ws0">L<span class="_ _3"></span>WIP<span class="_ _1"> </span><span class="ff2">阻塞的<span class="_ _2"></span>邮箱上,然后它挂起在一个信号量上;</span>L<span class="_ _3"></span>WIP<span class="_ _1"> </span><span class="ff2">从<span class="_ _2"></span>邮箱上取得数据处理后,释放</span></div><div class="t m0 x2 h8 y18 ff2 fs5 fc0 sc0 ls0 ws0">一个信号量,<span class="_ _8"></span>告诉应用程序,<span class="_ _8"></span>你要发的数据我已经搞定了;<span class="_ _8"></span>此后,<span class="_ _8"></span>应用程序得到信号量继续</div><div class="t m0 x2 h8 y19 ff2 fs5 fc0 sc0 ls0 ws0">运行,而<span class="_ _4"> </span><span class="ff1">L<span class="_ _3"></span>WIP<span class="_"> </span><span class="ff2">继续阻塞在邮箱上等待下一批处理数据。</span> </span></div><div class="t m0 xb h8 y1a ff2 fs5 fc0 sc0 ls0 ws0">其其次,<span class="_ _17"></span>就是与等待超时相关的函数。<span class="_ _17"></span>上面说到<span class="_ _4"> </span><span class="ff1">L<span class="_ _3"></span>WIP<span class="_"> </span><span class="ff2">协议栈会阻塞在邮箱上等待接收</span></span></div><div class="t m0 x2 h8 y1b ff2 fs5 fc0 sc0 ls0 ws0">数据的到来。<span class="_ _8"></span>这种等待在外部看起来是一直进行的,<span class="_ _8"></span>但其实不然。<span class="_ _8"></span>一般在初始化<span class="_ _4"> </span><span class="ff1">L<span class="_ _3"></span>WIP<span class="_"> </span><span class="ff2">进程</span></span></div><div class="t m0 x2 h8 y1c ff2 fs5 fc0 sc0 ls0 ws0">的时候,<span class="_ _5"></span>都会同时的初始化一些超时事件,<span class="_ _5"></span>即当某些事件等待超时后,<span class="_ _5"></span>它们会自动调用一些</div><div class="t m0 x2 h8 y1d ff2 fs5 fc0 sc0 ls0 ws0">超时处理函数做相关处理,以满足<span class="_ _16"> </span><span class="ff1">TCP/IP<span class="_ _16"> </span></span>协议栈的需求。这样看来,当<span class="_ _c"> </span><span class="ff1">L<span class="_ _3"></span>WIP<span class="_ _16"> </span><span class="ff2">协议栈阻塞</span></span></div><div class="t m0 x2 h8 y1e ff2 fs5 fc0 sc0 ls0 ws0">等待邮箱之前,<span class="_ _5"></span>它会精明的计算到底应该等待多久,<span class="_ _17"></span>如果<span class="_ _4"> </span><span class="ff1">L<span class="_ _3"></span>WIP<span class="_"> </span><span class="ff2">进程中没有初始化任何超时</span></span></div><div class="t m0 x2 h8 y1f ff2 fs5 fc0 sc0 ls0 ws0">事件,<span class="_ _8"></span>那好,<span class="_ _8"></span>这种情况最简单了,<span class="_ _8"></span>永远的挂起进程就可以了,<span class="_ _8"></span>这时的等待就可以看做是天长</div><div class="t m0 x2 h8 y20 ff2 fs5 fc0 sc0 ls0 ws0">地久的<span class="ff1">….</span>有点暧昧了。如果<span class="_ _15"> </span><span class="ff1">L<span class="_ _3"></span>WIP<span class="_ _15"> </span><span class="ff2">进程中有初始化的超时事件,这时就不能一直等了,因</span></span></div><div class="t m0 x2 h8 y21 ff2 fs5 fc0 sc0 ls0 ws0">为这样超时事件没有任何被执行的机会。<span class="_ _9"></span><span class="ff1">L<span class="_ _3"></span>WIP<span class="_"> </span><span class="ff2">是这样做的,<span class="_ _3"></span>等待邮箱的时间设置为第一个</span></span></div><div class="t m0 x2 h8 y22 ff2 fs5 fc0 sc0 ls0 ws0">超时事件的时间长度,<span class="_ _8"></span>如果时间到了,<span class="_ _8"></span>还没等到数据,<span class="_ _8"></span>那好,<span class="_ _8"></span>直接跳出邮箱等待转而执行超</div><div class="t m0 x2 h8 y23 ff2 fs5 fc0 sc0 ls0 ws0">时事件,<span class="_ _18"></span>当执行完成超时事件后,<span class="_ _18"></span>再按照上述的方法继续阻塞邮箱。<span class="_ _18"></span>可以看出,<span class="_ _18"></span>对一个<span class="_ _4"> </span><span class="ff1">L<span class="_ _3"></span>WIP</span></div><div class="t m0 x2 h8 y24 ff2 fs5 fc0 sc0 ls0 ws0">进程,<span class="_ _5"></span>需要用一个链表来管理这些超时事件。<span class="_ _17"></span>这个链表的大部分工作已经被<span class="_ _4"> </span><span class="ff1">L<span class="_ _3"></span>WIP<span class="_"> </span><span class="ff2">的设计者</span></span></div><div class="t m0 x2 h8 y25 ff2 fs5 fc0 sc0 ls0 ws0">完成了,<span class="_ _7"></span>使用者只需要实现的仅有一个函数:<span class="_ _7"></span>该函数能够返回当前进程个超时事件链表的首</div><div class="t m0 x2 h8 y26 ff2 fs5 fc0 sc0 ls0 ws0">地址。<span class="ff1">L<span class="_ _3"></span>WIP<span class="_"> </span><span class="ff2">内部协议要利用该首地址来查找完成相关超时事件。</span> </span></div><div class="t m0 xb h8 y27 ff2 fs5 fc0 sc0 ls0 ws0">其其其次,<span class="_ _17"></span>如果<span class="_ _4"> </span><span class="ff1">L<span class="_ _3"></span>WIP<span class="_"> </span><span class="ff2">是建立在多线程操作系统之上的话,<span class="_ _17"></span>则要实现创建一个新线程的</span></span></div><div class="t m0 x2 h8 y29 ff2 fs5 fc0 sc0 ls0 ws0">函数。不支持多线程的操作系统,<span class="_ _9"></span>汗<span class="ff1">…</span>表示还没听过。<span class="_ _9"></span>不过<span class="_ _4"> </span><span class="ff1">UC/OSII<span class="_"> </span></span>显然是支持多线程的,</div><div class="t m0 x2 h8 y2a ff2 fs5 fc0 sc0 ls0 ws0">地球人都知道。<span class="_ _5"></span>这样一个典型的<span class="_ _4"> </span><span class="ff1">L<span class="_ _3"></span>WIP<span class="_"> </span><span class="ff2">应用系统包括这样的三个进程:<span class="_ _17"></span>首先启动的是上层应</span></span></div><div class="t m0 x2 h8 y2b ff2 fs5 fc0 sc0 ls0 ws0">用程序进程,然后是<span class="_ _4"> </span><span class="ff1">L<span class="_ _3"></span>WIP<span class="_ _16"> </span><span class="ff2">协议栈进程,最后是底层硬件数据包接收发送进程。通常<span class="_ _4"> </span></span>L<span class="_ _3"></span>WIP</span></div><div class="t m0 x2 h8 y2c ff2 fs5 fc0 sc0 ls0 ws0">协议栈进程是在应用程序中调用<span class="_ _4"> </span><span class="ff1">L<span class="_ _3"></span>WIP<span class="_"> </span><span class="ff2">协议栈初始化函数来创建的。<span class="_ _17"></span>注意<span class="_ _4"> </span><span class="ff1">L<span class="_ _3"></span>WIP<span class="_"> </span><span class="ff2">协议栈进程</span></span></span></span></div><div class="t m0 x2 h8 y2d ff2 fs5 fc0 sc0 ls0 ws0">一般具有最高的优先级,以便实时正确的对数据进行响应。<span class="ff1"> </span></div><div class="t m0 xb h8 y2e ff2 fs5 fc0 sc0 ls0 ws0">其其其其次,<span class="_ _5"></span>其他一些细节之处。<span class="_ _8"></span>比如临界区保护函数,<span class="_ _5"></span>用于<span class="_ _4"> </span><span class="ff1">L<span class="_ _3"></span>WIP<span class="_"> </span><span class="ff2">协议栈处理某些临</span></span></div><div class="t m0 x2 h8 y2f ff2 fs5 fc0 sc0 ls0 ws0">界区时使用,<span class="_ _5"></span>一般通过进临界区关中断、<span class="_ _5"></span>出临界区开中断的方式来实现;<span class="_ _5"></span>又如结构体定义时</div><div class="t m0 x2 h8 y30 ff2 fs5 fc0 sc0 ls0 ws0">用到的结构体封装宏,<span class="_ _9"></span><span class="ff1">L<span class="_ _3"></span>WIP<span class="_"> </span><span class="ff2">的实现基于这样一种机制,<span class="_ _3"></span>即上层协议已经明确知道了下层所</span></span></div><div class="t m0 x2 h8 y31 ff2 fs5 fc0 sc0 ls0 ws0">传上来的数据的结构特点,<span class="_ _7"></span>上层直接使用相关取地址计算得到想要的数据,<span class="_ _7"></span>而避免了数据递</div><div class="t m0 x2 h8 y32 ff2 fs5 fc0 sc0 ls0 ws0">交时的复制与缓冲,<span class="_ _5"></span>所以定义结构体封装宏,<span class="_ _5"></span>禁止编译器的地址自动对齐是必须的;<span class="_ _5"></span>还有诸</div><div class="t m0 x2 h8 y33 ff2 fs5 fc0 sc0 ls0 ws0">如调试输出、测量记录方面的宏不做讲解。<span class="ff1"> </span></div><div class="t m0 xb h8 y34 ff2 fs5 fc0 sc0 ls0 ws0">最后,<span class="_ _2"></span>也<span class="_ _2"></span>是比<span class="_ _2"></span>较重<span class="_ _2"></span>要的<span class="_ _2"></span>地<span class="_ _2"></span>方。底<span class="_ _2"></span>层<span class="_ _2"></span>网络<span class="_ _2"></span>驱动<span class="_ _2"></span>函<span class="_ _2"></span>数的<span class="_ _2"></span>实现<span class="_ _2"></span>。这<span class="_ _2"></span>取决<span class="_ _2"></span>于<span class="_ _2"></span>你嵌<span class="_ _2"></span>入式<span class="_ _2"></span>硬件<span class="_ _2"></span>系统</div><div class="t m0 x2 h8 y35 ff2 fs5 fc0 sc0 ls0 ws0">所使用的网络接口芯片,<span class="_ _8"></span>也就是网卡芯片,<span class="_ _8"></span>常见的有<span class="_ _4"> </span><span class="ff1">R<span class="_ _3"></span>TL8201BL<span class="ff2">、<span class="_ _3"></span><span class="ff1">ENC<span class="_ _9"></span>28J60<span class="_"> </span><span class="ff2">等等。<span class="_ _8"></span>不同的</span></span></span></span></div><div class="t m0 x2 h8 y36 ff2 fs5 fc0 sc0 ls0 ws0">接口芯片厂商都会提供丰富的驱动函数。我们只要将这些发送接收接口函数做相应的封装,</div><div class="t m0 x2 h8 y37 ff2 fs5 fc0 sc0 ls0 ws0">将接收到得数据包封装为<span class="_ _4"> </span><span class="ff1">L<span class="_ _3"></span>WIP<span class="_"> </span><span class="ff2">协议栈熟悉的数据结构、<span class="_ _11"></span>将发送的数据包分解为芯片熟悉的</span></span></div><div class="t m0 x2 h8 y63 ff2 fs5 fc0 sc0 ls0 ws0">数据结构就基本搞定了。<span class="_ _6"></span>最起码的,<span class="_ _12"></span>发送一个数据包函数和接收一个数据包函数需要被实现。<span class="_ _6"></span><span class="ff1"> </span></div><div class="t m0 xb h8 y64 ff2 fs5 fc0 sc0 ls0 ws0">那就这<span class="_ _2"></span>样<span class="_ _2"></span>了吧<span class="_ _2"></span>,虽<span class="_ _2"></span>然写<span class="_ _2"></span>得<span class="_ _2"></span>草草,<span class="_ _2"></span>但<span class="_ _2"></span>终于<span class="_ _2"></span>在撤<span class="_ _2"></span>退<span class="_ _2"></span>之前<span class="_ _2"></span>搞定<span class="_ _2"></span>。好<span class="_ _2"></span>的开<span class="_ _2"></span>始<span class="_ _2"></span>是成<span class="_ _2"></span>功的<span class="_ _2"></span>一半<span class="_ _2"></span>,那</div><div class="t m0 x2 h8 y65 ff2 fs5 fc0 sc0 ls0 ws0">这暂且先算四分之一吧。<span class="_ _8"></span>不晓得一个月、<span class="_ _8"></span>两个月或者更多时间能写完否。<span class="_ _8"></span>预知后事如何,<span class="_ _8"></span>请</div><div class="t m0 x2 h8 y66 ff2 fs5 fc0 sc0 ls0 ws0">见下回分解。<span class="ff1"> </span></div></div><div class="pi" data-data='{"ctm":[1.611639,0.000000,0.000000,1.611639,0.000000,0.000000]}'></div></div>