LWIP是瑞士计算机科学院的开发的TCP/IP协议栈,其开发的初衷是用于嵌入式系统,一般它只需要几十KB的RAM和约40 KB的ROM就可运行。NiosII IDE开发环境内部集成了LWIP协议栈,用户在加载操作系统μC/OS-II后,只需选取相应的LWIP选项,即可加入协议栈。工程中,LWIP以系统库的形式存在,应用软件只需加上相应的头文件,就可调用API函数实现网络连接、数据收发等功能,迅速实现系统的网络接入。
3.2建立应用软件
本系统设计的嵌入式应用软件流程图如图4所示。
首先对堆栈和驱动程序初始化。初始化堆栈,应在调用OSStart启动μC/OS-II调度程序之前调用IDE的库函数lwip_stack_int(),该函数用于设置协议栈。堆栈初始化后,再调用库函数init_done_func(),但该函数必须调用库函数lwip_devices_init(),这个函数将对在system.h中定义的所有已安装的以太网设备驱动程序进行注册。函数lwip_devices_init()还会调用函数get_mac_addr()和函数get_ip_address()从而获取系统的mac地址和IP地址。当lwip_devices_init()返回一个非0值则表示注册成功。注册成功后,LWIP栈可用,从而便可在程序中创建任务。
初始化完成后,使用函数sys_thread_new()创建使用套接字API与LWIP栈对话的新任务。系统中,由函数sys_thread_new(link_task,NULL,link_PRIO)创建的用户任务是link_task()。该任务中,系统调用函数listen(fd_listen,1)监听上位机连接是否成功,一旦连接成功,调用NiosII IDE所提供的IO操作函数IOWR(OUT_PIO_BASE,0,0x01)控制接收模块,将视频数据保存到SRAM,当存满一帧后,接收模块产生一个中断,这时系统可通过指针读取SRAM中的值a[i]=*(p+i+N/2*(TIMES-times),每读取1 450 Byte就调用套接字API函数send(clisock,send_buf,N,0)发送至上位机。由于保存图像的分辨率仅是320×240,所以数据量并不大。发送时,通过函数IOWR(OUT_PIO_BASE,0,0x00)控制接收模块何时停止接收,一帧图像发送完毕,再通过函数IOWR(OUT_PI-O_BASE,0,0x01)控制接收模块开始接收下一帧图像,如此反复循环,直到连接断开为止。
4 上位机软件设计
本系统设计的客户端视频显示应用程序是利用LabWindows/CVI软件开发,此应用程序利用套接字编程,可以作为客户机与服务器NiosII系统之间通信。
本系统设计的上位机的应用程序除了显示视频功能外,还添加了保存和回放功能。上位机通过创建一个标准的Socket接口完成连接以及接收数据;当接收完一帧数据后,对其进行数据处理,再调用函数CreateDIBitmap()创建一幅位图,最后再调用函数CanvasDrawBitmap()完整显示。
5 结束语
本系统设计是基于NiosII IP摄像头的系统,介绍了从SOPC Builder创建NiosII软核处理器、IDE建立底层软件平台,到设计NioslI应用软件的整个架构。同时,对上位机的应用程序做了说明。经过硬件测试,整个系统运行良好,实时性能良好。