|
基于Atmel的arm7芯片at91sam7x256的OpenTcp/Ip协议的完全移植
目前at91sam7x256在atmel官方网站上所能提供的TCP/IP协议有TCP/IP 堆栈包括 SICS uIP/lwIP(开放源码),uC/TCP-IP(免专利权使用费)以及 CMX MicroNet(免专利权使用费),但是例程是基于FreeRTOS和uC/OS操作系统,这给不想用操作系统的用户带来不便,这里我推荐完全免费且源码公开的OpenTcp/Ip协议。但是opentcp中没有的协议包括telnet,netbios。OpenTcp/Ip协议可以在其官方网站www.opentcp.org上下载。
目前完成的移植有arp,icmp ,tcp,ip,udp,dhcp,http,netbios(自己编写)
移植OpenTcp关键是要自己做好x256跟OpenTcp函数的接口。
现在根据我移植协议完毕后的心得总结以下几点。
1. OpenTcp是专门针对8位/16位机的,而x256为32位机,所以在OpenTcp种的UINT16位16位,而在x256中为32位,所以要改成#define UINT16 unsinged short int.否则当进行IP校验和等操作的时候会出现问题。
2. X256的接收是128字节一个buffer,你可以定义多个buffer,但是当接收的一个数据帧大于128字节的时候,那么从recevie buffers中读取到的帧长度讲为0。这个长度究竟是多少?我提供一个段程序,大家看后可以明白。其中biglength为实际接收到的总长度。
3.
while( ( RxtdList[ buf ].addr & AT91C_OWNERSHIP_BIT ) && !buflength )
{
pData = ( char * )( RxtdList[ buf ].addr & 0xfffffffc );
buflength = RxtdList[ buf ].U_Status.status & AT91C_LENGTH_FRAME;
buff=buf;
RxtdList[ buf ].addr &= ~( AT91C_OWNERSHIP_BIT );
if( buflength == 0 )
{
if( ( bufstart + ETH_RX_BUFFER_SIZE ) <= UIP_BUFSIZE )
{
(void)memcpy( &( uip_buf[ bufstart ] ), pData, ETH_RX_BUFFER_SIZE );
bufstart += ETH_RX_BUFFER_SIZE;
biglength+=ETH_RX_BUFFER_SIZE;
}
}
else
{
if( buflength < UIP_BUFSIZE )
{
if( buflength > bufstart )
{
(void)memcpy( &( uip_buf[ bufstart ] ), pData, ( buflength - bufstart ) );
biglength+=(buflength - bufstart);
}
}
}
}
4.在移植http协议的时候,我建议发送网页不以二进制文件的形式发送,最好在X256的RAM中开辟一段发送缓冲,先把HTML语言的存储在这段缓冲中,然后再从这里调用发送,这样当接收CGI函数后处理的时候比较方便,比如你需要判断网页中某个数据。
5. 下面是一段接收网络协议的处理过程,放在主函数中。
if(Receive()!=FALSE)
{
switch(SWAP16(received_frame.protocol))
{
case 0x806:
process_arp(&received_frame);
break;
case PROTOCOL_IP:
len = process_ip_in(&received_frame);
if(len < 0)
{
break;
}
switch(received_ip_packet.protocol)
{
case IP_ICMP:
#ifndef pingflag
process_icmp_in(&received_ip_packet,len);
AT91F_DBGU_Printk("------192.168.0.44 Ping AT91SAM7X256----
\r");
#endif
break;
case IP_UDP:
fudp = process_udp_in(&received_ip_packet,len);
if(fudp < 0)
{
break;
}
break;
case IP_TCP:
(void)process_tcp_in(&received_ip_packet,len);
TCPnum++;
break;
default:
break;
}
default:
break;
}
}
未完待续。。。。。。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|