搜索
bottom↓
回复: 5

基于Atmel的arm7芯片at91sam7x256的OpenTcp/Ip协议的完全移植

[复制链接]

出0入0汤圆

发表于 2006-7-12 17:52:46 | 显示全部楼层 |阅读模式
基于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周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2006-7-12 18:07:58 | 显示全部楼层
关注! 如果能提供些X256的资料就更好了,便于我们上手

出0入0汤圆

发表于 2006-7-14 18:19:36 | 显示全部楼层
谢谢无私提供

出0入0汤圆

发表于 2006-7-16 09:50:54 | 显示全部楼层
多谢啊

X256的资料可以到www.91arm.cn参考一下

还有A3和S64的一些资料

出0入0汤圆

发表于 2010-3-10 16:05:45 | 显示全部楼层
这个续。。。有点

出0入0汤圆

发表于 2011-4-11 14:51:25 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 23:40

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表