3 软件设计
协议栈使用了现在在嵌入式应用领域已经很成熟的uip。如果使用altera提供的lwip协议栈,那么就得考虑其在嵌入式操作系统上的移植,这样无疑会增加系统软件设计的复杂度和代码量。
设计的关键部分是uip协议栈在nios ii上的移植。针对niosii的特点,将uip做适当的修改,使niosii处理器的处理能力得到充分发挥,提高系统的性能。uip原来是针对8位处理器的,现在将其修改为16位,这样理论上处理能力就提高了一倍,系统的性能也就提升了一倍。
根据tcp/ip模型结构,数据链路层和物理层使用网络接口芯片lan9c111完成;网络层和传输层协议解析在niosii中由嵌入式tcp/ip协议栈实现;应用层由用户根据需要编写。各个模块合起来共同完成网络通信功能。
3.1 底层驱动程序的编写
lan9c111芯片的底层驱动是由altera免费提供的,可以调用这些底层驱动来完成初始化、通信建立、监听等通信功能。这些底层驱动函数是已经封装好的,用户不需要了解其细节就可以编写网络通信程序,但是为了进行高级的开发,必须对整个程序的工作机制有一定的了解。
几个主要的底层驱动函数来完成启动、复位和初始化phy、以太网packet的收发及中断处理函数等工作:
static void r_lan91c111_enable():用于启动芯片工作,使能发送和接收。
int nr_lan91c111_reset():对芯片尽心复位。
static int r_lan91c111_init_phy( ):完成物理层芯片的初始化。
int nr_lan91c111_set_irq():设置芯片的中断
上层的通信程序调用这些函数实现网络接口的控制,通信功能的实现以此为基础。
3.2 通信软件的实现
通信软件完成设备之间通信的主要功能,主要是uip协议栈的。传输层实现了tcp和udp,这在软件设计时就需要做不同的考虑,不同的数据传输需求要求使用不同的传输层协议,比如,实时性要求高的传输应用就要求使用无连接的udp协议;对实时性要求不高并且要保证数据传输的可靠性的应用使用面向连接的、可靠的tcp协议可以保证传输的可靠性。
程序框架如下:
main()
{
netif_init(); // 网络接口初始化
uip_init(); // 协议栈初始化
arp_table_init(); // arp 表初始化
netconn_new() // 建立新的连接
netconn_bind() // 绑定端口号
netconn_listen() // 侦听端口
while(1)
{
if (收到数据){
…… // 处理接收的数据
}
else if(发送数据){
…… // 发送数据
}
else
…… // 返回准备下次处理
}
}
图2是软件处理流程。