目录
一 Lib.c文件
该文件主要用来处理字节对齐相关问题
协议栈中的字节对齐问题主要源于一下一些原因:
原因一,协议栈中各个层次数据包的包头由于需要存在不同长度的字段,也就是说各个字段的长度并不是完全一致的
原因二,网络上,也就是线路上的数据是以紧凑方式传输的,也就是一个字节挨着一个字节,中间不存在空隙
原因三,不同的处理器对数据的处理不同,这种不同存在与处理器访问内存字节的方式上,有的以大端方式访问,有的以小端方式访问,有的以字为单位,有的以半字为单位
基于上述原因,在程序设计中就要考虑字节对齐的问题,比如,如果我们在一个结构体中存储了一个数据包的IP头部,并使用该结构体发送数据时,就不能简单的把该结构体的指针传给发送指针,因为按照这种方式发送数据,则数据流中就会出现空隙,这些空隙是由于结构体在内存中的特殊存储方式造成的。(处理器以某种对齐方式存储)。同样,当我们接收到数据,并将其传给本地某个结构体的指针时,同样要注意这样的问题仍然存在,因为我们接收到的数据是一个字节紧挨着另一个字节的,而简单的将其赋值给本地结构体,可能由于处理器处理方式的不同而使得数据发生混乱
该文件提供了两类函数来处理上述问题,一类是GetHdr,一类是SetHdr,前者用来获取特定的包头,后者用来将本地存储的包头数据按照网络传输的实际需要进行重新的组合。这里的hdr为各种协议的头结构,比如IP,TCP, UDP, IGMP, ICMP等等。
具体的处理方式如下:
总的原则就是一个字节一个字节的进行拷贝,另外,我们定义了处理16位和32位数据的两种数据类型,使用union类型进行定义,使得既可以对数据一个字节一个字节的进行读取和拷贝,又可以以整体的形式进行读取和拷贝。这样,当我们Get数据时,先按照头结构的具体形式将数据一个字节一个字节的分段拷贝到这种联合类型体中,再以整体的形式赋值给具体的头结构;类似的,当Set数据时,先将具体头结构中的数据以分段整体的方式赋值给联合类型体,在由联合类型体以字节的方式赋值给发送数据的存储空间
二 Lwipinit.c
该文件主要进行协议栈的初始化,基本流程如下:
感觉接口驱动这一部分可以放到tcpip任务中作为回调函数执行或者放到最后进行初始化
这之后可以创建一些测试任务运行。
这里单独创建接收数据任务是由于将数据的接收作为一个任务来实现,循环读取,而不是在中断中完成数据的接收,减少中断处理时间,提高系统的实时性
三 Sys_arch.c
这个文件是移植的接口层,根据所使用的操作系统和具体的软件环境进行实现。该文件也就是实现了操作系统仿真层,要实现的接口包括任务的创建、删除、添加;信号量的创建等待与释放;消息邮箱的创建等待与发送以及定时器的相关操作等。
四 cc.h
数据类型的定义
Arch目录下还有一些测试文件以及其他杂类文件,包括udp连接,tcp连接,组播测试,ping测试以及版本号处理等。