基于群星ARM的lwIP以太网中断分析

以太网中断服务程序代码如下:

这个函数是以太网中断处理函数,处理lwIP TCP/IP协议栈的以太网中断。这个中断服务函数并非是接收到或发送出一个以太网包后由硬件触发,而是在SysTick定时器中断处理函数中软件触发的。这个函数处于TCP/IP协议的最底层,它将所有接收到的数据包放在可供高层处理的数据包队列中(pbuf链中),并检查发送数据队列是否为空,必要时通过以太网MAC地址发送数据。如果系统不使用RTOS,则lwIP的其他工作也在这个中断服务函数中执行,如处理接收的包或者处理lwIP定时器。

以太网中断服务函数(lwIPEthernetIntHandler(void))首先调用EthernetIntStatus (ETH_BASE, false)函数来检查以太网中断状态,因为这个以太网中断并非是硬件触发。可能并没有接收或发送以太网数据,但SysTick定时器中断服务函数仍尽忠职守的周期性触发这个以太网中断。之后,无论有无以太网中断,以太网中断服务函数都会调用EthernetIntClear(ETH_BASE, ulStatus)函数来清除以太网中断标志位。

如果检测到一个TXRX中断,则首先调用stellarisif_interrupt(&lwip_netif)函数,这个函数会循环调用low_level_receive(netif)函数,从群星以太网FIFO中读取全部数据包放到pbuf中,并使用enqueue_packet(p, &ethernetif->rxq)函数将每个pbuf压入pbuf队列中,这个pbuf队列可以供更高级一层调用.之后检查发送器,如果发送器空闲并且至少有一个包在发送队列,会将它发送到FIFO并开始发送。stellarisif_interrupt(&lwip_netif)函数代码如下所示:

 

如果应用程序不使用RTOS,则会在这个中断服务函数中处理一些其它的事情,主要是处理从以太网FIFO中读取的数据以及更新lwIP时钟。

stellarisif_input(&lwip_netif)函数处理来自以太网RX FIFO的数据,它会根据已经接收的数据包类型来调用适当的input函数。在stellarisif_input(&lwip_netif)函数中主要调用了ethernet_input(p, netif)函数,该函数根据以太网包的类型使用switch...case语句来调用不同的函数,比如htons(ethhdr->type)== ETHTYPE_IP,说明这是一个IP包,则调用ip_input(p, netif)函数。stellarisif_input(&lwip_netif);函数如下所示:       

 

 

 

 

 

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值