原文地址:https://blog.csdn.net/zhzht19861011/article/details/6221699
以太网中断服务程序代码如下:
[cpp] view plain copy
- void
- lwIPEthernetIntHandler(void)
- {
- unsigned long ulStatus;
-
- //
- // Read and Clear the interrupt.
- // 读并清除中断标志,这个中断是由软件触发的,所以要检查一下中断状态看看是否真的有中断发生
- ulStatus = EthernetIntStatus(ETH_BASE, false);
- EthernetIntClear(ETH_BASE, ulStatus);
-
- //
- // If a transmit/rx interrupt was active, run the low-level interrupt
- // handler.
- // 如果一个发送/接收中断被激活,运行底层中断处理程序.
- if(ulStatus)
- { //这个函数将从群星以太网FIFO中读取数据包放到pbuf队列.这个pbuf队列可以供更高级一层调用.
- //如果发送器空闲并且至少有一个包在发送队列,会将它发送到FIFO并开始发送.
- stellarisif_interrupt(&lwip_netif); //注1
- }
-
- #if NO_SYS
- //
- // If no RTOS is enabled, then we do all lwIP procesing in the interrupt.
- // 如果不使用RTOS,那么所有的lwIP处理都在中断中实现
-
- //
- // Service any packets on the receive queue.
- // 接收队列上的任何包处理 当已经准备好从接口中读取数据时,这个函数被调用.它使用 底层ethernet_input()
- // 函数处理来自网络接口的实际接收数据.它会根据已经接收的数据包类型来调用
- // 适当的input函数.
- stellarisif_input(&lwip_netif); //注2
-
- //
- // Service the lwIP timers.
- // lwIP定时器处理
- lwIPServiceTimers();
- #endif
- }
这个函数是以太网中断处理函数,处理lwIP TCP/IP协议栈的以太网中断。这个中断服务函数并非是接收到或发送出一个以太网包后由硬件触发,而是在SysTick定时器中断处理函数中软件触发的。这个函数处于TCP/IP协议的最底层,它将所有接收到的数据包放在可供高层处理的数据包队列中(pbuf链中),并检查发送数据队列是否为空,必要时通过以太网MAC地址发送数据。如果系统不使用RTOS,则lwIP的其他工作也在这个中断服务函数中执行,如处理接收的包或者处理lwIP定时器。 以太网中断服务函数(lwIPEthernetIntHandler(void))首先调用EthernetIntStatus (ETH_BASE, false)函数来检查以太网中断状态,因为这个以太网中断并非是硬件触发。可能并没有接收或发送以太网数据,但SysTick定时器中断服务函数仍尽忠职守的周期性触发这个以太网中断。之后,无论有无以太网中断,以太网中断服务函数都会调用EthernetIntClear(ETH_BASE, ulStatus)函数来清除以太网中断标志位。
|