关键流程设计
- 线路链接状态检测任务
线路链路状态检测任务是周期轮询的任务,轮询时间一般为 1S 或 2S。主要功能是实时检测当前 网络链路的链接状态,一旦网络链路状态发生改变,就通过当前的链路状态选择当前以太网的打开状态
- 网卡数据包输入任务
网络包接收任务可以是周期轮询的任务也可以是事件驱动型的任务,主要取决于产品需求。 主要功能是与硬件 DMA 进行协作,读取当前 DMA 已经搬运完成的数据包,并将缓冲区还给 DMA。 然后再将接收完成的数据包交给协议栈任务进行处理
- 协议栈处理任务
协议栈处理任务为事件驱动型任务,为以太网驱动的核心。事件的来源可以是网络包接收任务、 超时事件、也可以是协议栈自身发出的请求。主要处理数据包的解包、封包、TCP/IP 协议等
初始化流程
MAC 模块初始化一般发生在协议栈初始化之后,驱动层通过 netif_add 接口将 ethernetif_init 传入,并在设置完 LwIP 属性之后调用 ethernetif_init 接口,然后开始执行模块的初始化流程
启动流程
MAC 初始化完成后,不会直接使能 MAC 的发送与接收,而是当 PHY 自协商完成后,才需要打开 MAC 的全部功能。
发送流程
当有数据需要发送时,LwIP 协议栈会组织好待发送的网卡数据包,然后调用 output 接口 完成数据包的发送过程
网卡数据包实际的发送过程只有一种,就是 MAC 内部集成的 DMA 通过发送描述符将数据包发送至网卡 内部的 FIFO(先入先出缓冲区),再由 FIFO 将数据包发送至 PHY 芯片。因此实际的数据包发送过程一 般都是组装 DMA 发送描述符的过程
接收流程
与发送过程类似,接收过程也需要完全依赖 MAC 内部的 DMA。当一帧完整的以太网数据帧到来时,DMA 将从 MAC 内部的 FIFO 中将数据拷贝至接收描述符描述的缓存地址中,当 DMA 传输完成时,会触发一个 DMA 接收完成中断,软件获取到这一中断事件后,就需要根据当前的描述符找到当前网卡的缓存,并将 以太网数据帧取出。并将 DMA 描述符归还至 DMA
中断流程
能触发 MAC 中断的事件很多,但在实时系统中一般只开启 MAC 的 DMA 接收完成中断。因此 MAC 的中断 流程设计会相对较简单,只判断是否是接收中断,然后如果是接收中断就释放一个信号量通知网卡 数据包输入任务去 DMA 缓存中取数据