- UID
- 1029342
- 性别
- 男
|
好吧,我第一次移植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);
- }
复制代码
我记得有一些改动,具体不记得了,有不少地方修改了,参考相关寄存器说明 |
|