• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    基于模擬串行端口的虛擬設(shè)備通信技術(shù)研究

    2023-10-28 10:25:16侯佩儒曹炳堯宋英雄
    計(jì)算機(jī)測(cè)量與控制 2023年10期
    關(guān)鍵詞:內(nèi)核端口嵌入式

    侯佩儒,曹炳堯,宋英雄

    (上海大學(xué) 特種光纖與光接入網(wǎng)重點(diǎn)實(shí)驗(yàn)室,上海 200444)

    0 引言

    隨著現(xiàn)有的工程系統(tǒng)越發(fā)規(guī)模大型化、需求復(fù)雜化、模塊細(xì)分化[1],如:自動(dòng)駕駛汽車的車載嵌入式系統(tǒng)平均具有1億行代碼,并分布在近100個(gè)嵌入式計(jì)算機(jī)中[2]。傳統(tǒng)的設(shè)計(jì)模式使用文檔,難以進(jìn)行有效的模塊劃分與跨領(lǐng)域溝通,從而導(dǎo)致研制周期存在較高風(fēng)險(xiǎn)。因此,出現(xiàn)了基于模型的系統(tǒng)工程(MBSE,model-based systems engineering)。其采用標(biāo)準(zhǔn)化建模的方式來(lái)支持系統(tǒng)的完整設(shè)計(jì),改變了復(fù)雜系統(tǒng)的開(kāi)發(fā)模式,尤其是對(duì)智慧物聯(lián)網(wǎng)技術(shù)的高速發(fā)展催生出的復(fù)雜嵌入式系統(tǒng)開(kāi)發(fā)具備重要主導(dǎo)意義。目前,MBSE已廣泛應(yīng)用在航空航天[3-5]、國(guó)防軍工[6-7]、智慧城市[8]、軌道交通[9]等領(lǐng)域。

    基于MBSE的復(fù)雜嵌入式系統(tǒng)設(shè)計(jì)包括需求分析、系統(tǒng)設(shè)計(jì)、測(cè)試驗(yàn)證和需求確認(rèn)等多個(gè)環(huán)節(jié)[10-11]。其中,虛擬驗(yàn)證在測(cè)試驗(yàn)證中尤為重要,但卻一定程度上缺乏研究和探索[12]。由于嵌入式系統(tǒng)對(duì)硬件的依賴性強(qiáng)、場(chǎng)景專業(yè)性高、系統(tǒng)復(fù)雜性大,對(duì)嵌入式軟件開(kāi)發(fā)進(jìn)行虛擬驗(yàn)證需要在實(shí)物集成前提前模擬異構(gòu)硬件系統(tǒng),并考慮復(fù)雜嵌入式系統(tǒng)中各子系統(tǒng)之間的關(guān)聯(lián)。但是,目前仍缺乏高效通用、考慮整體的嵌入式模擬驗(yàn)證工具或平臺(tái)。

    虛擬化技術(shù)的快速發(fā)展與廣泛應(yīng)用,解決了單個(gè)嵌入式開(kāi)發(fā)板的模擬問(wèn)題。在本文中,每個(gè)利用虛擬化方式模擬的異構(gòu)子系統(tǒng)稱為虛擬設(shè)備。虛擬設(shè)備是指在MBSE模擬系統(tǒng)中,對(duì)應(yīng)嵌入式系統(tǒng)中可獨(dú)立分離的物理單元,用于驗(yàn)證開(kāi)發(fā)的軟件模擬組件。例如,在汽車部分自動(dòng)化嵌入式系統(tǒng)中,有Arduino 和樹(shù)莓派兩個(gè)主從開(kāi)發(fā)板模塊,前者連接控制電機(jī)的驅(qū)動(dòng)器,后者連接多種傳感器進(jìn)行數(shù)據(jù)處理與計(jì)算。這兩個(gè)模塊使用串行端口進(jìn)行通信[13-14],是互為可分離的物理單元,使用虛擬化技術(shù)模擬的這兩塊模塊單元即為虛擬設(shè)備。常用的虛擬化技術(shù)有操作系統(tǒng)層面虛擬化的Docker[15]、硬件開(kāi)發(fā)板層面虛擬化的QEMU(Quick Emulator)[16-17]等。QEMU具有跨平臺(tái)、高速度、可移植等優(yōu)點(diǎn),因此,本文選取QEMU來(lái)創(chuàng)建虛擬設(shè)備。

    嵌入式系統(tǒng)中,各組件間最普遍的通信方式是基于網(wǎng)絡(luò)和串行端口的通信。關(guān)于虛擬設(shè)備間的通信調(diào)試,已有一些相關(guān)研究。例如,文獻(xiàn)[18]利用將QEMU中虛擬網(wǎng)卡與宿主機(jī)的tap虛擬網(wǎng)卡綁定的方式進(jìn)行虛擬設(shè)備網(wǎng)絡(luò)通信;文獻(xiàn)[19]利用源定位技術(shù)、基于頻率發(fā)包與跟蹤技術(shù)等方法開(kāi)發(fā)了可模擬CAN總線的網(wǎng)絡(luò)仿真開(kāi)發(fā)平臺(tái),可進(jìn)行物理或虛擬控制設(shè)備的總線通信測(cè)試等。然而,關(guān)于串行端口通信調(diào)試的研究相對(duì)較少,主要是采用物理和虛擬兩種方式。物理方式是使用計(jì)算機(jī)上的真實(shí)物理串行端口進(jìn)行測(cè)試,需要使用物理連接線完成端口間的連通,并將真實(shí)串行端口配置綁定到虛擬設(shè)備內(nèi)使用。這種方式測(cè)試簡(jiǎn)單、可靠,但是僅支持小規(guī)模驗(yàn)證,在大規(guī)模場(chǎng)景下時(shí)會(huì)面臨物理接線復(fù)雜、計(jì)算機(jī)的端口資源受限等問(wèn)題。虛擬方式是采用模擬手段,在宿主機(jī)內(nèi)產(chǎn)生模擬串行端口供虛擬設(shè)備測(cè)試使用。相較于物理方式,該方式的優(yōu)點(diǎn)在于不依賴硬件、驗(yàn)證成本低。在Windows系統(tǒng)中,已有成熟可用的虛擬串行端口工具VSPD(virtual serial port driver)。在Linux系統(tǒng)中,雖然沒(méi)有類似的工具,但可以借助pty(pseudo terminal)偽終端設(shè)備來(lái)實(shí)現(xiàn)虛擬設(shè)備間的通信。但是,不論是成熟工具VSPD還是系統(tǒng)自帶pty設(shè)備,都進(jìn)行了嚴(yán)密的封裝,難以靈活接入統(tǒng)計(jì)或埋點(diǎn)接口,自定義調(diào)試難度較高,導(dǎo)致虛擬設(shè)備間的串行端口通信驗(yàn)證較為困難。由上述論述可知,針對(duì)虛擬設(shè)備互聯(lián)問(wèn)題,需要研究靈活可用的串行通信模擬技術(shù),以便實(shí)現(xiàn)多組件間的通信調(diào)試。

    本文針對(duì)在MBSE虛擬驗(yàn)證環(huán)節(jié),嵌入式虛擬設(shè)備間的串行端口通信問(wèn)題展開(kāi)研究,以實(shí)現(xiàn)在Linux系統(tǒng)環(huán)境下完成虛擬設(shè)備間串行通信的目標(biāo),并支持復(fù)雜嵌入式系統(tǒng)的全面數(shù)字化模擬,對(duì)MBSE工程化的最后一步實(shí)施與落地、和我國(guó)“十四五”規(guī)劃深入推進(jìn)數(shù)字化發(fā)展都具有重大意義。

    1 基于串行端口的虛擬設(shè)備間通信方案設(shè)計(jì)

    1.1 需求分析

    為了解決復(fù)雜嵌入式系統(tǒng)中子系統(tǒng)之間的串行端口通信模擬驗(yàn)證問(wèn)題,需要首先構(gòu)建虛擬設(shè)備,并創(chuàng)建串行端口,再進(jìn)行多個(gè)虛擬設(shè)備之間的通信。如圖1所示,通信時(shí)主要涉及到兩類主體對(duì)象:虛擬設(shè)備、串行端口鏈路,多個(gè)虛擬設(shè)備通過(guò)串行端口鏈路實(shí)現(xiàn)串行數(shù)據(jù)傳輸。

    圖1 基于串行端口的虛擬設(shè)備間通信方式

    虛擬設(shè)備的主要作用是為嵌入式軟件提供接近硬件的運(yùn)行環(huán)境,如:具備模擬的嵌入式外圍設(shè)備、能夠利用二進(jìn)制翻譯等技術(shù)直接執(zhí)行異構(gòu)指令集代碼等。由于虛擬設(shè)備采用軟件邏輯構(gòu)建模擬,在驗(yàn)證各單元的通信過(guò)程中,缺少物理串口介質(zhì)的鏈接。而在其中執(zhí)行串行通信時(shí),必須依賴串行端口,才能保證模擬系統(tǒng)中的程序可以和物理設(shè)備無(wú)縫移植。那就必須要求虛擬設(shè)備中具有串行端口,才能進(jìn)一步對(duì)串行端口設(shè)備進(jìn)行開(kāi)啟關(guān)閉、發(fā)送數(shù)據(jù)、接收數(shù)據(jù)等操作。

    串行端口鏈路位于多個(gè)虛擬設(shè)備之外,由多個(gè)外部串行端口及之間的端口連接線構(gòu)成。其主要作用是接收虛擬設(shè)備中內(nèi)部虛擬串行端口發(fā)送的數(shù)據(jù),并將數(shù)據(jù)傳輸?shù)搅硪欢?,發(fā)送給另一個(gè)虛擬設(shè)備,從而為兩端虛擬設(shè)備的內(nèi)部虛擬串行端口之間建立可通信的串行鏈路通道,實(shí)現(xiàn)虛擬設(shè)備間的串行端口通信。為了使內(nèi)部虛擬串行端口使用該鏈路,還需要將內(nèi)外串行端口進(jìn)行綁定或映射。

    為實(shí)現(xiàn)總體方案設(shè)計(jì),根據(jù)虛擬設(shè)備間進(jìn)行串行端口通信的方式,提出了如圖2所示的功能需求。

    圖2 基于串行端口的虛擬設(shè)備間通信功能需求

    1.2 總體方案

    根據(jù)上述功能需求分析,本文提出基于模擬串行端口的虛擬設(shè)備間通信架構(gòu),如圖3所示。自下而上分為物理硬件層、虛擬設(shè)備層、串行通信層。

    圖3 整體方案架構(gòu)

    物理硬件層:為L(zhǎng)inux系統(tǒng)的服務(wù)器或虛擬機(jī),為上層實(shí)現(xiàn)提供必要的整體硬件環(huán)境;

    虛擬設(shè)備層:為多個(gè)虛擬設(shè)備的模擬,包括內(nèi)部虛擬串行端口的創(chuàng)建與綁定,以及其他硬件模擬;

    串行通信層:為最上層,負(fù)責(zé)創(chuàng)建、配置、連接外部串行端口,連接后外部串行端口對(duì)之間可以構(gòu)建出串行通信鏈路,通過(guò)內(nèi)外部串行端口綁定和該串行通信鏈路,多個(gè)虛擬設(shè)備間即可實(shí)現(xiàn)串行端口通信。

    總體方案設(shè)計(jì)與實(shí)現(xiàn)時(shí),主要考慮以下4個(gè)功能模塊的設(shè)計(jì):

    1)外部串行端口創(chuàng)建模塊:

    該模塊負(fù)責(zé)在虛擬設(shè)備外部創(chuàng)建具備串行端口相關(guān)操作功能的設(shè)備,以供虛擬設(shè)備使用。鑒于已有虛擬串行端口工具具有強(qiáng)封裝的特點(diǎn),難以在其中接入調(diào)試、監(jiān)控、埋點(diǎn)等功能,無(wú)法自定義配置,只能進(jìn)行基本驗(yàn)證。

    本方案將自行編碼實(shí)現(xiàn)開(kāi)放、可控的虛擬串行端口模擬。為了具備兼容性、可擴(kuò)展性,以及支持測(cè)試代碼在無(wú)額外修改的情況下的可移植性,采用底層驅(qū)動(dòng)開(kāi)發(fā)的方式,分析Linux系統(tǒng)中的標(biāo)準(zhǔn)串行端口驅(qū)動(dòng),在此基礎(chǔ)上類比開(kāi)發(fā)虛擬的串行端口驅(qū)動(dòng)。該種方案下,用戶在應(yīng)用層看到的虛擬串行端口與標(biāo)準(zhǔn)串行端口是一致的,操作也相同,區(qū)別僅在于執(zhí)行底層操作時(shí)前者使用模擬方式,而后者使用物理方式。

    2)外部串行端口配置:

    為模擬創(chuàng)建的外部串行端口配置鏈路等相關(guān)參數(shù)。例如:配置該端口需要建立連接的另一個(gè)串行端口的索引信息,以便于后續(xù)鏈路構(gòu)建。

    3)外部串行端口連接:

    對(duì)于多個(gè)配置了對(duì)端信息的虛擬串行端口,連接對(duì)端的作用主要在于構(gòu)建接收、發(fā)送數(shù)據(jù)的通信鏈路??梢岳枚喾N方式傳遞兩端發(fā)送的消息,例如:管道、共享內(nèi)存、文件、消息隊(duì)列、網(wǎng)絡(luò)等。以文件交互方式為例,每個(gè)串行端口維護(hù)自己的屬性文件,并設(shè)置文件的寫(xiě)入回調(diào)函數(shù)。在發(fā)送時(shí)將信息寫(xiě)入對(duì)端串行端口對(duì)應(yīng)的文件中,對(duì)端文件觸發(fā)寫(xiě)入回調(diào),通知對(duì)端端口讀取文件,從而實(shí)現(xiàn)完整的收發(fā)過(guò)程。

    相較于文件方式,網(wǎng)絡(luò)傳遞信息可開(kāi)發(fā)度更高,也更具有分布式擴(kuò)展性,更適合大規(guī)模MBSE系統(tǒng)虛擬驗(yàn)證環(huán)節(jié)的云服務(wù)化。因此,本方案采用網(wǎng)絡(luò)方式實(shí)現(xiàn)多個(gè)串行端口的連接與鏈路構(gòu)建。

    4)內(nèi)部虛擬串行端口創(chuàng)建與綁定模塊:

    該模塊借助成熟的虛擬化軟件QEMU來(lái)實(shí)現(xiàn)虛擬設(shè)備的整體硬件模擬。并將模擬時(shí)創(chuàng)建的內(nèi)部虛擬串行端口與虛擬設(shè)備外、宿主機(jī)內(nèi)的外部串行端口進(jìn)行綁定,將后者作為前者的設(shè)備后端,即可在虛擬設(shè)備內(nèi)使用外部串行端口實(shí)現(xiàn)具體功能。

    根據(jù)上述設(shè)計(jì)可知,內(nèi)外部串行端口綁定之后,在虛擬設(shè)備內(nèi)對(duì)內(nèi)部串行端口執(zhí)行發(fā)送、接收等操作都是依靠外部串行端口及其通信鏈路來(lái)完成的。因此,本文接下來(lái)的研究重點(diǎn)是基于Linux系統(tǒng)底層驅(qū)動(dòng)開(kāi)發(fā)的虛擬外部串行端口模擬和其鏈路的構(gòu)建與實(shí)現(xiàn)。

    2 Linux系統(tǒng)中標(biāo)準(zhǔn)串行端口驅(qū)動(dòng)分析

    在進(jìn)行模擬串行端口的底層驅(qū)動(dòng)開(kāi)發(fā)之前,需要先對(duì)Linux系統(tǒng)中標(biāo)準(zhǔn)串行端口的驅(qū)動(dòng)實(shí)現(xiàn)進(jìn)行分析,以標(biāo)準(zhǔn)驅(qū)動(dòng)為參照類比設(shè)計(jì)與實(shí)現(xiàn),確保系統(tǒng)對(duì)虛擬串行端口的兼容性和后續(xù)擴(kuò)展性、可移植性。

    2.1 串行端口驅(qū)動(dòng)總述

    串行端口是嵌入式系統(tǒng)中常用的硬件端口,有RS232、RS422、RS485等多種電氣標(biāo)準(zhǔn)[20]。在Linux系統(tǒng)中,串行端口是一種tty(Teletypes)設(shè)備,用于串行地輸入、輸出數(shù)據(jù)。其設(shè)備驅(qū)動(dòng)位于操作系統(tǒng)的內(nèi)核空間,提供了計(jì)算機(jī)硬件與應(yīng)用程序的接口。在內(nèi)核空間實(shí)現(xiàn)虛擬串行端口的模擬,能真正做到上層軟件無(wú)感知。

    Linux內(nèi)核中,使用cdev結(jié)構(gòu)體描述字符設(shè)備,該結(jié)構(gòu)體是所有字符設(shè)備的抽象[21]。串行端口的整體驅(qū)動(dòng)框架如圖4所示。自右至左,驅(qū)動(dòng)可分為3個(gè)層次,分別為字符設(shè)備層、tty核心層和串行端口硬件層。字符設(shè)備層將tty設(shè)備作為字符設(shè)備,提供系統(tǒng)調(diào)用的統(tǒng)一接口,即cdev結(jié)構(gòu)體的操作函數(shù)集。操作函數(shù)會(huì)進(jìn)一步調(diào)用tty核心層的實(shí)現(xiàn)函數(shù)。tty核心層對(duì)底層硬件的具體形式進(jìn)行解耦與抽象,負(fù)責(zé)將上層操作經(jīng)線路規(guī)程進(jìn)行格式化協(xié)議轉(zhuǎn)換后,調(diào)用至下層。串行硬件核心層則真正地實(shí)現(xiàn)了對(duì)設(shè)備的管理和操作,直接與底層硬件交互,完成用戶請(qǐng)求。

    圖4 串行端口驅(qū)動(dòng)框架

    自頂層向下,驅(qū)動(dòng)主要包括uart_driver、tty_driver、uart_state、uart_port四大數(shù)據(jù)結(jié)構(gòu)。uart_driver是全局的根數(shù)據(jù)結(jié)構(gòu),進(jìn)行了高度的軟件邏輯抽象,負(fù)責(zé)保存和控制其他所有結(jié)構(gòu)體信息。tty_driver是對(duì)tty層的具體實(shí)現(xiàn);uart_state和uart_port是底層驅(qū)動(dòng)的具體實(shí)現(xiàn)。整體而言,設(shè)備硬件和uart_state、uart_port一一對(duì)應(yīng),而一個(gè)uart_driver對(duì)應(yīng)一個(gè)tty_driver和多個(gè)uart_state、uart_port,即多個(gè)同類型設(shè)備共用一種設(shè)備驅(qū)動(dòng)。

    完整的串行端口驅(qū)動(dòng)主要包括驅(qū)動(dòng)注冊(cè)、設(shè)備初始化、應(yīng)用操作3個(gè)部分。本章以Linux系統(tǒng)中8250串行端口為例,依次從這3個(gè)部分進(jìn)行分析。

    2.2 驅(qū)動(dòng)注冊(cè)分析

    在注冊(cè)前,8250串行端口的最上層驅(qū)動(dòng)uart_driver通過(guò)dev_name成員指定該設(shè)備在Linux系統(tǒng)中對(duì)應(yīng)的字符設(shè)備文件名稱前綴,major和minor成員分別指定設(shè)備的主設(shè)備號(hào)和最大支持設(shè)備數(shù)量等。

    之后,按照標(biāo)準(zhǔn)串行端口的驅(qū)動(dòng)注冊(cè)流程注冊(cè)。通過(guò)uart_register_driver()函數(shù)向內(nèi)核注冊(cè)上述uart_driver定義,并進(jìn)行一系列初始化操作。為每個(gè)uart_state申請(qǐng)空間,初始化state的tty_port成員,并為驅(qū)動(dòng)分配與初始化tty_driver,設(shè)置其操作函數(shù)集。該函數(shù)集即為系統(tǒng)調(diào)用的接口,構(gòu)建起Linux內(nèi)核驅(qū)動(dòng)和用戶空間交互的橋梁。最后進(jìn)行tty_driver的注冊(cè),將其掛載到全局tty驅(qū)動(dòng)鏈表,并進(jìn)行proc文件相關(guān)的注冊(cè)。此時(shí),雖然在內(nèi)核上注冊(cè)了驅(qū)動(dòng),但還沒(méi)有對(duì)接真正的硬件端口。

    2.3 設(shè)備初始化分析

    當(dāng)硬件設(shè)備接入系統(tǒng)時(shí),系統(tǒng)會(huì)根據(jù)圖4左上角所示的平臺(tái)驅(qū)動(dòng),調(diào)用設(shè)備獨(dú)有的dw8250_probe()硬件初始化函數(shù)。該部分與硬件端口緊密相關(guān),但也遵守標(biāo)準(zhǔn)串行端口的設(shè)備初始化流程。

    8250串行端口在uart_port之上,封裝了具體類型uart_8250_port。在初始化時(shí),首先根據(jù)調(diào)用的硬件平臺(tái)設(shè)備,對(duì)其中uart_port結(jié)構(gòu)體成員進(jìn)行相關(guān)初始化。設(shè)置中斷處理函數(shù)、線路規(guī)程設(shè)置函數(shù)、設(shè)備類型、寄存器地址等,并分配私有數(shù)據(jù)等。其次,按照標(biāo)準(zhǔn)串行端口設(shè)備初始化流程進(jìn)一步初始化,主要通過(guò)uart_add_one_port()函數(shù)實(shí)現(xiàn)。該函數(shù)根據(jù)串行端口編號(hào)將對(duì)應(yīng)uart_state和該uart_port進(jìn)行雙向綁定,并將設(shè)備對(duì)應(yīng)的uart_port添加到uart_driver。由此,設(shè)備利用硬件初始化函數(shù),通過(guò)串行端口硬件層,與tty核心層和字符設(shè)備層建立了聯(lián)系,用戶空間可以對(duì)真實(shí)的硬件設(shè)備進(jìn)行操作。

    2.4 串行端口應(yīng)用操作分析

    在進(jìn)行串行端口讀寫(xiě)操作之前,需要先打開(kāi)串行端口。打開(kāi)流程如圖4所示,自右至左為系統(tǒng)調(diào)用后,內(nèi)核由字符設(shè)備層的tty_open()函數(shù)開(kāi)始逐層調(diào)用。直到串行端口硬件層,根據(jù)uart_port的操作集調(diào)用8250串行端口獨(dú)有的serial8250_startup()函數(shù),進(jìn)行串行端口的硬件設(shè)置,如波特率、請(qǐng)求發(fā)送信號(hào)和硬件寄存器設(shè)置等,并初始化與使能串行端口的中斷。

    串行端口打開(kāi)之后,以讀取數(shù)據(jù)為例分析,主要涉及到兩個(gè)線程,分別稱為前臺(tái)線程和后臺(tái)線程。應(yīng)用程序在用戶空間使用read()函數(shù)讀取串行端口數(shù)據(jù),經(jīng)系統(tǒng)調(diào)用進(jìn)入內(nèi)核空間時(shí)由前臺(tái)線程執(zhí)行并進(jìn)行等待。后臺(tái)線程負(fù)責(zé)在中斷有數(shù)據(jù)時(shí)進(jìn)行讀取,把讀取的數(shù)據(jù)填充至tty_buffer中,再調(diào)用flush_to_ldisc()函數(shù),將數(shù)據(jù)存放進(jìn)線路規(guī)程的數(shù)據(jù)接收緩存中,喚醒前臺(tái)線程,使前臺(tái)線程讀取緩存中的數(shù)據(jù),并將數(shù)據(jù)從內(nèi)核空間拷貝進(jìn)用戶空間中,即可完成接收。向串行端口寫(xiě)入數(shù)據(jù)也是類似的,但數(shù)據(jù)流相反,在此不做贅述。

    3 模擬串行端口的方案設(shè)計(jì)與實(shí)現(xiàn)

    根據(jù)對(duì)標(biāo)準(zhǔn)串行端口的驅(qū)動(dòng)分析,能夠知道Linux系統(tǒng)為各種不同類型的串行端口提供了可復(fù)用的uart框架。例如,通過(guò)封裝的根數(shù)據(jù)結(jié)構(gòu)uart_driver,不同的串行端口可以定義自己的驅(qū)動(dòng)信息。如圖5所示,自定義串行端口驅(qū)動(dòng)在復(fù)用已有框架的基礎(chǔ)上,需要修改和定義3個(gè)主要部分。第一部分是每個(gè)串行端口驅(qū)動(dòng)注冊(cè)時(shí)都需要定義的,包含設(shè)備驅(qū)動(dòng)的名稱、設(shè)備號(hào)等信息;第二和第三部分涉及底層硬件的特定實(shí)現(xiàn),不同的串行端口需提供不同的操作函數(shù)以與硬件進(jìn)行交互。這三部分恰好對(duì)應(yīng)于驅(qū)動(dòng)注冊(cè)、設(shè)備初始化和功能操作。

    圖5 自定義串行端口驅(qū)動(dòng)設(shè)計(jì)框架

    基于標(biāo)準(zhǔn)串行端口的驅(qū)動(dòng)框架,本章參照8250串行端口的定義和注冊(cè)方式,對(duì)總體方案中的外部虛擬串行端口創(chuàng)建、配置、連接模塊進(jìn)行設(shè)計(jì),并最終實(shí)現(xiàn)了一個(gè)完整可用的外部虛擬串行端口驅(qū)動(dòng)。

    3.1 虛擬串行端口創(chuàng)建

    創(chuàng)建虛擬串行端口需要進(jìn)行驅(qū)動(dòng)注冊(cè)和設(shè)備初始化。驅(qū)動(dòng)注冊(cè)確保虛擬設(shè)備能在Linux系統(tǒng)中被識(shí)別,并提供內(nèi)核空間的接口供用戶空間使用;設(shè)備初始化類比設(shè)備接入的動(dòng)作,在系統(tǒng)上產(chǎn)生虛擬設(shè)備,并進(jìn)行一系列初始化操作。

    1)驅(qū)動(dòng)注冊(cè):

    參考8250串行端口,虛擬串行端口首先需要定義自身的驅(qū)動(dòng)信息。設(shè)置驅(qū)動(dòng)名為“virtual-uart”、字符設(shè)備文件名稱前綴為“vttyU”、最大支持串行端口個(gè)數(shù)等。并且,在未顯式地指定設(shè)備號(hào)的情況下,Linux系統(tǒng)會(huì)在驅(qū)動(dòng)加載時(shí)為其動(dòng)態(tài)分配設(shè)備號(hào),以避免人為指定發(fā)生沖突。驅(qū)動(dòng)信息定義完成后,通過(guò)uart_register_driver()函數(shù)將其注冊(cè)進(jìn)內(nèi)核,并對(duì)uart_driver等數(shù)據(jù)結(jié)構(gòu)進(jìn)行初始化。后續(xù)過(guò)程與標(biāo)準(zhǔn)串行端口驅(qū)動(dòng)注冊(cè)流程相同,進(jìn)行復(fù)用。

    2)設(shè)備初始化:

    在設(shè)備創(chuàng)建與初始化之前,需要先定義虛擬串行端口整體的端口數(shù)據(jù)結(jié)構(gòu)。類比8250串行端口在uart_port結(jié)構(gòu)體之上,進(jìn)一步封裝了與硬件相關(guān)的具體類型。在驅(qū)動(dòng)設(shè)計(jì)時(shí),也為虛擬串行端口封裝了具體數(shù)據(jù)結(jié)構(gòu)virtual_uart_port,包含了uart_port。由于虛擬串行端口不具有硬件設(shè)備,所以無(wú)法提供物理中斷和寄存器。為了真實(shí)模擬串行端口接收與發(fā)送數(shù)據(jù)的流程,該數(shù)據(jù)結(jié)構(gòu)內(nèi)提供接收和發(fā)送使能標(biāo)志位,用于控制虛擬串行端口能否收發(fā),并使用自旋鎖保護(hù)這兩個(gè)使能信號(hào)。此外,該數(shù)據(jù)結(jié)構(gòu)還提供了一個(gè)工作隊(duì)列,用于模擬中斷處理函數(shù),完成數(shù)據(jù)中斷發(fā)送操作。

    在具備整體的端口數(shù)據(jù)結(jié)構(gòu)后,就可以進(jìn)行具體設(shè)備的定義與注冊(cè)。由于不存在真實(shí)設(shè)備,無(wú)法通過(guò)系統(tǒng)自動(dòng)識(shí)別與掃描設(shè)備的方式獲取設(shè)備。因此,需要自行定義多個(gè)平臺(tái)設(shè)備,并為每個(gè)設(shè)備指定不重復(fù)的串行端口索引,以便后續(xù)串行端口連接時(shí)互相識(shí)別。定義好設(shè)備后,利用platform_device_register()函數(shù)將其注冊(cè)進(jìn)內(nèi)核中。但此時(shí)設(shè)備并不能進(jìn)行初始化操作,因?yàn)閮?nèi)核中沒(méi)有該設(shè)備對(duì)應(yīng)的平臺(tái)驅(qū)動(dòng)。

    為了保證設(shè)備進(jìn)一步初始化并與整體的端口數(shù)據(jù)結(jié)構(gòu)建立聯(lián)系,還需要定義對(duì)應(yīng)的平臺(tái)驅(qū)動(dòng)。其結(jié)構(gòu)體為platform_driver,具有probe、remove接口。其中,probe接口完成設(shè)備對(duì)應(yīng)uart_port的注冊(cè),remove接口完成uart_port的注銷。并且,需要為平臺(tái)驅(qū)動(dòng)設(shè)置與設(shè)備相同的名稱來(lái)實(shí)現(xiàn)設(shè)備和驅(qū)動(dòng)間的匹配檢測(cè)。此外,還需要實(shí)現(xiàn)設(shè)備注冊(cè)函數(shù),該函數(shù)為uart_port申請(qǐng)內(nèi)存,設(shè)置端口類型、序號(hào)、具體的操作函數(shù)集等,以及初始化整體數(shù)據(jù)結(jié)構(gòu)中的自旋鎖和工作隊(duì)列,并指定模擬串行端口發(fā)送中斷功能的函數(shù)作為該工作隊(duì)列的回調(diào)函數(shù)。其中,操作函數(shù)集和模擬發(fā)送中斷功能的回調(diào)函數(shù)是后續(xù)實(shí)現(xiàn)虛擬串行端口連接的重點(diǎn)內(nèi)容,將在后續(xù)章節(jié)具體設(shè)計(jì)。最后調(diào)用uart_add_one_port()函數(shù)將初始化后的uart_port添加到第一步注冊(cè)的驅(qū)動(dòng)中。

    3.2 虛擬串行端口配置

    配置模塊主要負(fù)責(zé)向串行端口配置構(gòu)建鏈路相關(guān)信息,例如:與該串行端口相連接的另一個(gè)串行端口的設(shè)備索引,以便串行端口可以自由組合與連接。這也為驅(qū)動(dòng)模塊加載進(jìn)內(nèi)核后,留下可交互的方式。

    在用戶空間,可以使用ioctl(input/output control)函數(shù)對(duì)設(shè)備進(jìn)行一些特殊控制,實(shí)現(xiàn)用戶空間和內(nèi)核驅(qū)動(dòng)之間的溝通。該函數(shù)指定設(shè)備的文件描述符、請(qǐng)求號(hào)和具體參數(shù),其中請(qǐng)求號(hào)代表交互協(xié)議,設(shè)備驅(qū)動(dòng)會(huì)根據(jù)請(qǐng)求號(hào)執(zhí)行相應(yīng)操作。用戶空間的ioctl請(qǐng)求經(jīng)系統(tǒng)調(diào)用后,會(huì)調(diào)用字符設(shè)備層的tty_ioctl()函數(shù),函數(shù)內(nèi)部將進(jìn)一步根據(jù)請(qǐng)求號(hào)調(diào)用相應(yīng)控制函數(shù)。因此,需要為配置事件預(yù)設(shè)未被占用、唯一的請(qǐng)求號(hào)。

    進(jìn)入內(nèi)核空間后,在設(shè)備初始化時(shí),可以通過(guò)uart_port指定的操作函數(shù)集實(shí)現(xiàn)對(duì)應(yīng)ioctl()函數(shù)。該函數(shù)根據(jù)預(yù)設(shè)的請(qǐng)求號(hào)執(zhí)行期望的配置操作,例如:配置構(gòu)建鏈路所需對(duì)端信息。首先,獲取攜帶的請(qǐng)求參數(shù),即得到對(duì)端串行端口的索引,并將其保存在本設(shè)備端口信息中。之后在串行端口連接時(shí),就可以知道連接的對(duì)象。如果需要更換連接對(duì)象,只需要重新配置即可,使驅(qū)動(dòng)更加靈活。

    3.3 虛擬串行端口連接

    真實(shí)的物理串行端口對(duì)是通過(guò)外部物理連接線來(lái)連通的,虛擬串行端口則只能使用軟件的方式進(jìn)行實(shí)現(xiàn)。經(jīng)過(guò)總體方案中對(duì)文件、共享內(nèi)存、管道等實(shí)現(xiàn)手段的討論,為了具有更高可開(kāi)發(fā)度和擴(kuò)展性,決定采用網(wǎng)絡(luò)的連接方式。具體實(shí)現(xiàn)方式是在設(shè)備驅(qū)動(dòng)中設(shè)置uart_port的操作函數(shù)集,使用網(wǎng)絡(luò)收發(fā)方式完成虛擬串行端口的發(fā)送和接收。

    使用網(wǎng)絡(luò)來(lái)模擬虛擬串行端口間的通道連接有兩種方案,如圖6所示。

    圖6 網(wǎng)絡(luò)模擬串行端口間通信的方案示意圖

    第一種方案需要在每個(gè)串行端口的整體數(shù)據(jù)結(jié)構(gòu)中維護(hù)一個(gè)網(wǎng)絡(luò)Socket套接字成員,并且兩個(gè)要連接的串行端口要求一個(gè)具備服務(wù)端,另一個(gè)具備客戶端,根據(jù)配置信息來(lái)設(shè)置本設(shè)備的Socket句柄是服務(wù)端或是客戶端。在串行端口設(shè)備初始化時(shí),通過(guò)對(duì)端索引信息獲取對(duì)端地址,連接對(duì)端Socket。連接后,將對(duì)端Socket句柄一并放入整體數(shù)據(jù)結(jié)構(gòu)中維護(hù),以便于收發(fā)數(shù)據(jù)時(shí)直接使用。通過(guò)這種方式,可以模擬出串行端口之間的收發(fā)傳輸通道。

    第二種方案需要在每個(gè)串行端口的整體數(shù)據(jù)結(jié)構(gòu)中維護(hù)兩個(gè)網(wǎng)絡(luò)Socket套接字成員,其中一個(gè)為服務(wù)端,用于模擬串行端口的接收數(shù)據(jù)引腳,另一個(gè)為客戶端,用于模擬串行端口的發(fā)送數(shù)據(jù)引腳。在這種方式下,兩個(gè)要連接的串行端口只需要將本端的客戶端連接到對(duì)端的服務(wù)端即可完成連接,并由客戶端發(fā)送數(shù)據(jù),服務(wù)端接收數(shù)據(jù)。通過(guò)這種方式,可以模擬出真實(shí)的串行端口物理傳輸方式,即兩個(gè)串行端口對(duì)之間建立的兩條網(wǎng)絡(luò)通道對(duì)應(yīng)了真實(shí)串行端口的發(fā)送與接收數(shù)據(jù)兩條物理線。

    相較于第一種方案,第二種方案更為細(xì)化,每個(gè)串行端口都是相同且獨(dú)立的,串行端口之間耦合性更低,無(wú)需像第一種方案根據(jù)端口索引值設(shè)置本端與對(duì)端Socket套接字是客戶端還是服務(wù)端,再進(jìn)行成對(duì)綁定。因此,本文選擇第二種方案來(lái)實(shí)現(xiàn)連接模塊。

    在設(shè)備初始化時(shí),根據(jù)設(shè)備索引值配置監(jiān)聽(tīng)端口號(hào)并開(kāi)啟服務(wù)端,等待客戶端連接請(qǐng)求。同時(shí),開(kāi)啟一個(gè)線程循環(huán)判斷服務(wù)端是否接收到消息。若有消息,則模擬接收中斷,將收取到的數(shù)據(jù)發(fā)送到tty_buffer的接收緩存中,并調(diào)用tty_flip_buffer_push()函數(shù),將接收緩存中的數(shù)據(jù)通過(guò)線路規(guī)程進(jìn)行接收。在發(fā)送數(shù)據(jù)時(shí),使用設(shè)備初始化時(shí)配置給工作隊(duì)列的回調(diào)函數(shù)來(lái)模擬發(fā)送中斷。在回調(diào)函數(shù)中,客戶端根據(jù)對(duì)端索引值獲取端口號(hào),連接對(duì)端串行端口的服務(wù)端,并利用網(wǎng)絡(luò)連接發(fā)送數(shù)據(jù)。即可在沒(méi)有實(shí)際硬件的情況下,使用虛擬串行端口完成數(shù)據(jù)收發(fā)的功能。

    4 實(shí)驗(yàn)結(jié)果與分析

    4.1 實(shí)驗(yàn)系統(tǒng)

    本文使用12核CPU、32GB內(nèi)存、200GB硬盤(pán)的虛擬機(jī)作為宿主機(jī)進(jìn)行實(shí)驗(yàn),該虛擬機(jī)位于搭載Intel(R)Xeon(R)Silver 4214R CPU @ 2.40GHz處理器、型號(hào)為UniServer R4900 G3的服務(wù)器上,并使用QEMU模擬器來(lái)模擬虛擬設(shè)備,完成整體方案驗(yàn)證,具體實(shí)驗(yàn)系統(tǒng)環(huán)境如表1所示。

    表1 實(shí)驗(yàn)系統(tǒng)環(huán)境參數(shù)

    為了驗(yàn)證方案設(shè)計(jì)與實(shí)現(xiàn)的有效性和正確性,分別對(duì)軟件模擬的串行端口進(jìn)行功能和性能驗(yàn)證、對(duì)基于模擬串行端口的虛擬設(shè)備互聯(lián)通信進(jìn)行可行性驗(yàn)證。

    4.2 模擬串行端口功能和性能驗(yàn)證

    在本方案中,虛擬串行端口驅(qū)動(dòng)被分為設(shè)備注冊(cè)和串行端口整體驅(qū)動(dòng)兩部分。前者負(fù)責(zé)定義硬件設(shè)備并將其注冊(cè)進(jìn)內(nèi)核中,以模擬硬件接入;后者負(fù)責(zé)實(shí)現(xiàn)串行端口相關(guān)結(jié)構(gòu)的初始化、注冊(cè)、端口連接等功能,是串行端口的整體設(shè)備驅(qū)動(dòng)。這兩個(gè)驅(qū)動(dòng)模塊均具備頭文件、模塊加載與卸載函數(shù)、模塊許可聲明等規(guī)范結(jié)構(gòu)。同時(shí),為驅(qū)動(dòng)模塊編寫(xiě)編譯文件,內(nèi)容包括讀取內(nèi)核源碼中的編譯文件和指明模塊源碼中各文件的依賴關(guān)系等。

    編譯執(zhí)行后,會(huì)生成對(duì)應(yīng).ko模塊文件,可以使用insmod命令加載模塊。以兩個(gè)虛擬串行端口為例,驅(qū)動(dòng)模塊被加載到系統(tǒng)內(nèi)核后,將執(zhí)行初始化程序,開(kāi)辟內(nèi)存、新建線程等。此時(shí),如表2所示,在系統(tǒng)的/dev目錄下,將會(huì)出現(xiàn)兩個(gè)串行端口字符設(shè)備,分別為vttyU0和vttyU1,設(shè)備前綴由驅(qū)動(dòng)定義的dev_name指定。

    表2 驅(qū)動(dòng)加載前后系統(tǒng)/dev目錄變化

    用戶態(tài)通過(guò)執(zhí)行ioctl()函數(shù)來(lái)指定每個(gè)串行端口的對(duì)端索引信息。內(nèi)核態(tài)驅(qū)動(dòng)完成相應(yīng)的設(shè)置后,本設(shè)備的Socket客戶端就會(huì)連接至對(duì)端設(shè)備的Socket服務(wù)端,實(shí)現(xiàn)串行端口之間的鏈路連通。在本實(shí)驗(yàn)中,即連接了vttyU0和vttyU1。對(duì)于用戶態(tài)的應(yīng)用程序而言,這兩個(gè)字符設(shè)備與其他普通串行端口設(shè)備并無(wú)區(qū)別。此時(shí),兩個(gè)串行端口的連接情況如圖7所示。編寫(xiě)串行端口讀寫(xiě)程序,對(duì)其進(jìn)行功能和性能測(cè)試。

    圖7 串行端口測(cè)試連接圖

    1)功能測(cè)試。將vttyU1作為發(fā)送端,vttyU0作為接收端,進(jìn)行數(shù)據(jù)持續(xù)收發(fā)操作,并將數(shù)據(jù)內(nèi)容及傳輸次數(shù)打印到終端。交換發(fā)送端與接收端后,結(jié)果仍然相同,結(jié)果如下所示:

    (1)vttyU1發(fā)送數(shù)據(jù)

    action@action-virtual-machine:~/uart-test sudo ./virtual_uart_test --dev=/dev/vttyU1 --type=write

    Send Data: SEND TEST! Num = 1!

    Send Data: SEND TEST! Num = 2!

    Send Data: SEND TEST! Num = 3!

    Send Data: SEND TEST! Num = 4!

    Send Data: SEND TEST! Num = 5!

    Send Data: SEND TEST! Num = 6!

    Send Data: SEND TEST! Num = 7!

    Send Data: SEND TEST! Num = 8!

    Send Data: SEND TEST! Num = 9!

    Send Data: SEND TEST! Num = 10!

    (2)vttyU0接收數(shù)據(jù)

    action@action-virtual-machine:~/uart-test sudo ./virtual_uart_test --dev=/dev/vttyU0 --type=read

    Receive Data: SEND TEST! Num = 1!

    Receive Data: SEND TEST! Num = 2!

    Receive Data: SEND TEST! Num = 3!

    Receive Data: SEND TEST! Num = 4!

    Receive Data: SEND TEST! Num = 5!

    Receive Data: SEND TEST! Num = 6!

    Receive Data: SEND TEST! Num = 7!

    Receive Data: SEND TEST! Num = 8!

    Receive Data: SEND TEST! Num = 9!

    Receive Data: SEND TEST! Num = 10!

    實(shí)驗(yàn)結(jié)果證明,串行端口模擬產(chǎn)生后,在用戶態(tài)的操作與物理串行端口的操作一致,接收到的數(shù)據(jù)和對(duì)端發(fā)送的數(shù)據(jù)內(nèi)容相同,因此通信功能可用。

    2)性能測(cè)試。對(duì)串行端口的最大傳輸速率進(jìn)行測(cè)試,測(cè)試方式為:將vttyU1作為發(fā)送端,以最小的時(shí)間間隔,持續(xù)發(fā)送1 024字節(jié)的數(shù)據(jù)給vttyU0,使得兩個(gè)串行端口驅(qū)動(dòng)一直處于最大速率的發(fā)送與接收狀態(tài)。在接收端vttyU0設(shè)置流量計(jì)數(shù)模塊和時(shí)間計(jì)算模塊,得到接收一定數(shù)據(jù)量時(shí)所花費(fèi)的時(shí)間,以計(jì)算單位時(shí)間內(nèi)傳輸?shù)谋忍財(cái)?shù),即數(shù)據(jù)傳輸速率。本實(shí)驗(yàn)進(jìn)行20組測(cè)試,每組測(cè)試發(fā)送和接收100 MB數(shù)據(jù),結(jié)果如圖8所示。

    圖8 串行端口傳輸速率測(cè)試結(jié)果

    實(shí)驗(yàn)結(jié)果表明,本方案設(shè)計(jì)的虛擬串行端口驅(qū)動(dòng)的數(shù)據(jù)傳輸速率快且較為穩(wěn)定,最大傳輸速率介于416.26 ~474.74 mbps之間,平均值為456.98 mbps,遠(yuǎn)超過(guò)物理串行端口的傳輸速率。例如,RS232串行端口最大傳輸速率為20 kbps,RS422/RS485串行端口最大傳輸速率為10 mbps等。此外,串行端口也在不斷發(fā)展更高速的傳輸速率。該虛擬串行端口不僅能夠滿足基礎(chǔ)物理串行端口模擬的速率要求,也能夠應(yīng)對(duì)速率更高的增強(qiáng)型串行端口模擬的場(chǎng)景,符合設(shè)計(jì)需求。

    4.3 基于模擬串行端口的虛擬設(shè)備間通信驗(yàn)證

    對(duì)虛擬設(shè)備間互聯(lián)通信進(jìn)行驗(yàn)證,首先需要?jiǎng)?chuàng)建兩個(gè)虛擬設(shè)備,使用QEMU在宿主機(jī)內(nèi)模擬兩塊樹(shù)莓派3B開(kāi)發(fā)板,包括CPU、內(nèi)存、外圍設(shè)備等硬件資源模擬。其次,每個(gè)虛擬設(shè)備內(nèi)都具有串行端口,將前述實(shí)驗(yàn)中創(chuàng)建的兩個(gè)模擬串行端口分別綁定為虛擬設(shè)備內(nèi)串行端口的設(shè)備后端,使得兩個(gè)虛擬設(shè)備可以借助外部宿主機(jī)內(nèi)的虛擬串行端口對(duì)進(jìn)行通信。模擬與綁定的具體命令如下所示:

    指定模擬樹(shù)莓派3B 1024 MB內(nèi)存

    sudo qemu-system-aarch64 -M raspi3b -m 1024 〗 指定設(shè)備樹(shù)文件

    -dtb img/bcm2710-rpi-3-b.dtb

    指定內(nèi)核

    -kernel img/kernel8.img

    指定加載鏡像與格式

    -drive format=raw,file=img/2020-02-13-raspbian-buster.img

    啟動(dòng)附加命令

    -append "rw earlycon=pl011,0x3f201000 console=ttyAMA0 loglevel=8 root=/dev/ mmcblk0p2 fsck.repair=yes net.ifnames=0 rootwait memtest=1 dwc_otg.fiq_fsm_enable=0 8250.nr_uarts=1"

    指定標(biāo)準(zhǔn)輸入輸出

    -serial stdio

    為樹(shù)莓派啟用USB鍵盤(pán)鼠標(biāo)等模擬

    -usb -device usb-kbd -device usb-tablet

    綁定外部串行端口/dev/vttyU0(另一個(gè)綁定/dev/vttyU1)

    -serial /dev/vttyU0

    綁定完成后,啟動(dòng)虛擬設(shè)備,進(jìn)入系統(tǒng)后可以看到在/dev目錄下都多出一個(gè)設(shè)備ttyS0。該設(shè)備是串行端口的設(shè)備前端,將消息在虛擬設(shè)備和設(shè)備后端之間進(jìn)行轉(zhuǎn)發(fā),真實(shí)地與虛擬設(shè)備外進(jìn)行數(shù)據(jù)收發(fā)交互的仍為宿主機(jī)內(nèi)創(chuàng)建的虛擬串行端口。由此,兩塊虛擬開(kāi)發(fā)板借助外部虛擬串行端口對(duì)vttyU0和vttyU1建立了兩個(gè)內(nèi)部ttyS0的通信鏈路,連接情況如圖9所示。

    圖9 虛擬設(shè)備串行通信測(cè)試連接圖

    對(duì)其進(jìn)行收發(fā)測(cè)試,測(cè)試方式為:在一塊虛擬樹(shù)莓派開(kāi)發(fā)板內(nèi)部打開(kāi)串行端口ttyS0,發(fā)送數(shù)據(jù)并打印發(fā)送次數(shù),另一塊虛擬樹(shù)莓派開(kāi)發(fā)板內(nèi)部打開(kāi)串行端口ttyS0,進(jìn)行數(shù)據(jù)接收并輸出至終端。反過(guò)來(lái)通信也是相同的,測(cè)試結(jié)果如下所示:

    (1)虛擬設(shè)備1發(fā)送數(shù)據(jù)

    pi@raspberrypi:~/myTests/uart-test ./virtual-uart --dev=/dev/ttyS0 --type=write

    Send Data: SEND TEST! Num = 1!

    Send Data: SEND TEST! Num = 2!

    Send Data: SEND TEST! Num = 3!

    Send Data: SEND TEST! Num = 4!

    Send Data: SEND TEST! Num = 5!

    Send Data: SEND TEST! Num = 6!

    Send Data: SEND TEST! Num = 7!

    Send Data: SEND TEST! Num = 8!

    Send Data: SEND TEST! Num = 9!

    Send Data: SEND TEST! Num = 10!

    (2)虛擬設(shè)備2接收數(shù)據(jù)

    pi@raspberrypi:~/myTests/uart-test ./virtual-uart --dev=/dev/ttyS0 --type=read

    Receive Data: SEND TEST! Num = 1!

    Receive Data: SEND TEST! Num = 2!

    Receive Data: SEND TEST! Num = 3!

    Receive Data: SEND TEST! Num = 4!

    Receive Data: SEND TEST! Num = 5!

    Receive Data: SEND TEST! Num = 6!

    Receive Data: SEND TEST! Num = 7!

    Receive Data: SEND TEST! Num = 8!

    Receive Data: SEND TEST! Num = 9!

    Receive Data: SEND TEST! Num = 10!

    測(cè)試結(jié)果表明,虛擬設(shè)備間可以利用本方案實(shí)現(xiàn)的虛擬串行端口,建立傳輸通道,進(jìn)行雙向通信。該程序也可以直接移植到物理的嵌入式終端上,直接進(jìn)行串行設(shè)備通信,可以確保模擬系統(tǒng)和程序具有較高的保真度和移植性。

    5 結(jié)束語(yǔ)

    本文針對(duì)在MBSE系統(tǒng)中的虛擬設(shè)備間進(jìn)行串行互聯(lián)通信的需求,提出了一種針對(duì)Linux系統(tǒng)的軟件模擬串行端口方案,并基于模擬串行端口實(shí)現(xiàn)多個(gè)嵌入式虛擬設(shè)備之間的互聯(lián)通信。本文的串行端口模擬通過(guò)參照Linux系統(tǒng)的標(biāo)準(zhǔn)串行端口驅(qū)動(dòng),復(fù)用標(biāo)準(zhǔn)uart驅(qū)動(dòng)框架,完成內(nèi)核驅(qū)動(dòng)開(kāi)發(fā),從內(nèi)核態(tài)產(chǎn)生虛擬串行端口,并實(shí)現(xiàn)了參數(shù)配置、通道連接等功能。

    通過(guò)對(duì)兩個(gè)已連接的虛擬串行端口進(jìn)行通信測(cè)試,驗(yàn)證了本文提出的模擬串行端口的可用性和具備平均456.98Mbps的最大傳輸速率,能夠滿足物理串行端口模擬的傳輸速率要求。

    同時(shí),通過(guò)為QEMU構(gòu)建的虛擬設(shè)備綁定模擬串行端口,實(shí)現(xiàn)了虛擬設(shè)備之間的串行數(shù)據(jù)通信。基于虛擬設(shè)備開(kāi)發(fā)的串行通信程序,可直接移植到物理硬件設(shè)備上,提高了嵌入式系統(tǒng)開(kāi)發(fā)調(diào)試的效率,為復(fù)雜嵌入式系統(tǒng)的全面數(shù)字化模擬提供了支持。

    猜你喜歡
    內(nèi)核端口嵌入式
    萬(wàn)物皆可IP的時(shí)代,我們當(dāng)夯實(shí)的IP內(nèi)核是什么?
    強(qiáng)化『高新』內(nèi)核 打造農(nóng)業(yè)『硅谷』
    一種端口故障的解決方案
    基于嵌入式Linux內(nèi)核的自恢復(fù)設(shè)計(jì)
    Linux內(nèi)核mmap保護(hù)機(jī)制研究
    搭建基于Qt的嵌入式開(kāi)發(fā)平臺(tái)
    端口阻塞與優(yōu)先級(jí)
    嵌入式軟PLC在電鍍生產(chǎn)流程控制系統(tǒng)中的應(yīng)用
    初識(shí)電腦端口
    電腦迷(2015年6期)2015-05-30 08:52:42
    生成樹(shù)協(xié)議實(shí)例探討
    色播在线永久视频| 好男人电影高清在线观看| 亚洲国产精品999在线| 十八禁网站免费在线| 免费搜索国产男女视频| 国内精品久久久久久久电影| 人妻丰满熟妇av一区二区三区| 国产精品国产高清国产av| 国产男靠女视频免费网站| 国产精品,欧美在线| 满18在线观看网站| 亚洲成人久久爱视频| 精品一区二区三区av网在线观看| 国产精品99久久99久久久不卡| 天天躁狠狠躁夜夜躁狠狠躁| 91成年电影在线观看| 欧美色视频一区免费| 中文字幕最新亚洲高清| 亚洲va日本ⅴa欧美va伊人久久| 此物有八面人人有两片| 国产黄a三级三级三级人| 禁无遮挡网站| 久久久久精品国产欧美久久久| 女性被躁到高潮视频| 免费看a级黄色片| 色综合站精品国产| 麻豆成人午夜福利视频| 久久久久久久久免费视频了| 黑人巨大精品欧美一区二区mp4| 日韩 欧美 亚洲 中文字幕| 久久人妻福利社区极品人妻图片| 日本一区二区免费在线视频| 免费观看精品视频网站| 一级a爱视频在线免费观看| 国产又色又爽无遮挡免费看| 国产伦人伦偷精品视频| e午夜精品久久久久久久| 一区二区三区国产精品乱码| 一进一出抽搐gif免费好疼| 99热只有精品国产| www.www免费av| svipshipincom国产片| 激情在线观看视频在线高清| 97人妻精品一区二区三区麻豆 | 九色国产91popny在线| 变态另类成人亚洲欧美熟女| 男女下面进入的视频免费午夜 | 亚洲中文日韩欧美视频| 老熟妇仑乱视频hdxx| 亚洲av成人av| 两性夫妻黄色片| 国产aⅴ精品一区二区三区波| 亚洲精品一卡2卡三卡4卡5卡| 午夜福利欧美成人| 精品免费久久久久久久清纯| 在线av久久热| 欧美乱色亚洲激情| 国产三级在线视频| 黑丝袜美女国产一区| 午夜老司机福利片| 一级毛片高清免费大全| 国内少妇人妻偷人精品xxx网站 | 色综合亚洲欧美另类图片| 母亲3免费完整高清在线观看| 午夜福利成人在线免费观看| 色婷婷久久久亚洲欧美| 成人永久免费在线观看视频| 日韩精品青青久久久久久| 国产三级黄色录像| 久99久视频精品免费| 啦啦啦韩国在线观看视频| 亚洲成人久久性| 天堂√8在线中文| 国产欧美日韩一区二区精品| 亚洲欧洲精品一区二区精品久久久| 国产精品99久久99久久久不卡| 久久精品国产亚洲av香蕉五月| 亚洲黑人精品在线| 伦理电影免费视频| 日本黄色视频三级网站网址| 88av欧美| 真人一进一出gif抽搐免费| 高潮久久久久久久久久久不卡| 亚洲成人免费电影在线观看| 亚洲久久久国产精品| 成年人黄色毛片网站| 黄色a级毛片大全视频| 亚洲一区二区三区色噜噜| 亚洲熟妇中文字幕五十中出| 真人一进一出gif抽搐免费| 日日夜夜操网爽| 日韩免费av在线播放| av有码第一页| 日本撒尿小便嘘嘘汇集6| 欧美乱码精品一区二区三区| 久久国产乱子伦精品免费另类| 日本免费a在线| 国产v大片淫在线免费观看| 757午夜福利合集在线观看| 一区二区日韩欧美中文字幕| 午夜福利在线观看吧| 亚洲欧洲精品一区二区精品久久久| 一区二区三区激情视频| 免费在线观看完整版高清| 国产色视频综合| 怎么达到女性高潮| 国产爱豆传媒在线观看 | 日本撒尿小便嘘嘘汇集6| 亚洲自偷自拍图片 自拍| 美女大奶头视频| 母亲3免费完整高清在线观看| 中文字幕最新亚洲高清| 丝袜在线中文字幕| 女生性感内裤真人,穿戴方法视频| 国内精品久久久久久久电影| 天天一区二区日本电影三级| 日韩欧美一区视频在线观看| 亚洲精品久久国产高清桃花| 黑人欧美特级aaaaaa片| 每晚都被弄得嗷嗷叫到高潮| 色综合站精品国产| 精品久久蜜臀av无| 国产精品99久久99久久久不卡| 精品乱码久久久久久99久播| 麻豆国产av国片精品| 成人一区二区视频在线观看| 此物有八面人人有两片| 亚洲欧美一区二区三区黑人| 可以免费在线观看a视频的电影网站| 亚洲av中文字字幕乱码综合 | 又大又爽又粗| 亚洲成人久久爱视频| 人人澡人人妻人| 亚洲精品在线美女| 国产av一区二区精品久久| 午夜福利在线观看吧| 热99re8久久精品国产| 色播在线永久视频| 最好的美女福利视频网| 波多野结衣高清作品| 久久精品成人免费网站| 久久久久国内视频| 欧美黑人巨大hd| 亚洲国产欧美一区二区综合| 99国产精品一区二区蜜桃av| 俄罗斯特黄特色一大片| 一个人免费在线观看的高清视频| 亚洲精品粉嫩美女一区| 国产欧美日韩精品亚洲av| 男女做爰动态图高潮gif福利片| 亚洲国产精品999在线| 天天躁狠狠躁夜夜躁狠狠躁| 免费看a级黄色片| 精品人妻1区二区| 一进一出抽搐gif免费好疼| 午夜福利高清视频| 日韩欧美 国产精品| 丝袜在线中文字幕| 午夜视频精品福利| 成人av一区二区三区在线看| 午夜福利高清视频| 91字幕亚洲| 日韩精品青青久久久久久| 韩国精品一区二区三区| www.自偷自拍.com| 男人舔奶头视频| 国产精品久久久久久亚洲av鲁大| 99国产极品粉嫩在线观看| 欧美又色又爽又黄视频| 亚洲真实伦在线观看| 最好的美女福利视频网| 成人三级黄色视频| 18禁黄网站禁片免费观看直播| 亚洲精品在线观看二区| 午夜免费成人在线视频| 亚洲真实伦在线观看| 亚洲国产精品sss在线观看| 天天躁狠狠躁夜夜躁狠狠躁| 99re在线观看精品视频| 国产不卡一卡二| 中文字幕人成人乱码亚洲影| www日本黄色视频网| 国产av一区二区精品久久| 日韩欧美一区二区三区在线观看| 久久亚洲真实| 亚洲无线在线观看| a级毛片在线看网站| 女警被强在线播放| 高潮久久久久久久久久久不卡| 国产精品免费视频内射| 2021天堂中文幕一二区在线观 | 精品高清国产在线一区| 亚洲全国av大片| 久久久久久久午夜电影| 国产国语露脸激情在线看| 中文字幕久久专区| 国产一区二区三区视频了| 美女高潮喷水抽搐中文字幕| 久久性视频一级片| 91麻豆av在线| 欧美 亚洲 国产 日韩一| 久久国产精品男人的天堂亚洲| а√天堂www在线а√下载| 免费看日本二区| 亚洲自偷自拍图片 自拍| 国产成人系列免费观看| 国产高清有码在线观看视频 | 精品欧美国产一区二区三| 久久久久久久久免费视频了| 99国产极品粉嫩在线观看| 欧美成人性av电影在线观看| 级片在线观看| 天天躁夜夜躁狠狠躁躁| 色综合站精品国产| 老司机午夜十八禁免费视频| 日韩国内少妇激情av| 91字幕亚洲| 搡老妇女老女人老熟妇| 国产成人啪精品午夜网站| 国产精品国产高清国产av| 日本 av在线| 国产黄a三级三级三级人| 国产av又大| 校园春色视频在线观看| 欧美不卡视频在线免费观看 | 久久九九热精品免费| 亚洲国产日韩欧美精品在线观看 | 真人做人爱边吃奶动态| 色综合亚洲欧美另类图片| 日本撒尿小便嘘嘘汇集6| 亚洲中文字幕日韩| 少妇裸体淫交视频免费看高清 | 超碰成人久久| 亚洲精品国产精品久久久不卡| 人妻久久中文字幕网| 亚洲专区中文字幕在线| 夜夜爽天天搞| 久久久久久久久中文| 久久精品国产亚洲av香蕉五月| 亚洲人成伊人成综合网2020| 欧美成人午夜精品| 日日干狠狠操夜夜爽| 久久久久久久久免费视频了| 日韩中文字幕欧美一区二区| 久久亚洲精品不卡| 无人区码免费观看不卡| 亚洲 欧美一区二区三区| 男人舔奶头视频| 亚洲七黄色美女视频| 最新美女视频免费是黄的| 欧美日韩黄片免| 精品久久久久久久毛片微露脸| 国产精品亚洲av一区麻豆| 亚洲欧美精品综合一区二区三区| 99热只有精品国产| 可以在线观看的亚洲视频| 亚洲国产欧美网| 美女免费视频网站| 禁无遮挡网站| 香蕉久久夜色| 国产一卡二卡三卡精品| bbb黄色大片| 成年版毛片免费区| 天堂动漫精品| 国产极品粉嫩免费观看在线| 波多野结衣巨乳人妻| 999精品在线视频| 老汉色av国产亚洲站长工具| 国内久久婷婷六月综合欲色啪| 人人妻,人人澡人人爽秒播| 欧美成狂野欧美在线观看| 老司机在亚洲福利影院| 黑丝袜美女国产一区| 男女那种视频在线观看| 一a级毛片在线观看| 99久久国产精品久久久| 欧美三级亚洲精品| 免费人成视频x8x8入口观看| 精品国产国语对白av| 深夜精品福利| 欧洲精品卡2卡3卡4卡5卡区| 在线视频色国产色| 精品一区二区三区四区五区乱码| 老司机靠b影院| av超薄肉色丝袜交足视频| 无限看片的www在线观看| 色综合站精品国产| 精品国产乱子伦一区二区三区| 国内揄拍国产精品人妻在线 | 亚洲一区二区三区不卡视频| 国产一区二区激情短视频| 两个人看的免费小视频| 国内揄拍国产精品人妻在线 | 久久精品人妻少妇| 大香蕉久久成人网| 午夜激情av网站| 国产伦人伦偷精品视频| 国产亚洲精品av在线| 在线天堂中文资源库| 级片在线观看| 日韩欧美一区视频在线观看| 在线av久久热| 国产av在哪里看| 久9热在线精品视频| 亚洲熟女毛片儿| 亚洲aⅴ乱码一区二区在线播放 | 成人三级黄色视频| 国产视频内射| 男人舔女人的私密视频| 一本一本综合久久| 精品福利观看| 亚洲精品中文字幕一二三四区| 91在线观看av| 美女高潮到喷水免费观看| 九色国产91popny在线| 一区二区日韩欧美中文字幕| 午夜福利成人在线免费观看| 亚洲国产精品sss在线观看| 国内精品久久久久久久电影| 亚洲全国av大片| 国产欧美日韩一区二区精品| 久久久久久免费高清国产稀缺| 久久久久国内视频| 老司机在亚洲福利影院| 国产成人精品久久二区二区91| 91在线观看av| 露出奶头的视频| 一级毛片女人18水好多| 国产私拍福利视频在线观看| а√天堂www在线а√下载| 亚洲在线自拍视频| 99热只有精品国产| 最近最新中文字幕大全电影3 | 十分钟在线观看高清视频www| 日韩免费av在线播放| 欧美色视频一区免费| 亚洲 欧美 日韩 在线 免费| 俺也久久电影网| 亚洲专区国产一区二区| 满18在线观看网站| 色婷婷久久久亚洲欧美| 亚洲av第一区精品v没综合| 成人永久免费在线观看视频| 丝袜美腿诱惑在线| 精品卡一卡二卡四卡免费| 19禁男女啪啪无遮挡网站| 男女那种视频在线观看| 深夜精品福利| 淫妇啪啪啪对白视频| 久久天堂一区二区三区四区| 法律面前人人平等表现在哪些方面| 在线视频色国产色| 狂野欧美激情性xxxx| 精品久久久久久,| 99久久精品国产亚洲精品| 亚洲全国av大片| 免费在线观看黄色视频的| 国产一区二区三区视频了| 青草久久国产| 欧美三级亚洲精品| 一本一本综合久久| 国产成人欧美| tocl精华| 国产高清视频在线播放一区| 日韩有码中文字幕| 欧美+亚洲+日韩+国产| 国产成人av教育| 97碰自拍视频| 久久久精品国产亚洲av高清涩受| 大型黄色视频在线免费观看| 日本一区二区免费在线视频| 男人舔奶头视频| x7x7x7水蜜桃| 亚洲精品在线观看二区| 亚洲成a人片在线一区二区| 亚洲av成人不卡在线观看播放网| 三级毛片av免费| 精品电影一区二区在线| 欧美日韩福利视频一区二区| 每晚都被弄得嗷嗷叫到高潮| 麻豆国产av国片精品| 日韩欧美 国产精品| 欧美日韩福利视频一区二区| 日韩精品青青久久久久久| 精品无人区乱码1区二区| 成人国产一区最新在线观看| 黄色片一级片一级黄色片| 韩国精品一区二区三区| av片东京热男人的天堂| 国产成人系列免费观看| 亚洲精品国产一区二区精华液| 亚洲精品久久成人aⅴ小说| 99热这里只有精品一区 | 欧美成人午夜精品| 香蕉国产在线看| 亚洲中文字幕一区二区三区有码在线看 | 超碰成人久久| 免费人成视频x8x8入口观看| 又紧又爽又黄一区二区| 国产色视频综合| 丝袜在线中文字幕| 热99re8久久精品国产| 亚洲 国产 在线| 在线看三级毛片| 最好的美女福利视频网| 精品午夜福利视频在线观看一区| 午夜福利欧美成人| www.熟女人妻精品国产| 男女床上黄色一级片免费看| 啦啦啦观看免费观看视频高清| 美女高潮到喷水免费观看| 高清在线国产一区| 久久精品91蜜桃| 黑人巨大精品欧美一区二区mp4| 亚洲激情在线av| 国产亚洲av嫩草精品影院| 搞女人的毛片| 免费高清视频大片| 嫁个100分男人电影在线观看| 国产亚洲精品av在线| 99热只有精品国产| 国产片内射在线| 免费av毛片视频| 午夜成年电影在线免费观看| 国内揄拍国产精品人妻在线 | 日本熟妇午夜| 亚洲精品中文字幕一二三四区| 搞女人的毛片| 性色av乱码一区二区三区2| 国产精品亚洲美女久久久| 欧美激情高清一区二区三区| netflix在线观看网站| 久久久久久大精品| 亚洲国产欧美网| 黑丝袜美女国产一区| 香蕉久久夜色| 欧美日韩乱码在线| 欧美 亚洲 国产 日韩一| 一夜夜www| 中文字幕精品免费在线观看视频| 国产亚洲欧美在线一区二区| 午夜久久久在线观看| 最好的美女福利视频网| 可以在线观看的亚洲视频| 国产亚洲精品久久久久久毛片| 色播亚洲综合网| 亚洲专区国产一区二区| 久久久久久久精品吃奶| 色综合婷婷激情| 日韩视频一区二区在线观看| 国产激情欧美一区二区| 在线永久观看黄色视频| 成年女人毛片免费观看观看9| 国产三级在线视频| 日韩一卡2卡3卡4卡2021年| 亚洲真实伦在线观看| e午夜精品久久久久久久| 人人妻,人人澡人人爽秒播| 欧美色欧美亚洲另类二区| 国产爱豆传媒在线观看 | 国产精品 欧美亚洲| 婷婷亚洲欧美| 成人亚洲精品一区在线观看| 91老司机精品| 日韩欧美三级三区| 国产1区2区3区精品| 99国产综合亚洲精品| 少妇熟女aⅴ在线视频| 国产成人精品无人区| 一级黄色大片毛片| 麻豆成人午夜福利视频| 亚洲国产精品sss在线观看| 国内久久婷婷六月综合欲色啪| 岛国视频午夜一区免费看| 国产精品电影一区二区三区| 久久中文字幕人妻熟女| 国语自产精品视频在线第100页| 国产av又大| 亚洲精品一区av在线观看| 亚洲av电影不卡..在线观看| www.999成人在线观看| 男男h啪啪无遮挡| 午夜亚洲福利在线播放| 日韩中文字幕欧美一区二区| 免费在线观看成人毛片| 久久狼人影院| 国产99久久九九免费精品| 天天添夜夜摸| 亚洲五月色婷婷综合| 午夜精品久久久久久毛片777| 免费看a级黄色片| 成人18禁在线播放| 视频区欧美日本亚洲| 99国产精品一区二区三区| 午夜免费激情av| 国产精品久久久久久亚洲av鲁大| 亚洲国产精品久久男人天堂| 亚洲精品粉嫩美女一区| 亚洲国产精品合色在线| 国产色视频综合| 人人妻人人澡欧美一区二区| 欧美国产日韩亚洲一区| 亚洲av日韩精品久久久久久密| 久久久久国产精品人妻aⅴ院| 两性夫妻黄色片| 村上凉子中文字幕在线| 久久人妻av系列| 成人18禁高潮啪啪吃奶动态图| 国产三级黄色录像| 免费无遮挡裸体视频| 久久午夜亚洲精品久久| 国产三级在线视频| 制服人妻中文乱码| 国产精品爽爽va在线观看网站 | 国内毛片毛片毛片毛片毛片| 亚洲专区国产一区二区| 中文字幕精品亚洲无线码一区 | 桃色一区二区三区在线观看| 久久99热这里只有精品18| 窝窝影院91人妻| 日本a在线网址| 久久精品91蜜桃| 亚洲免费av在线视频| 国产精品,欧美在线| 日日爽夜夜爽网站| 母亲3免费完整高清在线观看| 不卡一级毛片| 欧美成人免费av一区二区三区| 岛国视频午夜一区免费看| 亚洲一区二区三区不卡视频| 大香蕉久久成人网| 在线视频色国产色| 国内精品久久久久精免费| 日韩欧美免费精品| 一区二区三区激情视频| 在线av久久热| 天堂动漫精品| 757午夜福利合集在线观看| 99在线视频只有这里精品首页| 精品久久久久久,| 精品一区二区三区av网在线观看| 性色av乱码一区二区三区2| 欧美日韩黄片免| 老司机午夜福利在线观看视频| 国产精品一区二区三区四区久久 | 久久久久久久午夜电影| 一级a爱视频在线免费观看| 精品无人区乱码1区二区| 免费av毛片视频| 中文资源天堂在线| 久久性视频一级片| 亚洲成人精品中文字幕电影| 高潮久久久久久久久久久不卡| 亚洲七黄色美女视频| 99久久久亚洲精品蜜臀av| 精品久久久久久成人av| 午夜福利免费观看在线| 国产精品亚洲一级av第二区| 久久久久久亚洲精品国产蜜桃av| 国产精品,欧美在线| 亚洲欧美精品综合久久99| 国产成人系列免费观看| 他把我摸到了高潮在线观看| 麻豆一二三区av精品| 免费看美女性在线毛片视频| 国产精品国产高清国产av| 一边摸一边抽搐一进一小说| 国产精品综合久久久久久久免费| 午夜福利在线观看吧| 国产高清视频在线播放一区| 亚洲avbb在线观看| 天堂动漫精品| 久久久久国产精品人妻aⅴ院| 一本一本综合久久| 国产真人三级小视频在线观看| 一级毛片女人18水好多| 国产成人精品无人区| 亚洲 欧美 日韩 在线 免费| 亚洲第一欧美日韩一区二区三区| 老汉色av国产亚洲站长工具| 亚洲自偷自拍图片 自拍| 久久午夜亚洲精品久久| 国产一区在线观看成人免费| 丁香六月欧美| 色精品久久人妻99蜜桃| 嫩草影视91久久| 国产人伦9x9x在线观看| 香蕉丝袜av| 悠悠久久av| 欧美中文综合在线视频| 精品久久久久久久毛片微露脸| 一边摸一边做爽爽视频免费| 欧美丝袜亚洲另类 | 久久国产精品男人的天堂亚洲| 中文字幕久久专区| 亚洲aⅴ乱码一区二区在线播放 | 成人免费观看视频高清| 婷婷精品国产亚洲av| 香蕉国产在线看| 中文字幕人成人乱码亚洲影| 国产1区2区3区精品| 中国美女看黄片| 国产野战对白在线观看| 高潮久久久久久久久久久不卡| 国产成人精品久久二区二区91| 999久久久国产精品视频| 国产激情久久老熟女| 国产三级黄色录像| 侵犯人妻中文字幕一二三四区| 国产区一区二久久| 一二三四社区在线视频社区8| 手机成人av网站| aaaaa片日本免费| 亚洲精品色激情综合| 色老头精品视频在线观看|