UCOS+UCTCP/IP 协议初步使用笔记

2009-10-28 10:16

http://hi.baidu.com/netee/blog/item/54fcca2c438434e58a1399f1.html

记录下来方便自己查阅。

UCOS-TCP/IP 协议

一、使用PHY为DM9161AE,用于管理接口讯问的地址在 /BSP/net_bsp.h中指定:

#define    EMAC_CFG_PHY_ADDR                              0x13                   

/*周立功 SMARTARM2300开发板上用的PHY是DM9161AE,*/
/*DM9161A的引脚29 28 27 26 即[0-3]中29 28被上拉,*/
                                                                                                                              /*CRS/PHYAD[4]上拉,所以地址为0x13*/

注:其它相关的以太网SRAM和PHY配置也多数在此文件中

二、以太网帧的最大帧长度是1518 字节

目标MAC
源MAC
类型
数据
FCS
6字节
6字节
2字节
46-1500字节
4字节

所以最小6+6+2+46+4 = 64,最大6+6+2+1500+4 = 1518。

三、TCP/IP接收,发送缓冲区数据:

以太网帧最大帧为1518字节,设置以太网SRAM接收缓冲区大小为1536字节,RAM接收RCV缓冲区的数组大小为1536,所以每次接收完毕后,SRAM接收缓冲区就会有新数据进来。

四、编译出错的解决方法:

(1)       WebUpgrade\WebUpgrade.c(165): error: #167: argument of type "struct sockaddr_in *" is incompatible with parameter of type "struct sockaddr *"

解:在UCOS II –TCP/IP中,socket的类型有两个struct sockaddr_in,struct sockaddr,在用户使用时,可以用sockaddr_in来定义,定义后,如果要使用,则最终需要转换为sockaddr类型,转换方式很简单,在需要在sockaddr_in前面加上(struct sockaddr *),即

(struct sockaddr *)sockaddr,如

struct sockaddr_in sockaddr_inServ   = {0};    /* TCP服务器和客户机地址结构体 */

sockaddr_inServ.sin_family = 0;

sockaddr_inServ.sin_port    = htons(80);     /* Http服务端口80 */

sockaddr_inServ.sin_addr.s_addr = inet_addr("192.168.10.240");

bind(MySockID, (struct sockaddr *)&sockaddr_inServ, sizeof(sockaddr_inServ))

五、使用的LPC2378芯片版本末尾为BY,为新版本,在代码中需要将NEW_SILICON的值设为1:

#define NEW_SILICON 1             

/* For LPC2378 silicon revisions ending in AY set to 1      */

/* Previous revisions, ending in -X or -Y set to 0      */

/* When 0, RMII GPIO work around is enabled for old silicon */

六、uCOSII工作核心原理是:近似地让最高优先级的就绪任务处于运行状态。

   因篇副限制,略。

七、修改 net_cfg.h中的

#define   NET_SOCK_CFG_BLOCK_SEL   NET_SOCK_BLOCK_SEL_BLOCK

#define   NET_SOCK_CFG_BLOCK_SEL   NET_SOCK_BLOCK_SEL_NO_BLOCK

即将SOCKET设置为非阻塞状态。

设置为非阻塞状态,在网页实时性上才更能发挥好的效果,如果使用阻塞状态,浏览网页时会表现为无法正常打开的现象。

八、LPC2378的以太网16K的RAM配置:包括发送缓冲区,接收缓冲区等在文件

uC-TCPIP/NIC/ETHER/LPC2378中的net_nic.h里设置

九、修改了 net_nic.c中的NetNIC_TxPkt函数

十、修改net_phy.c中的

NetNIC_PhyRegWr(EMAC_CFG_PHY_ADDR, MII_BMCR, reg_val, perr);

NetNIC_PhyRegWr(EMAC_CFG_PHY_ADDR, MII_BMCR,0x9200, perr);

十一、关于 LPC2378的EMAC访问控制PHY的说明:

void NetNIC_PhyRegWr (CPU_INT08U phy,

                       CPU_INT08U reg,

                       CPU_INT16U val,

                       NET_ERR    *perr)

这个函数是通过EMAC来访问控制PHY的一个功能函数,其中:

phy : 是指与LPC2378相连的PHY的地址,

reg: 是指需要访问控制的PHY芯片上的寄存器,

val: 是指需要对PHY芯片上的寄存器写入的值。

十二、UCOS官方提供的TCP/IP源码因免费的原因,所以未提供完整的代码。

在 net_inc.c中,处理IF层的发送函数因为没有被提供信息量,所以一直处于假死状态,不能正常发送数据包,所以需要修改函数,为其增加中断处理函数,发送相应的信号量给发送函数,具体如下:

static void NetNIC_TxISR_Handler (void) 

      NetOS_NIC_TxRdySignal();
                      /* ISR are previously read in NetNIC_ISR_Handler().    */ 

                       /* ------------- POST TX COMPLETE SIGNAL ------------- */ 

}  

十三、关于字符串定义,数组的赋值以及地址调用等问题:

定义字符串方法有:

unsigned char text1[] = {“there are strings.”}; 本数组的地址为 &text1;或者

(unsigned char *)text1;或者 &text1[0],但在使用&text1[0]时,有时候会使编译出错。

unsigned char *text1 = {“there are strings.”};l 本指针地址为 &text1;

十四、关于UCOS 中任务堆栈的问题:

程序运行过程,当某一任务运行到某处时就会跑飞,而其他任务却可以正常运行,那说明跑飞的任务在初始化时设的任务堆栈的大小可能有问题,需要增加堆栈的大小。

posted on 2011-08-01 13:04  xilentz  阅读(4492)  评论(0编辑  收藏  举报