日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 嵌入式 > 嵌入式軟件
[導讀]一種嵌入式RPC的設計與實現(xiàn)

摘要:在研究遠程過程調用的原理和嵌入式系統(tǒng)特點的基礎上,提出一種遠程過程調用的設計以及在VxWorks操作系統(tǒng)上服務器端和在Win-dows探作系統(tǒng)上客戶端的實現(xiàn)。經(jīng)在項目中的應用,本設計與實現(xiàn)體現(xiàn)了良好的實用性、移植性和擴展性。
關鍵詞:遠程過程調用;嵌入式系統(tǒng);網(wǎng)絡;狀態(tài)機

    遠程過程調用(Renmte Procedure call,RPC)最早是在B.J.Nelson的博士論文中論述的。這里的過程等價于例程,函數(shù)的意思。RPC的思想源于大多數(shù)的程序都以過程作為最小設計單位。RPC擴展了過程調用機制,允許客戶端的過程通過網(wǎng)絡調用服務器端的過程。
    從RPC的思想出發(fā),不同的組織和公司開發(fā)了不同的RPC協(xié)議。有SUN公司的ONC RPC,開放軟件基金會的DCE RPC,微軟公司的MSRPC等。這些RPC都依賴與特定操作系統(tǒng),并且定義了自己的接口描述語言(IDL),對于嵌入式開發(fā)過于復雜。

1 RPC的機制
1.1 過程調用
    典型的過程調用就是過程A將參數(shù)和控制權交給過程B,過程B經(jīng)過一系列運算或者下一級過程,最后把結果和控制權返回給過程A。
1.2 RPC流程
    RPC分為同步RPC和異步RPC。在同步RPC中客戶端發(fā)出RPC調用的線程將被阻塞,直到從服務器端完成。異步RPC中客戶端發(fā)出調用的線程不會被阻塞而是繼續(xù)執(zhí)行。本文以同步RPC為研究對象。
    RPC的思想就是使遠程過程調用看上去就像在本地的過程調用一樣。從程序運行角度來看,其流程如圖1所示??蛻舳?MACHINE A)的進程通過網(wǎng)絡發(fā)送遠程過程調用請求給服務器(MACHINE B)。服務器收到請求后處理,調用相應的過程執(zhí)行,執(zhí)行完畢后服務器返回結果給客戶進程。客戶進程在發(fā)出遠程過程調用后被阻塞,直到服務器返回結果給客戶進程。


1.3 RPC的結構模型
    從描述的角度出發(fā),產(chǎn)生不同的RPC模型如Andrew S.Tanenhum在其著作分布式操作系統(tǒng)中論述的模型以及B.J.Nelson論文中的RPC模型等。但這些模型的主要組件都是相同的。圖2是B.J.Nelson博士的RPC結構模型??蛻暨M程、客戶存根和RPC運行庫實例在客戶端執(zhí)行。服務進程、服務器存根和RPC運行庫實例在服務器端執(zhí)行。客戶過程調用相應的客戶存根。客戶存根打包參數(shù)。客戶端的RPC運行庫將打包好的參數(shù)通過網(wǎng)絡發(fā)送給服務器RPC運行庫。服務器存根拆包參數(shù),然后調用服務器過程。完成后返回結果給服務器存根。服務器存根打包結果給服務器RPC運行庫。服務器RPC運行庫發(fā)送打包好的參數(shù)給客戶RPC運行庫??蛻舸娓鸢⒔Y果取出返回給客戶。


    盡管RPC的思想比較簡單,但有很多問題需要考慮。由于有很多不同的CPU,如X86、ARM、SPARC等以及各種DSP、單片機,產(chǎn)生了參數(shù)傳遞問題。如X86采用最低有效字節(jié)優(yōu)先,而SPARC是最高字節(jié)優(yōu)先。有些大型機采用EBCDIC碼,而其他處理器采用ASCII碼。存根就是用來解決這些問題。還有指針問題,涉及物理地址、虛擬地址、地址空間等很多考慮。我們知道不同計算機之間無法直接訪問彼此的地址。還有過程的參數(shù)如果為數(shù)據(jù)結構,這就引出數(shù)據(jù)對齊的問題。由此可以推斷所有的RPC實現(xiàn)都在一定的范圍適用。本文的RPC設計假定客戶端和服務器端有相同的大小端和并且都是32位處理器。[!--empirenews.page--]
