因为实际应用需要基于LwIP实现网络服务器,但目前NIOS 8.0版本已经不建议用户使用它,直观的现象是用户不能直接调用LwIP的库函数,我结合自己的摸索,总结出建立基于LwIP的软件工程方法:
通讯板实现和上位机间的网络通讯,具体建立工程步骤如下:
1、 打开NIOS IDE,点击file菜单下的switch workplace,将工作空间换至本工程目录下software文件夹下,点击OK;
2、 建立新工程,新建NIOS II C/C++ Application,其中PTF文件选择通讯(TT_COM)工程目录下的TT_COM.ptf,随后,选择历程模板Hello MicroC/OS-II,点确定。目前新建的软件工程默认包含了MicroC/OS-II操作系统,在工程System Library属性里面的RTOS Option里可以进一步配置。硬件工程中已经加载了定时器,频率100HZ,最高可以设定为1KHZ,在软件工程里进行相应调整,RTOS Option里将Enable code for Timer选中后,即可在Timer Management里配置时钟节拍,这里注意与硬件时钟节拍一致!!
3、 加载软件工程源代码文件,将我之前编写的LwIP实现上位机与DM9000的TCP网络通讯程序文件夹:main、inc、driver、task、config这五个文件夹直接拖至新建软件工程下,删除hello_ucosii.c文件。
4、 加载LwIP单元模块,因为新版本的NIOS IDE已经不再支持用户选用LwIP,但是模块还在,只是用普通方式无法加载。这也是之前困扰我的问题。现在具体解决方法如下,打开新建软件工程XXXX_syslib下的system.stf文件,我们会发现这是软件配置文件,里面包含了MicroC/OS-II的设定参数,以<sys_defines>开始,以 </sys_defines>结束,因此从以前找到的包含LwIP旧版本工程里找的system.stf文件里的LwIP设定加载进工程里即可下面是LwIP加载信息,将其复制到system.stf文件中,定义MicroC/OS-II的设定参数结束后</sys_defines>语句下面即可。
<sw_component id="LWIP4UCOS_1" name="Lightweight TCP/IP Stack" sopc_component_dir="altera_lwip">
<sys_defines>
<define name="mem_size" quote="no" value="32768"/>
<define name="memp_num_pbuf" quote="no" value="32"/>
<define name="memp_num_netbuf" quote="no" value="32"/>
<define name="memp_num_udp_pcb" quote="no" value="8"/>
<define name="memp_num_tcp_pcb" quote="no" value="8"/>
<define name="memp_num_tcp_pcb_listen" quote="no" value="2"/>
<define name="memp_num_api_msg" quote="no" value="32"/>
<define name="memp_num_tcpip_msg" quote="no" value="32"/>
<define name="pbuf_pool_size" quote="no" value="16"/>
<define name="pbuf_pool_bufsize" quote="no" value="1536"/>
<define name="arp_table_size" quote="no" value="10"/>
<define name="ip_forward" quote="no" value="0"/>
<define name="icmp_ttl" quote="no" value="255"/>
<define name="lwip_dhcp" quote="no" value="1"/>
<define name="dhcp_does_arp_check" quote="no" value="1"/>
<define name="lwip_udp" quote="no" value="1"/>
<define name="lwip_tcp" quote="no" value="1"/>
<define name="tcp_wnd" quote="no" value="2048"/>
<define name="tcp_maxrtx" quote="no" value="4"/>
<define name="tcp_synmaxrtx" quote="no" value="4"/>
<define name="tcp_mss" quote="no" value="1476"/>
<define name="tcp_snd_buf" quote="no" value="32768"/>
<define name="lwip_stats" quote="no" value="0"/>
<define name="lwip_stack_size" quote="no" value="2048"/>
<define name="lwip_default_if" quote="yes" value="lan91c111"/>
</sys_defines>
</sw_component>
其中,关于LwIP的设定可以在这里修改,DHCP如果不需要,可以将<define name="lwip_dhcp" quote="no" value="1"/>改为<define name="lwip_dhcp" quote="no" value="0"/>;
5、 保存工程后,编译,正常的化能够编译通过,并且在System Library属性里面的Software Components选项卡里的LwIP,里面的选项虽然不能选,但是可以看到灰色的选项已经被我们选中。如果想修改LwIP的设置,可以在步骤4修改修改system.stf文件,或修改生成的system.h文件中关于LwIP的设定即可,相应设定如下:
/*
* Lightweight TCP/IP Stack (Deprecated) configuration
*
*/
#define MEM_SIZE 32768
#define MEMP_NUM_PBUF 32
#define MEMP_NUM_NETBUF 32
#define MEMP_NUM_UDP_PCB 8
#define MEMP_NUM_TCP_PCB 8
#define MEMP_NUM_TCP_PCB_LISTEN 2
#define MEMP_NUM_API_MSG 32
#define MEMP_NUM_TCPIP_MSG 32
#define PBUF_POOL_SIZE 16
#define PBUF_POOL_BUFSIZE 1536
#define ARP_TABLE_SIZE 10
#define IP_FORWARD 0
#define ICMP_TTL 255
#define LWIP_DHCP 0
#define DHCP_DOES_ARP_CHECK 1
#define LWIP_UDP 1
#define LWIP_TCP 1
#define TCP_WND 2048
#define TCP_MAXRTX 4
#define TCP_SYNMAXRTX 4
#define TCP_MSS 1476
#define TCP_SND_BUF 32768
#define LWIP_STATS 0
#define LWIP_STACK_SIZE 2048
#define LWIP_DEFAULT_IF "lan91c111"
这样便可以加载LwIP,另外直接将DE2中写好的DM9000驱动拖进来,修改读取MAC地址的程序段,即可使用~~