现在的位置: 首页 > 综合 > 正文

我理解的网口

2013年09月13日 ⁄ 综合 ⁄ 共 1294字 ⁄ 字号 评论关闭

 

我理解的网口:

协议,协议,协议,看的头晕死了。。。

 

最近在做网口的工作,头疼得要死,弄来弄去终于有点眉目了。

 

我的系统使用了ucos操作系统,所以用task(任务来处理)。

首先写好驱动(这个任务已经有人完成,不再某某人的职责范围,我也不会写),然后开始工作。

 

1.        在硬件启动时task_start(专门创建任务的任务)任务中,创建一个网口接受的任务和一个网口发送的任务。分别调用task_net_rx,task_net_tx。

2.        在初始化函数sys_init(专门进行上电初始化的函数)中调用net_init()函数,进行网口的IP地址、网关、子网掩码、MAC地址等信息的设置,并启动网关工作。

3.        首先,需要创建发送接受环形缓冲区,我这里已经创建完成。先拣简单的说:task_net_tx函数的实现:等待接受函数发送一个信号量net_sem,接受到的话,按照发送数据的长度net_tx_num从环形缓冲区中取数并发送。

4.        然后重点是接受函数:接受函数需要解析发送来的内容用的是什么协议,代表是什么意思,接受到以后怎么处理等信息,所以比较复杂。想要通讯首先要实现ARP协议,保证通讯的基础;然后要实现TCP、UDP协议这是通讯的主要通路;实现PING功能,保证测试通讯的基础。由于不是实现完整的TCP/IP协议栈,为了减少代码量,所以自己写代码来实现这一功能。作为载体TCP、UDP数据包包含了数据信息,在数据信息中也有协议的实现,比如modbus协议、104通讯规约、DNP协议和自定义协议等等任何用户需要的协议。在每个具体的协议实现里面,怎样去解析和处理数据又是另外一层处理。在这里主要体现一个分层的思想。

 

从分层的思想来看,我可以将这个处理过程分为几个层次。

最低层:

task_net_rx

{

       If(ARP) arp_ack();

       Else if(UDP) udp_ack();

      

       将返回数据保存到环形缓冲区,设置信号量。

}

再上一层是这些协议的实现,在这里提供更上一层协议的接口:

Udp_ack()

{

      

       If(modbus)    n = modbus_ack();

       Else if(dnp)    n = dnp_ack();

      

      

}

在上面同样的道理。

 

这样一分层,整个网络处理的结构就出来了。

 

由于时间有限,我没空去看lwip的详细代码,看了它的说明文档,顺便说一下我的理解:

1.        lwip实现了比较详细的分层。我这个代码是按照自己的理解来分层,没那么严格。

2.        lwip有专门的缓存和数据管理机制。我这个没有。

3.        lwip没有完全分层,为了减少层与层之间数据的拷贝而浪费资源。我这个代码完全是全局变量,不进行数据拷贝。

4.        lwip实现了定制,可以增减代码,并实现了socket接口。我的代码也可以删除,但是比较简单。

 

等有时间了好好看看这些高手的代码,长点见识!

呵呵,记录到此为止,over!

 

抱歉!评论已关闭.