1.4 SunRPC
    Sun RPC有時也稱為ONC(Open Network Computing)RPC。Sun RPC提供了一個接口語言IDL和rpcgen用于C語言支持。這門語言可以定義constants,typedef,structure,union。rpcgen可以產(chǎn)生server code,client stub和頭文件。server code主要是建立socket,注冊端口和監(jiān)聽,接受連接,拆參數(shù),調用實際的過程,打包返回值。client stub則是打包參數(shù),發(fā)送給server,將返回值解包。Sun RPC缺點就是對Windows沒有很好的支持。

2 設計
    本設計與傳統(tǒng)的模型不同,服務器端分為:網(wǎng)絡通訊,接收狀態(tài)機和過程處理??蛻舳朔譃榫W(wǎng)絡通訊,發(fā)送狀態(tài)機和過程調用。
    圖3是服務器端的狀態(tài)機。服務器進程從初始狀態(tài)進入GetHeader狀態(tài)。GetHeader是讀取遠程過程調用的頭信息。如果一次得到了所有數(shù)據(jù),也就是nCurLen>=dwTotalSize,則進入GetComplatePacket狀態(tài),反之進入GetData狀態(tài)。GetData是讀取參數(shù)數(shù)據(jù),讀取數(shù)據(jù)直到得到所有的數(shù)據(jù)進入GetComplatePacket狀態(tài)。期間如果超時,則回到GetHeader狀態(tài)。超時的起始時間從GetHeader韻第一個字節(jié)算起,如果在定義的時間無法讀取dwTotalSize個字節(jié),則Timeout從而回到GetHeader狀態(tài)。在GetHeader和GetData時,如果讀取數(shù)據(jù)有錯誤(如客戶端斷開連接,recv函數(shù)返回錯誤)則狀態(tài)機退出。GetComplatePacket是得到了完整的包。CheckCall判斷當前的調用是否是有效的過程調用。如果無效則進入狀態(tài),并回復無效命令給客戶端,最后進入GetHeader狀態(tài)。如果有效,則處理此調用,最后發(fā)送結果給客戶端。

         


    圖4為客戶端狀態(tài)機。首先是打包參數(shù),發(fā)送到服務器端,等待服務器端的回復,進入GetHeader狀態(tài)。GetHeader,GetData和Get Com-plate Packet與服務器相應的狀態(tài)意義相同。如果timeout則返回timeout錯誤。如果得到了整個packet則拆分最后返回。
    DCE—RPC和ONC—RPC允許選擇UDP或TCP協(xié)議。TCP協(xié)議傳輸控制協(xié)議,提供的是面向連接、可靠的字節(jié)流服務。UDP協(xié)議不提供可靠性,它只是把應用程序傳給IP層的數(shù)據(jù)報發(fā)送出去,但是并不能保證它們能到達目的地?;赥CP協(xié)議的可靠性,選擇TCP作為通訊協(xié)議。
