因為實際應用需要基於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地址的程序段,即可使用~~