新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于NiosII的嵌入式網絡通信系統

        基于NiosII的嵌入式網絡通信系統

        作者: 時間:2009-03-19 來源:網絡 收藏

        校驗和的計算需要很多個時鐘周期才能完成,所以校驗和計算指令使用了multi-cycle用戶指令結構。multi-cycle用戶指令的端口操作有:固定長度和可變長度。因為網絡傳輸的數據長度是不斷變化的,所以校驗和計算指令選擇可變長度操作,這也影響到端口信號的選擇。
          multi-cycle用戶指令結構的信號有:reset,clk,clk_en,start,dataa[31:0],datab[31:0],done,result[31:0]。其中除了reset,clk,clk_en三個信號外,其他信號都是可選的,要根據具體的應用選擇。本設計中校驗和計算指令用到了start,dataa[31:0],done,result[31:0]。start信號作為數據有效信號,dataa[31:0]為數據輸入信號,當校驗和計算完成時done信號有效,通知cpu讀取result端口上的數據,因此計算校驗和指令邏輯必須確保當done信號有效時,result端口上的數據有效。
        在sopc builder中添加校驗和計算指令,然后重新產生,再在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))
        用戶只需要在源文件中將計算校驗和部分使用上面的宏做相應的替換就可以,對用戶來說這再簡單不過了,就像是調用一個子函數。由此可見,niosii軟核處理器開發的,具有一般處理器不能比擬的優勢。

        本文引用地址:http://www.104case.com/article/152573.htm

        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是軟件處理流程。

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 易门县| 密云县| 莱西市| 昌都县| 班戈县| 桂平市| 莫力| 中方县| 方山县| 汕尾市| 新源县| 深泽县| 张家界市| 徐州市| 文成县| 云和县| 二连浩特市| 东乡县| 信阳市| 武夷山市| 庆云县| 宁阳县| 临西县| 紫云| 清镇市| 肇东市| 敖汉旗| 青神县| 霍山县| 马关县| 铜山县| 桐梓县| 教育| 驻马店市| 安多县| 无极县| 扬州市| 金溪县| 淮阳县| 化州市| 柘荣县|