🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
采用查询的方式虽然可行,但是这种方式的效率不高,因为查询就要CPU去看看有没有数据,就像一个人在房子中等朋友过来,但是不知道朋友什么时候来,那主人就要每隔一段时间去看看朋友有没有过来,这样子就占用了大量的资源,主人也没能做其他事情,而如果在门口装一个门铃,朋友来的时候就按下门铃,主人就知道朋友来了,就出去迎接,这样子就不会占用主人的时间,主人可以做其他事情。同样的,我们可以使用中断方式来接收数据,当接收完成的时候,就通知CPU来处理即可,当然,还需要我们编写对应的中断服务函数ETH\_IRQHandler(),具体见代码清单 7‑9。 ``` 1 int flag = 0; 2 int main(void) 3 { 4 //板级外设初始化 5 BSP_Init(); 6 7 //LwIP协议栈初始化 8 LwIP_Init(); 9 10 while (1) 11 { 12 if (flag) 13 { 14 flag = 0; 15 //调用网卡接收函数 16 ethernetif_input(&gnetif); 17 } 18 //处理LwIP中定时事件 19 sys_check_timeouts(); 20 } 21 } 22 23 void ETH_IRQHandler(void) 24 { 25 26 HAL_ETH_IRQHandler(&heth); 27 28 } 29 30 void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth) 31 { 32 flag = 1; 33 // LWIP_Process(); 34 } ``` 当我们编译并下载好程序,同样用ping命令去ping一下开发板,其结果具体见图 7‑15,说明说明我们的中断方式的接收也是能正常工作的。 ![](https://box.kancloud.cn/6e4c15eb5e92cb376450bc8ecc061b78_556x342.png)