基于NiosII的嵌入式網(wǎng)絡(luò )通信系統
校驗和的計算需要很多個(gè)時(shí)鐘周期才能完成,所以校驗和計算指令使用了multi-cycle用戶(hù)指令結構。multi-cycle用戶(hù)指令的端口操作有:固定長(cháng)度和可變長(cháng)度。因為網(wǎng)絡(luò )傳輸的數據長(cháng)度是不斷變化的,所以校驗和計算指令選擇可變長(cháng)度操作,這也影響到端口信號的選擇。
multi-cycle用戶(hù)指令結構的信號有:reset,clk,clk_en,start,dataa[31:0],datab[31:0],done,result[31:0]。其中除了reset,clk,clk_en三個(gè)信號外,其他信號都是可選的,要根據具體的應用選擇。本設計中校驗和計算指令用到了start,dataa[31:0],done,result[31:0]。start信號作為數據有效信號,dataa[31:0]為數據輸入信號,當校驗和計算完成時(shí)done信號有效,通知cpu讀取result端口上的數據,因此計算校驗和指令邏輯必須確保當done信號有效時(shí),result端口上的數據有效。
在sopc builder中添加校驗和計算指令,然后重新產(chǎn)生系統,再在quartusii中更新并編譯,在ide的重新編譯一次工程,系統庫中的“system.h”文件包含校驗和計算指令的宏定義如下:
#define alt_ci_cal_chksum_n 0x00000000
#define alt_ci_cal_chksum(a) __builtin_custom_ini(alt_ci_cal_chksum_n,(a))
用戶(hù)只需要在源文件中將計算校驗和部分使用上面的宏做相應的替換就可以,對用戶(hù)來(lái)說(shuō)這再簡(jiǎn)單不過(guò)了,就像是調用一個(gè)子函數。由此可見(jiàn),基于niosii軟核處理器開(kāi)發(fā)的嵌入式系統,具有一般嵌入式處理器不能比擬的優(yōu)勢。本文引用地址:http://dyxdggzs.com/article/152573.htm
3 軟件設計
協(xié)議棧使用了現在在嵌入式應用領(lǐng)域已經(jīng)很成熟的uip。如果使用altera提供的lwip協(xié)議棧,那么就得考慮其在嵌入式操作系統上的移植,這樣無(wú)疑會(huì )增加系統軟件設計的復雜度和代碼量。
設計的關(guān)鍵部分是uip協(xié)議棧在nios ii上的移植。針對niosii的特點(diǎn),將uip做適當的修改,使niosii處理器的處理能力得到充分發(fā)揮,提高系統的性能。uip原來(lái)是針對8位處理器的,現在將其修改為16位,這樣理論上處理能力就提高了一倍,系統的性能也就提升了一倍。
根據tcp/ip模型結構,數據鏈路層和物理層使用網(wǎng)絡(luò )接口芯片lan9c111完成;網(wǎng)絡(luò )層和傳輸層協(xié)議解析在niosii中由嵌入式tcp/ip協(xié)議棧實(shí)現;應用層由用戶(hù)根據需要編寫(xiě)。各個(gè)模塊合起來(lái)共同完成網(wǎng)絡(luò )通信功能。
3.1 底層驅動(dòng)程序的編寫(xiě)
lan9c111芯片的底層驅動(dòng)是由altera免費提供的,可以調用這些底層驅動(dòng)來(lái)完成初始化、通信建立、監聽(tīng)等通信功能。這些底層驅動(dòng)函數是已經(jīng)封裝好的,用戶(hù)不需要了解其細節就可以編寫(xiě)網(wǎng)絡(luò )通信程序,但是為了進(jìn)行高級的開(kāi)發(fā),必須對整個(gè)程序的工作機制有一定的了解。
幾個(gè)主要的底層驅動(dòng)函數來(lái)完成啟動(dòng)、復位和初始化phy、以太網(wǎng)packet的收發(fā)及中斷處理函數等工作:
static void r_lan91c111_enable():用于啟動(dòng)芯片工作,使能發(fā)送和接收。
int nr_lan91c111_reset():對芯片盡心復位。
static int r_lan91c111_init_phy( ):完成物理層芯片的初始化。
int nr_lan91c111_set_irq():設置芯片的中斷
上層的通信程序調用這些函數實(shí)現網(wǎng)絡(luò )接口的控制,通信功能的實(shí)現以此為基礎。
3.2 通信軟件的實(shí)現
通信軟件完成設備之間通信的主要功能,主要是uip協(xié)議棧的。傳輸層實(shí)現了tcp和udp,這在軟件設計時(shí)就需要做不同的考慮,不同的數據傳輸需求要求使用不同的傳輸層協(xié)議,比如,實(shí)時(shí)性要求高的傳輸應用就要求使用無(wú)連接的udp協(xié)議;對實(shí)時(shí)性要求不高并且要保證數據傳輸的可靠性的應用使用面向連接的、可靠的tcp協(xié)議可以保證傳輸的可靠性。
程序框架如下:
main()
?。?br /> netif_init(); // 網(wǎng)絡(luò )接口初始化
uip_init(); // 協(xié)議棧初始化
arp_table_init(); // arp 表初始化
netconn_new() // 建立新的連接
netconn_bind() // 綁定端口號
netconn_listen() // 偵聽(tīng)端口
while(1)
{
if (收到數據){
…… // 處理接收的數據
}
else if(發(fā)送數據){
…… // 發(fā)送數據
}
else
…… // 返回準備下次處理
}
?。?br /> 圖2是軟件處理流程。
評論