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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 一種多協(xié)議的嵌入式總線集成器的設(shè)計(jì)與研究

          一種多協(xié)議的嵌入式總線集成器的設(shè)計(jì)與研究

          作者: 時(shí)間:2009-10-28 來(lái)源:網(wǎng)絡(luò) 收藏
          2.2 軟件實(shí)現(xiàn)的框架
            系統(tǒng)的軟件分為系統(tǒng)初始化模塊、系統(tǒng)配置模塊、通信總調(diào)度模塊、三個(gè)實(shí)現(xiàn)模塊及硬件驅(qū)動(dòng)模塊。它們分別對(duì)應(yīng)系統(tǒng)軟件的不同分層。其中,系統(tǒng)配置模塊、間通信總調(diào)度模塊為應(yīng)用層程序。協(xié)議實(shí)現(xiàn)模塊(LonWorks協(xié)議模塊、PPI協(xié)議模塊、Open協(xié)議模塊)為協(xié)議層程序。硬件驅(qū)動(dòng)模塊為硬件驅(qū)動(dòng)層程序。其流程圖如圖3所示。

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


            系統(tǒng)配置模塊主要完成系統(tǒng)的配置。它包括各端口是配置為主模式還是從模式、各通信協(xié)議的波特率等。系統(tǒng)可以通過(guò)兩種方式配置:一種為硬件方式配置,另一種是通過(guò)互連網(wǎng)進(jìn)行軟件配置。協(xié)議間通信總調(diào)度模塊主要是驅(qū)動(dòng)不同協(xié)議之間進(jìn)行相互通信。各協(xié)議的格式解析分別由相應(yīng)的協(xié)議模塊完成。硬件驅(qū)動(dòng)模塊主要完成把各硬件緩沖區(qū)中的數(shù)據(jù)發(fā)送到,同時(shí)把從總線接收來(lái)的數(shù)據(jù)存放到協(xié)議緩沖區(qū)中。
          2.3 緩沖區(qū)結(jié)構(gòu)
            本系統(tǒng)的緩沖區(qū)采用改進(jìn)的循環(huán)隊(duì)列結(jié)構(gòu),采用了三個(gè)指針Bp.In、Bp.Out、Bp.Try。其中,Bp.In是隊(duì)頭指針。當(dāng)隊(duì)列接收一數(shù)據(jù)時(shí),如果隊(duì)列緩沖區(qū)尚有空間,則數(shù)據(jù)入隊(duì),同時(shí)Bp.In加1。Bp.Out是隊(duì)尾指針。當(dāng)數(shù)據(jù)要出隊(duì)時(shí), 如果隊(duì)列緩沖區(qū)非空,則Bp.Out加1。隊(duì)列緩沖區(qū)空或滿的判定方法可以用下面的偽C語(yǔ)言描述:
            if(Bp.In++== Bp.Out)
            {隊(duì)列緩沖區(qū)已滿};//如隊(duì)頭加1等于隊(duì)尾指針,則表示該隊(duì)列已滿
            if(Bp.Out== Bp.In)
            {隊(duì)列緩沖區(qū)已空};//如果隊(duì)尾指針趕上隊(duì)頭則表示該隊(duì)列已空
            Bp.Try是為通信時(shí)重發(fā)而準(zhǔn)備的。當(dāng)要發(fā)送數(shù)據(jù)時(shí),Bp.Try向前移動(dòng)(Bp.Try++),但Bp.Out不動(dòng)(數(shù)據(jù)不出隊(duì))。當(dāng)Bp.Try=Bp.In時(shí),表示隊(duì)列緩沖區(qū)已沒(méi)有數(shù)據(jù)要發(fā)送。如果要求數(shù)據(jù)重發(fā),僅僅把Bp.Try重新指回Bp.Out(Bp.Try=Bp.Out)再次發(fā)送。只有當(dāng)發(fā)送成功時(shí),才允許數(shù)據(jù)出隊(duì)(Bp.Out= Bp.Try)。由于一次發(fā)送數(shù)據(jù)的多少由Bp.Try決定(一次不一定把隊(duì)列緩沖區(qū)數(shù)據(jù)都發(fā)送完),這樣給數(shù)據(jù)的發(fā)送提供了極大的方便。
          2.4 硬件緩沖區(qū)
            系統(tǒng)要發(fā)送數(shù)據(jù)時(shí)把發(fā)送協(xié)議緩沖區(qū)的數(shù)據(jù)拷貝到發(fā)送硬件緩沖區(qū),并驅(qū)動(dòng)一次發(fā)送后退出。硬件發(fā)送緩沖區(qū)中的數(shù)據(jù)是由發(fā)送中斷自動(dòng)完成的。硬件發(fā)送中斷驅(qū)動(dòng)完一次數(shù)據(jù)發(fā)送就退出。當(dāng)硬件發(fā)送完數(shù)據(jù)后就會(huì)產(chǎn)生中斷標(biāo)志并重新進(jìn)入中斷,重復(fù)上面的過(guò)程直到數(shù)據(jù)發(fā)送完。同樣,發(fā)送中斷只負(fù)責(zé)發(fā)送完硬件發(fā)送緩沖區(qū)中的數(shù)據(jù)而不關(guān)心這些數(shù)據(jù)代表的意義。中斷程序流程圖如圖4所示。


          2.5 各總線協(xié)議間的通信方法
            各總線協(xié)議間通信是采用周期輪詢方式下的實(shí)地址共享。其基本思想就是系統(tǒng)定時(shí)地由配置為主模式的端口向其對(duì)應(yīng)總線的每個(gè)從機(jī)發(fā)送請(qǐng)求讀數(shù)命令包。從機(jī)接收到命令后就把它的數(shù)據(jù)傳送給主機(jī)(總線器)。主機(jī)把接收到的數(shù)據(jù)存放在對(duì)應(yīng)的協(xié)議地址中。當(dāng)配置為從機(jī)的端口所對(duì)應(yīng)的總線上的主機(jī)向總線器請(qǐng)求數(shù)據(jù)時(shí),總線器只是簡(jiǎn)單地把前一個(gè)周期輪詢的數(shù)據(jù)應(yīng)答過(guò)去。由于輪詢總線的周期比較短,因此應(yīng)答的數(shù)據(jù)稍微滯后。但對(duì)總線采集的數(shù)據(jù)的真實(shí)性影響不大。


            下面以圖5中 Open總線的節(jié)點(diǎn)B向LonWorks節(jié)點(diǎn)A請(qǐng)求數(shù)據(jù)為例來(lái)說(shuō)明這種方式的通信過(guò)程。首先,系統(tǒng)周期性地改變從機(jī)號(hào)、通信命令、通信狀態(tài),向LonWorks所有的從機(jī)請(qǐng)求數(shù)據(jù),從機(jī)應(yīng)答的數(shù)據(jù)存放在其協(xié)議地址中。然后Open主節(jié)點(diǎn)B向總線集成器請(qǐng)求LonWorks總線A節(jié)點(diǎn)中的數(shù)據(jù)。最后,總線集成器收到該命令,把剛采集到的協(xié)議地址上的值傳送給節(jié)點(diǎn)B。這一次通信至此結(jié)束。
            該多協(xié)議總線集成器目前提供了對(duì)LonWorks、PPI、CANOpen的支持,并且還對(duì)上面三種協(xié)議提供了利用TCP/IP遠(yuǎn)程監(jiān)控和配置的接口,人機(jī)界面使系統(tǒng)有較好的監(jiān)測(cè)能力。由于該集成器采用了較高性能的處理器,使各個(gè)協(xié)議之間通訊實(shí)時(shí)性得到保證。為了有利于系統(tǒng)以后的擴(kuò)展,整個(gè)總線集成器系統(tǒng)嚴(yán)格按照模塊化來(lái)進(jìn)行硬件和軟件編程,使系統(tǒng)軟件的移植性大大提高。

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

          上一頁(yè) 1 2 下一頁(yè)

          評(píng)論


          相關(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); })();