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