🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
线程模型可以理解为协议栈的实现被划分在多少线程之中,如让协议栈的各个层次都独立成为一个线程,在这种模式下,各个层次都有严格分层结构,各个层次的提供的API接口也是分层清晰的,这样子能使得编程的时候更加简便,代码的组织也更加灵活,当然,按照前面所说的,在嵌入式设备中,这种严格的分层结构并不是最好的,在数据包向其他层递交的时候,都需要进行拷贝以及切换线程,这是一个很大的开销,当数据量太大的时候,这种开销就足以导致系统没法处理大量的数据,如一个数据包在各个层次间的递交至少需要进行3次切换线程:底层网卡接收到一个数据包,此时是链路层的线程在工作,当它往上层递交该数据包的时候,就需要切换线程,该数据包被拷贝到IP层,此时是IP层的线程在工作,当IP层处理完毕之后,要向传输层递交数据包,那么此时又需要切换线程,到传输层的线程中处理该数据包,这样子使得协议栈的效率非常低下。 还有一种方式就是协议栈与操作系统融合,成为操作系统的一部分,这样子用户线程与协议栈内核之间都是通过操作系统提供的函数来实现的,这种情况让协议栈各层之间与用户线程就没有很严格的分层结构,各层之间能交叉存取,从而提高效率。 但是LwIP采用了另一种方式,让协议栈内核与操作系统相互隔离,协议栈仅仅作为操作系统的一个独立线程存在,用户程序能驻留在协议栈内部,协议栈通过回调函数实现用户与协议栈之间的数据交互;也可以让用户程序单独实现一个线程,与协议栈使用系统的信号量和邮箱等IPC通信机制联系起来,进行数据的交互。当使用第一种通过回调函数进行交互情况的时候,也就是我们所说的RAW API编程,而使用第二种通过操作系统IPC通信机制的时候,就是另外两种API编程,即NETCONN API和Socket API。当然这样子既有优点也有缺点,优点就是能在任何的操作系统中移植,缺点就是收到操作系统的影响,因为即使LwIP作为一个独立的线程,也是需要借助操作系统进行调度的,因此,协议栈的响应的实时性会有一定影响,并且建议设置LwIP线程的优先级为最高优先级。