<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于NiosII的嵌入式網(wǎng)絡(luò)通信系統(tǒng)

          基于NiosII的嵌入式網(wǎng)絡(luò)通信系統(tǒng)

          作者: 時(shí)間:2009-03-19 來源:網(wǎng)絡(luò) 收藏

          校驗(yàn)和的計(jì)算需要很多個(gè)時(shí)鐘周期才能完成,所以校驗(yàn)和計(jì)算指令使用了multi-cycle用戶指令結(jié)構(gòu)。multi-cycle用戶指令的端口操作有:固定長度和可變長度。因?yàn)榫W(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)長度是不斷變化的,所以校驗(yàn)和計(jì)算指令選擇可變長度操作,這也影響到端口信號的選擇。
            multi-cycle用戶指令結(jié)構(gòu)的信號有:reset,clk,clk_en,start,dataa[31:0],datab[31:0],done,result[31:0]。其中除了reset,clk,clk_en三個(gè)信號外,其他信號都是可選的,要根據(jù)具體的應(yīng)用選擇。本設(shè)計(jì)中校驗(yàn)和計(jì)算指令用到了start,dataa[31:0],done,result[31:0]。start信號作為數(shù)據(jù)有效信號,dataa[31:0]為數(shù)據(jù)輸入信號,當(dāng)校驗(yàn)和計(jì)算完成時(shí)done信號有效,通知cpu讀取result端口上的數(shù)據(jù),因此計(jì)算校驗(yàn)和指令邏輯必須確保當(dāng)done信號有效時(shí),result端口上的數(shù)據(jù)有效。
          在sopc builder中添加校驗(yàn)和計(jì)算指令,然后重新產(chǎn)生,再在quartusii中更新并編譯,在ide的重新編譯一次工程,庫中的“system.h”文件包含校驗(yàn)和計(jì)算指令的宏定義如下:
            #define alt_ci_cal_chksum_n 0x00000000
            #define alt_ci_cal_chksum(a) __builtin_custom_ini(alt_ci_cal_chksum_n,(a))
          用戶只需要在源文件中將計(jì)算校驗(yàn)和部分使用上面的宏做相應(yīng)的替換就可以,對用戶來說這再簡單不過了,就像是調(diào)用一個(gè)子函數(shù)。由此可見,niosii軟核處理器開發(fā)的,具有一般處理器不能比擬的優(yōu)勢。

          本文引用地址:http://www.ex-cimer.com/article/152573.htm

          3 軟件設(shè)計(jì)
          協(xié)議棧使用了現(xiàn)在在應(yīng)用領(lǐng)域已經(jīng)很成熟的uip。如果使用altera提供的lwip協(xié)議棧,那么就得考慮其在嵌入式操作系統(tǒng)上的移植,這樣無疑會增加系統(tǒng)軟件設(shè)計(jì)的復(fù)雜度和代碼量。
          設(shè)計(jì)的關(guān)鍵部分是uip協(xié)議棧在nios ii上的移植。針對niosii的特點(diǎn),將uip做適當(dāng)?shù)男薷?,使niosii處理器的處理能力得到充分發(fā)揮,提高系統(tǒng)的性能。uip原來是針對8位處理器的,現(xiàn)在將其修改為16位,這樣理論上處理能力就提高了一倍,系統(tǒng)的性能也就提升了一倍。
          根據(jù)tcp/ip模型結(jié)構(gòu),數(shù)據(jù)鏈路層和物理層使用網(wǎng)絡(luò)接口芯片lan9c111完成;網(wǎng)絡(luò)層和傳輸層協(xié)議解析在niosii中由嵌入式tcp/ip協(xié)議棧實(shí)現(xiàn);應(yīng)用層由用戶根據(jù)需要編寫。各個(gè)模塊合起來共同完成功能。
          3.1 底層驅(qū)動程序的編寫
          lan9c111芯片的底層驅(qū)動是由altera免費(fèi)提供的,可以調(diào)用這些底層驅(qū)動來完成初始化、通信建立、監(jiān)聽等通信功能。這些底層驅(qū)動函數(shù)是已經(jīng)封裝好的,用戶不需要了解其細(xì)節(jié)就可以編寫程序,但是為了進(jìn)行高級的開發(fā),必須對整個(gè)程序的工作機(jī)制有一定的了解。
          幾個(gè)主要的底層驅(qū)動函數(shù)來完成啟動、復(fù)位和初始化phy、以太網(wǎng)packet的收發(fā)及中斷處理函數(shù)等工作:
            static void r_lan91c111_enable():用于啟動芯片工作,使能發(fā)送和接收。
            int nr_lan91c111_reset():對芯片盡心復(fù)位。
            static int r_lan91c111_init_phy( ):完成物理層芯片的初始化。
            int nr_lan91c111_set_irq():設(shè)置芯片的中斷
            上層的通信程序調(diào)用這些函數(shù)實(shí)現(xiàn)網(wǎng)絡(luò)接口的控制,通信功能的實(shí)現(xiàn)以此為基礎(chǔ)。
          3.2 通信軟件的實(shí)現(xiàn)
          通信軟件完成設(shè)備之間通信的主要功能,主要是uip協(xié)議棧的。傳輸層實(shí)現(xiàn)了tcp和udp,這在軟件設(shè)計(jì)時(shí)就需要做不同的考慮,不同的數(shù)據(jù)傳輸需求要求使用不同的傳輸層協(xié)議,比如,實(shí)時(shí)性要求高的傳輸應(yīng)用就要求使用無連接的udp協(xié)議;對實(shí)時(shí)性要求不高并且要保證數(shù)據(jù)傳輸?shù)目煽啃缘膽?yīng)用使用面向連接的、可靠的tcp協(xié)議可以保證傳輸?shù)目煽啃浴?br />  程序框架如下:
             main()
           ?。?br />    netif_init(); // 網(wǎng)絡(luò)接口初始化
             uip_init(); // 協(xié)議棧初始化
             arp_table_init(); // arp 表初始化
             netconn_new() // 建立新的連接
             netconn_bind() // 綁定端口號
             netconn_listen() // 偵聽端口
             while(1)
             {
             if (收到數(shù)據(jù)){
             …… // 處理接收的數(shù)據(jù)
             }
             else if(發(fā)送數(shù)據(jù)){
             …… // 發(fā)送數(shù)據(jù)
             }
            else
             …… // 返回準(zhǔn)備下次處理
             }
           ?。?br />  圖2是軟件處理流程。

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


          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();