[原创]在UC/OS-II下移植LwIP-1.2.0[日志之修改原文件]

                     在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>去掉,否则将会报错!出错信息如下:

[原创]在UC/OS-II下移植LwIP-1.2.0[日志之修改原文件] - 小盒子 - 小盒子的小盒

    原来这些宏与本地库提供的宏产生了冲突。这几个宏在<errno.h>中已经定义,而sockets.c文件使用了这个头文件,因此产生了重定义错误,我们只需在sockets.c文件中屏蔽掉相关的include语句即可。

2.当编译的时候出现以下错误:

[原创]在UC/OS-II下移植LwIP-1.2.0[日志之修改原文件] - 小盒子 - 小盒子的小盒

原函数是在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属性(如下图所示),编译器在默认情况下就会报错。

[原创]在UC/OS-II下移植LwIP-1.2.0[日志之修改原文件] - 小盒子 - 小盒子的小盒[原创]在UC/OS-II下移植LwIP-1.2.0[日志之修改原文件] - 小盒子 - 小盒子的小盒

修改的办法有两种,一种可以将原函数修改一下即可:

例如:

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的配置信息:

如下图所示:

[原创]在UC/OS-II下移植LwIP-1.2.0[日志之修改原文件] - 小盒子 - 小盒子的小盒

把红色的选项去掉即可解决。。。。。。

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值