首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

helper2416_lwip_移植小结(转)

helper2416_lwip_移植小结(转)

好吧,我第一次移植lwip被卡这么长时间,就是ping不通啊,在很多平台上面移植过,工作中也常使用它,这次在s3c2416上面卡住了。小结一下,主要问题有以下几点:
1)uCOSII不太熟悉,之前都是采用FreeRTOS,总的来说ucos的函数比较冗余繁杂,当然不是说他不好,是个人用惯了freeRTOS的风格之后的主观看法。
2)自己的uCOSii可能还有不稳定的地方,比如说使用大量的长的printf就会abort异常,这个原因一直没找到。当然可能是MMU配置的问题。
3)lan9220的驱动有一些小问题,不够完善,需要花时间去校正,主要是核对一些寄存器配置。

这几天也算是做了一些事情,可能是我比较吹毛求疵的缘故,我总是习惯去把底层的东西写好,写完整,写的有价值。网络协议栈移植的性能好坏主要依赖两个主要函数实体的实现。
1)err_t low_level_output(struct netif *netif, struct pbuf *p)
2)struct pbuf *low_level_input(struct netif *netif)

最后体现在网络接口结构体struct netif中的三个函数

  /** This function is called by the network device driver
   *  to pass a packet up the TCP/IP stack. */
  err_t (* input)(struct pbuf *p, struct netif *inp);

  /** This function is called by the IP module when it wants
   *  to send a packet on the interface. This function typically
   *  first resolves the hardware address, then sends the packet. */
  err_t (* output)(struct netif *netif, struct pbuf *p, struct ip_addr *ipaddr);


  /** This function is called by the ARP module when it wants
   *  to send a packet on the interface. This function outputs
   *  the pbuf as-is on the link medium. */
  err_t (* linkoutput)(struct netif *netif, struct pbuf *p);


这个是比较关键的,直接影响协议栈的性能,实现起来需要借助各种OS机制(这里不讨论noOS):queue, mbox, sem等。
raw-os有自己的一套东西,基本算是一种类队列处理的方式,有兴趣的可以看一下,还不错。

其次,我使用raw-os的程序,添加ping_test中的网络初始化部分,修改ip一致后发现ping不通,大家可以试一下,反馈一些结果。

就是这部分了,屏蔽掉无关的测试,如CLI,下面的是我基于uCOSII的移植网络加载部分程序
  • /* 添加网络接口到netif_list,分配一个netif结构体并传递指针到该结构体,作为第一个参数 */
  •     /* 初始化网络函数指针必须指向实际的网络接口初始化函数 */
  •     netif_add(&netif0, &ipaddr, &netmask, &gw, &lan9220_emac_dev, eernetif_init, &tcpip_input);
  •     /* 注册默认网络接口 */
  •     netif_set_default(&netif0);
  •     /* 当网口接口完全配置好之后需要调用该函数 */
  •     netif_set_up(&netif0);

复制代码


好了,说一些我的一些校对工作,主要关于LAN9220这一部分的。

1)S3C2416 EMAC中断配置
  • /**
  • * @brief  eth_interrupt_init
  • * @note   ETH中断初始化
  • * @param  none
  • * @retval none
  • */
  • void eth_interrupt_init(void)
  • {
  •         /* 清除GPG7模式配置位 */
  •         GPGCON_REG &= ~(0x03<<14);
  •         /* 配置GPG7为EINT15功能 */
  •         GPGCON_REG |= (2<<14);
  •         /* 禁止EINT15上拉下拉电阻 */
  •         GPGPU_REG  &= ~(3<<14);
  •         /* 使能EINT8_15中断模式 */
  •         INTMOD_REG &= ~(1<<5);
  •         /* EINT8_15中断有效 */
  •         INTMSK_REG &= ~(1<<5);
  •         /* 下降沿中断 */
  •         EINTCON1_REG |= 0x80000000;
  •         EINTCON1_REG &= ~(0x05<<28);
  •         /* 注册服务函数 */
  •         register_irq(5, eth_ISR_service);
  •         /* 确保全局中断禁止,在连接ISR之前 */
  •         reg_write(INT_EN, 0);
  •         reg_write(INT_STS, 0xFFFFFFFF);
  •         /* 使能外部15中断 */
  •         EINTMASK_REG &= ~(1<<15);
  • }

复制代码
我记得有一些改动,具体不记得了,有不少地方修改了,参考相关寄存器说明
继承事业,薪火相传
返回列表