LWIP-1.3.0在S3C2440平台UCOS-II-2.8.6系统上的移植过程DEBUG

[复制链接]
 楼主| gzweiyan 发表于 2008-5-4 14:11 | 显示全部楼层 |阅读模式
<br />伟研科技,专注于linux&nbsp;系统移植及应用开发<br /><a href="http://www.gzweiyan.com/" target=_blank>http://www.gzweiyan.com/</a><br /><br />LWIP-1.3.0在S3C2440平台UCOS-II-2.8.6系统上的移植过程DEBUG<br /><br />1.内存池地址对齐问题<br />timer&nbsp;tcon=00500000,&nbsp;tcnt&nbsp;dc7e,&nbsp;tcfg&nbsp;00000200,00000000<br />uC/OS-II,&nbsp;The&nbsp;Real-Time&nbsp;Kernel&nbsp;ARM&nbsp;Ported&nbsp;version<br />Jean&nbsp;J.&nbsp;Labrosse/&nbsp;(Ported&nbsp;by)&nbsp;Michael&nbsp;Anburaj<br />WEIYAN&nbsp;TECHNOLOGY&nbsp;http://www.gzweiyan.com<br />Task1&nbsp;#1<br />TCP/IP&nbsp;initialized.<br />11111111111<br />1:0:16:13<br />2:0:16:13<br />3:0:16:13<br />1:1:16:13<br />Dabort&nbsp;exception!!!<br /><br />跟踪一下,发现问题在memp_init初始化时memp-&gtnext访问的地址没有对齐。<br />memp_init(void)<br />{<br />……<br />&nbsp;&nbsp;memp&nbsp;=&nbsp;LWIP_MEM_ALIGN(memp_memory);<br />&nbsp;&nbsp;/*&nbsp;for&nbsp;every&nbsp;pool:&nbsp;*/<br />&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;MEMP_MAX;&nbsp;++i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;memp_tab&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;create&nbsp;a&nbsp;linked&nbsp;list&nbsp;of&nbsp;memp&nbsp;elements&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt&nbsp;memp_num;&nbsp;++j)&nbsp;{if(i&gt12)CONSOL_Printf(&quot;1:%d:%d:%d
&quot;,j,memp_num,i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memp-&gtnext&nbsp;=&nbsp;memp_tab;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memp_tab&nbsp;=&nbsp;memp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memp&nbsp;=&nbsp;(struct&nbsp;memp&nbsp;*)((u8_t&nbsp;*)memp&nbsp;+&nbsp;MEMP_SIZE&nbsp;+&nbsp;memp_sizes);<br />……<br />}<br /><br />#define&nbsp;LWIP_MEM_ALIGN(addr)&nbsp;((void&nbsp;*)(((mem_ptr_t)(addr)&nbsp;+&nbsp;MEM_ALIGNMENT&nbsp;-&nbsp;1)&nbsp;&&nbsp;~(mem_ptr_t)(MEM_ALIGNMENT-1)))<br /><br />memp-&gtnext访问时需要4字节对齐的地址。而默认的MEM_ALIGNMENT为1,通过LWIP_MEM_ALIGN调整的地址为1字节对齐,故出现该错误。定义<br /><br />MEM_ALIGNMENT为4使调整的地址以4字节对齐,问题解决。<br /><br /><br />2.ip头部对齐<br />当接收到http访问的IP包时,再次出现Dabort&nbsp;exception!!!错误。<br />再次跟踪(幸好有个仿真器,不然累死…),发现在ip_input里<br />if&nbsp;(ip_addr_cmp(&(iphdr-&gtdest),&nbsp;&(netif-&gtip_addr))&nbsp;||<br /><br />这一句有问题,iphdr-&gtdest存放在2字节对齐的内存里,而ip_addr_cmp访问时一次读入4个字节,需4字节对齐。由iphdr&nbsp;=&nbsp;p-&gtpayload跟踪<br /><br />payload存放的地址,当驱动收到以太包上传时,payload是指向4字节对齐的地址。但进入ethernet_input,再传给ip_input后,payload的地<br /><br />址发生了变化,增加了14个字节,导致字节对齐出现问题。仔细一看,发现问题在这一句:<br />if(pbuf_header(p,&nbsp;-(s16_t)sizeof(struct&nbsp;eth_hdr)))&nbsp;{<br /><br />当跳过已处理的物理地址时,sizeof(struct&nbsp;eth_hdr)恰好为14字节…<br />问题的解决也很简单,LWIP已经准备了硬件地址补齐的预定义,使用<br />#define&nbsp;ETH_PAD_SIZE&nbsp;&nbsp;&nbsp;&nbsp;2<br />补齐2字节即可。<br /><br />3.系统配置<br />UCOS默认配置的队列控制块OS_MAX_QS和事件控制块OS_MAX_EVENTS分别为4和10,当创建多个lwip进程时,会出现资源不足导致程序失败的,需<br /><br />增加这些系统资源。<br />//#define&nbsp;OS_MAX_EVENTS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;32<br />#define&nbsp;OS_MAX_QS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10<br /><br />4.全局字符变量的对齐问题<br />真佩服ADS的编译器,这次的问题还是字节对齐的问题。在http任务里,定义的两个全局字符数组,编译器生成的访问地址竟然在奇数开始的地<br /><br />址,当16位的网卡发送访问该地址时会出现data&nbsp;abort的错误。这回真的头都大了…使用__packet和align都没有效果。到时有2个办法可以使<br /><br />用,1是数组放到函数内,二是自己定义一个结构体,在第一个字节处自己填充一个0,第二个字节处存放真实的数据。<br /><br />有关ARM平台字节对齐的一篇**(感觉解析很透彻)<br />http://www.cpper.com/zweily/68.html<br /><br />5.数据分包大小<br />移植好的HTTP&nbsp;server工作很正常,但修改一下输出的内容,发现又不能工作---__---<br />重复修改输出的内容,发现一超过128字节时,程序工作不正常。用Wireshark抓包,发现输出的内容被切割成多个小包。一把抓住一个,仔细<br /><br />一看,发现一个数字很熟悉,就是MSS=128。<br />http://www.gzweiyan.com/uploads/userup/0805/032259122327.jpg<br /><br />查了下资料,MSS就是最大的分包大小。设为以太网可以接受的1450,一切OK。<br /><br />当一切搞定后,现在来看看我们移植的成果:<br />ping&nbsp;开发板的ip&nbsp;192.168.1.174,返回正常。在UCOS心跳时间为5ms,dm9000驱动接收间隔为10ms的情况下,平均2ms的返回时间有点出乎意料。<br />http://www.gzweiyan.com/uploads/userup/0805/0323003320E.jpg<br /><br />下面是LWIP带的一个简单HTTP&nbsp;server,修改一下就能很好的工作。<br />http://www.gzweiyan.com/uploads/userup/0805/0323024R544.jpg<br /><br /> 相关链接:<a href='http://www.gzweiyan.com/html/embedded/20080503/32.html'>http://www.gzweiyan.com/html/embedded/20080503/32.html</a>
 楼主| gzweiyan 发表于 2008-5-4 17:11 | 显示全部楼层

专注于Linux系统移植及应用开发

专注于Linux系统移植及应用开发<br />谢谢关注,http://www.gzweiyan.com/<br /> <br /> 相关链接:<a href='http://www.gzweiyan.com/'>http://www.gzweiyan.com/</a>
您需要登录后才可以回帖 登录 | 注册

本版积分规则

52

主题

146

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

52

主题

146

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部