在UC/OS-II下移植LwIP-1.2.0
作者:小盒子 大连 2007.02.13
在http://download.savannah.nongnu.org/releases/lwip/下载的最新版本LwIP-1.2.0后,将修改原文件才能顺利通过ADS的编译。
1.将LwIP-1.2.0下api->sockets.c中#include <errno.h>去掉,否则将会报错!出错信息如下:
原来这些宏与本地库提供的宏产生了冲突。这几个宏在<errno.h>中已经定义,而sockets.c文件使用了这个头文件,因此产生了重定义错误,我们只需在sockets.c文件中屏蔽掉相关的include语句即可。
2.当编译的时候出现以下错误:
原函数是在netif->ppp->vjbsdhdr.h中
原函数为:
PACK_STRUCT_BEGIN
struct ip
{
#if defined(NO_CHAR_BITFIELDS)
u_char ip_hl_v; /* bug in GCC for mips means the bitfield stuff will sometimes break - so we use a char for both and get round it with macro's instead... */
#else
#if BYTE_ORDER == LITTLE_ENDIAN
unsigned ip_hl:4, /* header length */
ip_v:4; /* version */
#elif BYTE_ORDER == BIG_ENDIAN
unsigned ip_v:4, /* version */
ip_hl:4; /* header length */
#else
//COMPLAIN - NO BYTE ORDER SELECTED!
#endif
#endif
u_char ip_tos; /* type of service */
u_short ip_len; /* total length */
u_short ip_id; /* identification */
u_short ip_off; /* fragment offset field */
#define IP_DF 0x4000 /* dont fragment flag */
#define IP_MF 0x2000 /* more fragments flag */
#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */
u_char ip_ttl; /* time to live */
u_char ip_p; /* protocol */
u_short ip_sum; /* checksum */
struct in_addr ip_src,ip_dst; /* source and dest address */
};
PACK_STRUCT_END
将其修改成以下格式:
PACK_STRUCT_BEGIN
struct ip
{
#if defined(NO_CHAR_BITFIELDS)
u_char ip_hl_v; /* bug in GCC for mips means the bitfield stuff will sometimes break - so we use a char for both and get round it with macro's instead... */
#else
#if BYTE_ORDER == LITTLE_ENDIAN
unsigned ip_hl:4, /* header length */
ip_v:4; /* version */
#elif BYTE_ORDER == BIG_ENDIAN
unsigned ip_v:4, /* version */
ip_hl:4; /* header length */
#else
//COMPLAIN - NO BYTE ORDER SELECTED!
#endif
#endif
u_char ip_tos; /* type of service */
u_short ip_len; /* total length */
u_short ip_id; /* identification */
u_short ip_off; /* fragment offset field */
#define IP_DF 0x4000 /* dont fragment flag */
#define IP_MF 0x2000 /* more fragments flag */
#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */
u_char ip_ttl; /* time to live */
u_char ip_p; /* protocol */
u_short ip_sum; /* checksum */
PACK_STRUCT_FIELD(struct in_addr ip_src); /* source and dest address */
PACK_STRUCT_FIELD(struct in_addr ip_dst); //Modify by SmallBox at 2007.02.13
}PACK_STRUCT_STRUCT;
PACK_STRUCT_END
然后还要修改的文件有:include/ipv4/lwip/ip_addr.h
struct in_addr {
u32_t s_addr;
};
将原来的函数修改成一下形式:
PACK_STRUCT_BEGIN
struct in_addr {
PACK_STRUCT_FIELD(u32_t s_addr);
}PACK_STRUCT_STRUCT;
PACK_STRUCT_END
即可编译通过。
3.指针类型不匹配错误。造成这个错误的原因是__packed限定词,如果把具备__packed属性的指针变量赋值为普通的指针变量就会丢失__packed属性(如下图所示),编译器在默认情况下就会报错。
修改的办法有两种,一种可以将原函数修改一下即可:
例如:
core->ipv4->ip.c中的
inet_chksum(iphdr, iphdrlen)
修改成:
inet_chksum((void *)iphdr, iphdrlen)
又如:
netif/etharp.c中
memcpy(&sipaddr, &hdr->sipaddr, sizeof(sipaddr));
memcpy(&dipaddr, &hdr->dipaddr, sizeof(dipaddr));
修改成:
memcpy((void *)&sipaddr, (void *)&hdr->sipaddr, sizeof(sipaddr));
memcpy((void *)&dipaddr,(void *) &hdr->dipaddr, sizeof(dipaddr));
这样都可以解决,还有一种办法就是修改ADS的配置信息:
如下图所示:
把红色的选项去掉即可解决。。。。。。