3 實現(xiàn)
3.1 數(shù)據(jù)結構
    服務器和客戶用共用包頭信息和每個過程的參數(shù)結構。頭信息定義如下。dwCallID是過程的標識號。每個過程都有一個唯一的號碼。bCallType是調用的類型。dwTotalSize是整包的字節(jié)數(shù)。dwReturn是返回結果。
    [!--empirenews.page--]
    過程調用的類型定義如下。RPC_TYPE_SIMPLE_WRITEREAD是簡單的讀寫,輸入?yún)?shù)和輸出參數(shù)都在頭信息和過程的參數(shù)數(shù)據(jù)結構中。RPC_TYPE_READ指返回結果保存在單獨的內存。RPC_TYPE_WRITE指寫信息保存在單獨的內存。RPC_TYPE_WRITE_READ調用是需要內存保存輸入數(shù)據(jù),返回時需要保存輸出的結果。
 
    每個過程定義自己的輸入輸出參數(shù)結構。例如對獲取串口狀態(tài)GetCommState過程,建立RPC_GETCOMMSTATE結構。
   
    由于各個編譯器對struct數(shù)據(jù)結構的成員的對齊實現(xiàn)不同。這樣同樣的struct在客戶端和服務器端的大小可能不同,同樣的成員在結構中的位置不同。為了確??蛻舳撕头掌鞫擞邢嗤膶R,我們采用字節(jié)對齊用#pragma pack(1)。
3.2 Packet內存布局
    開始依次是頭信息和參數(shù),其余部分根據(jù)特定的過程而不同。以RPC_TYPE_WRITE_READ類型的布局為例:頭信息,參數(shù),輸入內存塊[1…N],輸出內存塊[1…N]。其他的過程類型布局類似。
3.3 服務器端實現(xiàn)
3.3.1 網(wǎng)絡模塊實現(xiàn)
    RPC在單獨的任務中執(zhí)行。圖5為RPC任務流程圖。調用VxWorks的系統(tǒng)函數(shù)taskSpawn建立RPC任務。調用socket( )建立面向連接的SOCK_ STREAM套接字,bind將套接字與本地網(wǎng)絡地址和端口號捆綁,listen申明要在該端口偵聽客戶連接請求,accept阻塞等待請求的到來。


3.3.2 狀態(tài)機實現(xiàn)
    當accept后,進入服務器端狀態(tài)機。設置accept返回的socket為非阻塞狀態(tài)。在阻塞的socket上調用send時,如果沒有足夠的輸出緩沖區(qū),該調用將被阻塞。Recv也是一樣,要讀的數(shù)據(jù)沒有就緒時,調用者阻塞。服務器不知道每次要讀取的字節(jié)數(shù),所以阻塞的socket無法工作。
    分配2塊內存:A和B。內存A用來保存recv的內容,內存B用來保存客戶端發(fā)送的Packet內容。因為服務器不知道客戶會發(fā)送多大的內容過來,每次從內存A拷貝到內存B之前檢查內存B的大小,如果內存B剩余大小不夠則重新分配。
    在得到了整個Packet后,即GetComplatePacket后,根據(jù)dwCallID調用服務器的本地過程,待返回后將返回值和內存打包發(fā)送給客戶端。
3.4 客戶端實現(xiàn)
   客戶端的流程如圖6所示。在Windows下運行,首先調用WSAStartup,Windows根據(jù)請求的Socket版本來搜索相應的Socket庫,然后綁定找到的Socket庫到該應用程序中。然后初始化socket,連接到服務器,接著過程調用。比如過程調用1會進入圖4狀態(tài)機。狀態(tài)機和服務器端類似,只是首先參數(shù)打包,發(fā)送給服務器,返回后拆包并拷貝返回信息到內存中。



4 結束語
    本文設計和實現(xiàn)的RPC可應用于白盒測試、跨平臺開發(fā)環(huán)境和開發(fā)客戶端軟件等。商用的嵌入式IDE軟件都很昂貴,通過本RPC,測試人員就可用開源的環(huán)境如cygwin等開發(fā)白盒測試代碼。另外對于有大量操作界面的嵌入式開發(fā),需要頻繁下載到開發(fā)板上驗證,本文RPC可應用于構建跨平臺的開發(fā)環(huán)境,直接在Windows上開發(fā)界面部分,最后下載到開發(fā)板上,從而大大提高開發(fā)效率。大多數(shù)的嵌入式軟件都有相應的PC客戶端軟件,本文的實現(xiàn)也適用于開發(fā)PC客戶端軟件。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據(jù)LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