STM32F103移植LWIP,程序跑的不知去向。究竟什么原因?

[复制链接]
8336|11
 楼主| lihaiping1603 发表于 2013-1-15 09:22 | 显示全部楼层 |阅读模式
先上我的程序:
err_t
ethernetif_input(struct netif *netif)
{
  struct ethernetif *ethernetif;
//  struct eth_hdr *ethhdr;
  struct pbuf *p;
  err_t err;

  ethernetif = netif->state;


  printf("已进入ethernetif_input.\r\n");

  /* move received packet into a new pbuf */
  p = low_level_input(netif);

  printf("low_level_input已返回.\r\n");//这条语句有输出,说明程序执行了这条语句


  /* no packet could be read, silently ignore this */
  if (p == NULL)
  
  {
  printf("p=NULL.\r\n");
  return ERR_MEM;}   
//这里是我参照ST官方的方法进行移植的代码,我们不打算在这个函数里进行数据的提交
//而是调用netif->input回调函数来进行数据的分析和提交
        err = netif->input(p, netif);
   printf("netif->input已返回.\r\n");
  if (err != ERR_OK)
  {
    LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
    pbuf_free(p);
    p = NULL;
  }

  return err;

//下面是官方的处理方式,他们是打算由这个函数对接收的数据进行处理,然后根据数据类型的不同,递交上层
//分ip和arp两种类型进行处理
  /* points to packet payload, which starts with an Ethernet header */
//  ethhdr = p->payload;

//  switch (htons(ethhdr->type)) {
  /* IP or ARP packet? */
//  case ETHTYPE_IP:
//  case ETHTYPE_ARP:
//#if PPPOE_SUPPORT
  /* PPPoE packet? */
//  case ETHTYPE_PPPOEDISC:
//  case ETHTYPE_PPPOE:
//#endif /* PPPOE_SUPPORT */
    /* full packet send to tcpip_thread to process */
//    if (netif->input(p, netif)!=ERR_OK)
//     { LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
//       pbuf_free(p);
//       p = NULL;
//     }
//    break;

//  default:
//    pbuf_free(p);
//    p = NULL;
//    break;
//  }
}


串口打印数据输出:
已进入ethernetif_input.
已进入low_level_input.
EIR=72.
已进入enc28j60PacketReceive.
EIR=72.
EIR=72.
EIR=8.
enc28j60PacketReceive返回.
20000160
enc28j60PacketReceive已返回.
接收到的数据长度len=60.
EIR=8.
low_level_input已返回.

这是整个调试信息和程序,其中LWIP初始化中netif_add(&netif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &ethernet_input);且在ethernet_input函数中我也放进去了串口输出,但为什么在low_level_input函数返回以后,函数下面的所有语句都没有数据显示?也就以为着,跟踪过程丢失,程序不知道跑哪里去了?怎么回事?
MariaBrook 发表于 2013-1-15 12:22 | 显示全部楼层
没有显示的那个函数可能发生了HardFault,建议在HardFault_Handler中断函数中加上显示语句
一般来说,在函数里定义了大规模的数组或者指针指飞了,都有可能发生HardFault,现象和楼主的一模一样

评分

参与人数 1威望 +1 收起 理由
lihaiping1603 + 1 很给力!

查看全部评分

 楼主| lihaiping1603 发表于 2013-1-15 18:06 | 显示全部楼层
MariaBrook 发表于 2013-1-15 12:22
没有显示的那个函数可能发生了HardFault,建议在HardFault_Handler中断函数中加上显示语句
一般来说,在函 ...

嗯,是指针越界,所以跑飞了,呵呵。。。
dyf1003 发表于 2013-1-15 20:50 | 显示全部楼层
拿起书本 发表于 2013-1-15 21:56 | 显示全部楼层
80%以上的这类异常都是数组越界和指针乱指引起的
weiliao1 发表于 2013-1-24 16:25 | 显示全部楼层
您好 请问您是怎样解决的 我也是这个问题 程序运行到err = netif->input(p,netif)就会产生错误(硬中端),该怎么解决?谢谢
 楼主| lihaiping1603 发表于 2013-2-18 17:41 | 显示全部楼层
我把指针改为了数组,程序运行正常
weicz 发表于 2013-5-6 11:35 | 显示全部楼层
请问你stm32f103具体什么型号,ram多大?我的stm32f103c8,20k ram,放不下ucos+lwip啊
 楼主| lihaiping1603 发表于 2013-5-7 11:03 | 显示全部楼层
weicz 发表于 2013-5-6 11:35
请问你stm32f103具体什么型号,ram多大?我的stm32f103c8,20k ram,放不下ucos+lwip啊 ...

VC,那就裁剪下了,或者外部拓展RAM了?呵呵
weicz 发表于 2013-5-7 12:09 | 显示全部楼层
lihaiping1603 发表于 2013-5-7 11:03
VC,那就裁剪下了,或者外部拓展RAM了?呵呵

哦,VC不错,ram我的两倍多。。。
alating925 发表于 2013-11-30 10:39 | 显示全部楼层
huangfeng33 发表于 2013-12-5 16:30 | 显示全部楼层
函数里分配空间实在堆栈上分配的,堆栈是比较有限的,分配那么大的空间是不允许的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

16

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部