亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于GPMC的多路數(shù)據(jù)采集設(shè)計(jì)與實(shí)現(xiàn)

        2019-01-05 01:21:00焦楓媛耿生群
        關(guān)鍵詞:應(yīng)用層內(nèi)核中斷

        吳 波, 焦楓媛, 劉 瑜, 耿生群

        (1. 中北大學(xué) 環(huán)境與安全工程學(xué)院, 山西 太原 030051; 2. 中北大學(xué) 信息與通信學(xué)院, 山西 太原 030051;3. 北京航空航天大學(xué) 信息與通信學(xué)院, 北京 100000)

        0 引 言

        Spartan-6 XC6SLX25是由Xilinx推出的采用45 nm工藝的低成本FPGA. 片上搭載邏輯單元24 051個(gè), 標(biāo)準(zhǔn)I/O Bank 4個(gè), 可滿足一般情況下的數(shù)據(jù)接口擴(kuò)展需求[1]. TMS320DM8168是目前TI推出的DaVinci系列中最先進(jìn)的數(shù)字媒體處理器. 它包含采用ARM v7架構(gòu)并帶有NEON向量/浮點(diǎn)協(xié)處理器的最高主頻率可達(dá)1.2 GHz的Cortex A8 RISC處理器、 TI C674x VLIW架構(gòu)最高頻率可達(dá)1 GHz的浮點(diǎn)DSP內(nèi)核以及針對(duì)高清視頻采集與處理的圖像協(xié)處理器. 該片上SOC在與FPGA通信時(shí)可采用通用存儲(chǔ)控制器(General-Purpose Memory Controller, GPMC)[2-5]. GPMC總線是由德州儀器公司(TI)開(kāi)發(fā)專門用于訪問(wèn)外部存儲(chǔ)設(shè)備的總線接口[6].

        本研究將基于Spartan-6 XC6SLX25與DM8168通過(guò)GPMC實(shí)現(xiàn)多路數(shù)據(jù)的采集.

        1 數(shù)據(jù)采集結(jié)構(gòu)設(shè)計(jì)

        圖 1 數(shù)據(jù)采集系統(tǒng)設(shè)計(jì)Fig.1 Thedesign of acquisition system

        多路數(shù)據(jù)的采集系統(tǒng)設(shè)計(jì)如圖 1 所示.

        在一般的生產(chǎn)活動(dòng)與安全監(jiān)管中不僅需要針對(duì)視頻數(shù)據(jù)的記錄, 多數(shù)情況下需要對(duì)多路串口、 CAN總線數(shù)據(jù)進(jìn)行實(shí)時(shí)記錄. 本設(shè)計(jì)方案采用FPGA對(duì)多路串口、 CAN總線數(shù)據(jù)進(jìn)行采集, 并對(duì)數(shù)據(jù)采用幀頭、 幀ID、 幀長(zhǎng)度的格式進(jìn)行重新組幀、 打包后送入GPMC接口. DM8168通過(guò)GPMC驅(qū)動(dòng)對(duì)FPGA傳輸來(lái)的整包數(shù)據(jù)進(jìn)行讀取、 解幀并分別存入磁盤.

        2 FPGA數(shù)據(jù)采集

        本研究采用FPGA對(duì)多路CAN總線數(shù)據(jù)、 多路串口數(shù)據(jù)進(jìn)行采集. 采集方式如圖 2 所示.

        圖 2 FPGA數(shù)據(jù)采集方式Fig.2 Data acquisition method by FPGA

        按圖 2 所示, 多路數(shù)據(jù)經(jīng)過(guò)FPGA采集后先通過(guò)一個(gè)小的FIFO_RX對(duì)自身進(jìn)行數(shù)據(jù)打包, 在小包數(shù)據(jù)上疊加時(shí)標(biāo)、 幀頭、 幀ID以及幀長(zhǎng)度等信息后, 送入一個(gè)較大的FIFO. 在較大的FIFO中把同一時(shí)間內(nèi)的數(shù)據(jù)一次組幀添加幀頭、 幀長(zhǎng)之后通過(guò)數(shù)據(jù)線向GPMC接口送入數(shù)據(jù)并通過(guò)中斷通知DM8168系統(tǒng)內(nèi)核.

        3 GMPC接口設(shè)計(jì)

        FPGA采集的數(shù)據(jù)與DM8168之間通過(guò)FPGA模擬DM8168的GPMC總線的讀寫時(shí)序來(lái)完成Cortex A8與FPGA的高速信號(hào)傳輸. 這種接口設(shè)計(jì)不僅能完成高速數(shù)據(jù)的傳輸, 同時(shí)也降低了設(shè)計(jì)過(guò)程中的復(fù)雜技術(shù), 提高了數(shù)據(jù)傳輸?shù)姆€(wěn)定性與可靠性, 是一種實(shí)現(xiàn)ARM 和 FPGA通信的有效方法[7].

        在面向DM8168的Cortex A8的GPMC驅(qū)動(dòng)實(shí)現(xiàn)中, 可采用基于Linux 2.6.xx內(nèi)核普遍使用的字符設(shè)備類似的驅(qū)動(dòng)管理與注冊(cè)機(jī)制, 字符設(shè)備指的是每次都以字符的形式進(jìn)行數(shù)據(jù)的發(fā)送和接收[8]. 在多路數(shù)據(jù)采集的設(shè)計(jì)中對(duì)外部設(shè)備的信號(hào)采集數(shù)據(jù)帶寬較低, 故本設(shè)計(jì)采用基于字符設(shè)備的GPMC驅(qū)動(dòng)數(shù)據(jù)傳輸模式. 驅(qū)動(dòng)運(yùn)行分為3部分: GPMC基于硬件層對(duì)內(nèi)核的注冊(cè); GPMC基于應(yīng)用層面向內(nèi)核的注冊(cè); GPMC驅(qū)動(dòng)加載.

        GPMC驅(qū)動(dòng)運(yùn)行結(jié)構(gòu)如圖 3 所示.

        圖 3 GPMC驅(qū)動(dòng)運(yùn)行結(jié)構(gòu)Fig.3 The structure of GPMC driver running

        在驅(qū)動(dòng)運(yùn)行中驅(qū)動(dòng)程序必須在嵌入式系統(tǒng)的內(nèi)核中進(jìn)行注冊(cè)與加載才能完成應(yīng)用層與外部設(shè)備的通信. GPMC驅(qū)動(dòng)通過(guò)基于硬件層面向內(nèi)核的注冊(cè), 將FPGA采集到的數(shù)據(jù)以字符的形式通過(guò)內(nèi)核進(jìn)行讀取, 然后存放在系統(tǒng)內(nèi)核中, 等到一定時(shí)間之后再通過(guò)驅(qū)動(dòng)由內(nèi)核向應(yīng)用層發(fā)送信號(hào), 通知應(yīng)用層讀取上一步中存放在內(nèi)核空間中的數(shù)據(jù).

        由于驅(qū)動(dòng)需要與內(nèi)核之間進(jìn)行交互, 在驅(qū)動(dòng)制作與加載時(shí)需要將內(nèi)核中g(shù)pmc.c的部分內(nèi)核代碼以去掉static(靜態(tài)函數(shù))的方式進(jìn)行修改并重新編譯.

        4 GPMC驅(qū)動(dòng)設(shè)計(jì)

        4.1 驅(qū)動(dòng)硬件結(jié)構(gòu)

        DM8168與各種各樣的字符設(shè)備或者存儲(chǔ)設(shè)備之間以L3慢速互聯(lián)的方式通過(guò)GPMC接口接入, 其原理框架[9]如圖 4 所示.

        GPMC本身具有十分靈活的編程模式, 可以實(shí)現(xiàn)對(duì)多種外部設(shè)備實(shí)現(xiàn)多方案配置.

        GPMC內(nèi)部具有高性能可配置的寄存器組. 通過(guò)對(duì)在單路GPMC總線使用情況下或者在多路片選GPMC總線使用情況下的GPMC寄存器配置可以令GPMC自身基于不同的外部設(shè)備對(duì)自身時(shí)序進(jìn)行自適應(yīng)配置[10].

        圖 4 GPMC驅(qū)動(dòng)硬件框架Fig.4 The hardware framework of GPMC driver

        用戶在使用DM8168芯片的GPMC接口與外部芯片或設(shè)備進(jìn)行通信時(shí)不需要考慮GPMC總線與外部設(shè)備的協(xié)調(diào)問(wèn)題, 這種特性使得DM8168通過(guò)GPMC總線能與更大范圍的外部存儲(chǔ)芯片及外部設(shè)備進(jìn)行通信, 如FPGA, SRAM, NANDFLASH及Ethernet PHY等芯片.

        4.2 GPMC寄存器配置

        本研究在GPMC接口所采用的是L3低速接口, 其采用One 8-bit/16-bit/32-bit interconnect access (read/write)的方式配置. 在數(shù)據(jù)讀取時(shí)序上采用Asynchronous Single Read Access模式的時(shí)序配置.

        驅(qū)動(dòng)整體的初始化與配置過(guò)程如圖 5 所示.

        GPMC初始化部分與參數(shù)設(shè)置部分在GPMC驅(qū)動(dòng)加載中根據(jù)實(shí)際情況完成, 在驅(qū)動(dòng)中設(shè)置 GPMC 寄存器參數(shù)前應(yīng)該將片選使能關(guān)閉[8].

        4.3 GPMC驅(qū)動(dòng)設(shè)計(jì)

        4.3.1 GPMC底層部分的驅(qū)動(dòng)設(shè)計(jì)

        DM8168硬件層面向內(nèi)核部分的GPMC驅(qū)動(dòng)注冊(cè)分為設(shè)備注冊(cè)與驅(qū)動(dòng)注冊(cè)兩步. GPMC設(shè)備注冊(cè)的定義與初始化由Linux內(nèi)核中的/devices.c文件通過(guò)利用/linux/ioport.h中的resource結(jié)構(gòu)體定義一個(gè)包含有GPMC所有需資源的結(jié)構(gòu)體實(shí)現(xiàn).

        Static structresource ti8168_gpmc_resources=

        {

        {

        .start = TI_GPMC_REG_BASE,

        .end = TI_GPMC_REG_BASE + SZ_16M-1,

        .name = “gpmc_dev_reg”,

        .flags = IORESOURCE_MEM

        },

        };

        通過(guò)以上操作完成資源配置后通過(guò)linux/platform_device.h中的platform_device結(jié)構(gòu)體定義面向驅(qū)動(dòng)設(shè)備的結(jié)構(gòu)體.

        圖 5 驅(qū)動(dòng)的初始化與配置Fig.5 The initialization and configuration of driver

        linuxplatform_device.h中的platform_device結(jié)構(gòu)體為:

        Static structplatform_device ti8168_gpmc_device =

        {

        {

        .name = “gpmc_test”,

        .id = 3,

        .num_resources = ARRAY_SIZE( ti8168_gpmc_resources ),

        .resource = ti8168_gpmc_resources;

        }

        };

        通過(guò)以上操作完成驅(qū)動(dòng)生成后, 通過(guò)linux/platform_device.h中的platform_driver完成結(jié)構(gòu)體定義, 執(zhí)行platform_device_register來(lái)完成驅(qū)動(dòng)注冊(cè)與設(shè)備綁定.

        structplatform_driver ti8168_gpmc_driver =

        {

        .driver =

        {

        .name = “gpmc_test”,

        .owner = THIS_MODULE,

        },

        .probe = ti8168_gpmc_probe,

        .remove = ti8168_gpmc_remove,

        };

        4.3.2 GPMC應(yīng)用層部分的驅(qū)動(dòng)設(shè)計(jì)

        DM8168應(yīng)用層面向內(nèi)核的驅(qū)動(dòng)主要是基于硬件層部分的驅(qū)動(dòng)定義面向應(yīng)用層的讀寫功能函數(shù).

        通過(guò)定義中斷結(jié)構(gòu)體, 利用FPGA以中斷的形式觸發(fā)驅(qū)動(dòng)讀取面向硬件層部分驅(qū)動(dòng)的數(shù)據(jù)實(shí)現(xiàn)與硬件層之間的交互.

        structirq_info

        {

        intirqinit; ∥ 中斷初始化標(biāo)志

        intirqnum; ∥ 中斷號(hào)

        intirqtype; ∥ 中斷觸發(fā)方式

        intirqenable; ∥ 中斷使能標(biāo)志

        unsigned intirqcnt; ∥ 中斷計(jì)數(shù)

        };

        通過(guò)定義設(shè)備信息結(jié)構(gòu)體存儲(chǔ)上一步中利用中斷響應(yīng)讀取到的硬件層數(shù)據(jù)信息以及應(yīng)用層使用的設(shè)備信息.

        structgpmcdev_info

        {

        u32 gpmccsbr; ∥ GPMC片選虛擬地址

        structirq_infoirqinfo; ∥ DSP2ARM中斷信息

        unsignedint flagrecv1;

        unsignedint flagrecv2;

        unsigned short* pbuffer_recv1;

        unsignedint buffer_len1;

        unsigned short* pbuffer_recv2;

        unsignedint buffer_len2;

        }gpmcdevinfo;

        通過(guò)使用file_operations結(jié)構(gòu)體中提供的函數(shù)指針, 基于前述的功能實(shí)現(xiàn)應(yīng)用層面向硬件設(shè)備的各種操作.

        staticstructfile_operationsgpmcdev_ops =

        {

        .open = gpmcdev_open, ∥ GPMC獲得設(shè)備句柄

        .write = gpmcdev_write, ∥ GPMC數(shù)據(jù)讀取

        .fasync = gpmcdev_fasync, ∥ GPMC異步通信

        圖 6 驅(qū)動(dòng)初始化過(guò)程Fig.6 Drive initialization

        .release = gpmcdev_release, ∥ GPMC設(shè)備釋放

        .unlocked_ioctl = gpmcdev_ioctl, ∥ GPMC設(shè)備io控制

        };

        4.4 GPMC驅(qū)動(dòng)初始化

        GPMC驅(qū)動(dòng)的初始化與加載通過(guò)shell指令insmod實(shí)現(xiàn)[10], 其實(shí)現(xiàn)過(guò)程如圖 6 所示.

        整個(gè)過(guò)程為insmod命令加載模塊初始化函數(shù), 在其執(zhí)行完之后, 加載探測(cè)函數(shù)并向內(nèi)核注冊(cè)驅(qū)動(dòng)生成設(shè)備節(jié)點(diǎn).

        4.5 GPMC異步通信實(shí)現(xiàn)

        驅(qū)動(dòng)與應(yīng)用層之間的通信以fasync(異步通信)的方式實(shí)現(xiàn). 通過(guò)對(duì)/Linux/fs.h中結(jié)構(gòu)體fasync_struct的定義來(lái)實(shí)現(xiàn)異步通信.

        structfasync_struct {

        spinlock_t fa_lock;

        int magic;

        int fa_fd;

        structfasync_struct *fa_next;

        struct file *fa_file;

        structrcu_head fa_rcu;

        } * async = NULL;

        ……

        int ret = fasync_helper(fd, filp, mode, &async);

        驅(qū)動(dòng)待應(yīng)用層準(zhǔn)備就緒后, 每隔1 s對(duì)向應(yīng)用層發(fā)送一個(gè)系統(tǒng)信號(hào), 應(yīng)用層響應(yīng)到系統(tǒng)信號(hào)后使用系統(tǒng)IO向特定地址讀取數(shù)據(jù)包. 這樣每1 s讀取一包數(shù)據(jù)可以提高系統(tǒng)的讀寫效率, 降低線程CPU占用.

        5 應(yīng)用層數(shù)據(jù)讀取與存儲(chǔ)

        在GPMC驅(qū)動(dòng)設(shè)計(jì)完成之后, 需要針對(duì)驅(qū)動(dòng)中提供的file_operations結(jié)構(gòu)體中包含的函數(shù)進(jìn)行相應(yīng)的操作. 利用file_operations結(jié)構(gòu)體內(nèi)核, 能夠方便地調(diào)用驅(qū)動(dòng)程序內(nèi)部的函數(shù), 并且可以方便地利用驅(qū)動(dòng)程序內(nèi)部使用的文件結(jié)構(gòu)來(lái)識(shí)別設(shè)備[11].

        GPMC設(shè)備操作部分代碼如下:

        blocked = block_sigio();

        sigemptyset(&sigact.sa_mask);

        sigact.sa_flags=0;

        sigact.sa_handler=sigio_handler;

        unblock_sigio(blocked);

        fd=open(DEVFILE, O_RDWR);

        fcntl(fd, F_SETOWN, getpid());

        oflag=fcntl(fd, F_GETFL);

        fcntl(fd, F_SETFL, oflag|FASYNC);

        通過(guò)上述代碼可實(shí)現(xiàn)應(yīng)用層對(duì)GPMC驅(qū)動(dòng)發(fā)出的系統(tǒng)中斷信號(hào)的實(shí)時(shí)響應(yīng), 每一次中斷信號(hào)的響應(yīng)都會(huì)執(zhí)行voidsigio_handler(intsigno)函數(shù). 在該函數(shù)中通過(guò)調(diào)用intioctl(intfd, int request, void * p)函數(shù)即可將fd文件符指向GPMC設(shè)備中, 利用GPMC設(shè)備的request模式, 將內(nèi)存中數(shù)據(jù)的首指針賦值給*p, 傳入數(shù)據(jù)指針, 從而實(shí)現(xiàn)基于GPMC的多路數(shù)據(jù)采集過(guò)程.

        6 測(cè) 試

        通過(guò)GPMC方式通信的實(shí)現(xiàn)結(jié)果如圖 7 所示.

        圖 7 FPGA時(shí)序圖Fig.7 FPGA sequence

        測(cè)試持續(xù)時(shí)間如圖 8 所示. 數(shù)據(jù)分析結(jié)果如圖 9 所示.

        圖 8 測(cè)試持續(xù)時(shí)間Fig.8 Test duration

        圖 9 數(shù)據(jù)分析結(jié)果Fig.9 Data analysis

        由此可以看出: 經(jīng)4 h最大數(shù)據(jù)帶寬連續(xù)數(shù)據(jù)采集測(cè)試, 本研究中所用采集方法在程序中運(yùn)行穩(wěn)定, 無(wú)誤碼.

        7 結(jié) 論

        本研究闡述了針對(duì)DM8168的基于FPGA數(shù)據(jù)采集與GPMC接口數(shù)據(jù)傳輸?shù)亩嗦窋?shù)據(jù)采集開(kāi)發(fā)過(guò)程. 根據(jù)GPMC的硬件特點(diǎn), 參考Linux字符設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)了通用流程, 設(shè)計(jì)出了一套安全穩(wěn)定切實(shí)可行的GPMC驅(qū)動(dòng), 并利用該驅(qū)動(dòng)在FPGA數(shù)據(jù)采集與DM8168之間進(jìn)行通信. 目前, 該驅(qū)動(dòng)已經(jīng)成功移植在DM8168搭建的嵌入式開(kāi)發(fā)平臺(tái), 并通過(guò)FPGA完成了多路數(shù)據(jù)的采集.

        猜你喜歡
        應(yīng)用層內(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ī)制研究
        跟蹤導(dǎo)練(二)(5)
        千里移防,衛(wèi)勤保障不中斷
        解放軍健康(2017年5期)2017-08-01 06:27:44
        基于分級(jí)保護(hù)的OA系統(tǒng)應(yīng)用層訪問(wèn)控制研究
        新一代雙向互動(dòng)電力線通信技術(shù)的應(yīng)用層協(xié)議研究
        物聯(lián)網(wǎng)技術(shù)在信息機(jī)房制冷系統(tǒng)中的應(yīng)用
        Current advances in neurotrauma research: diagnosis, neuroprotection, and neurorepair
        最新高清无码专区| 国产一区二区在线中文字幕 | 国产区一区二区三区性色| 午夜免费观看日韩一级视频| 成人午夜福利视频后入| 久久九九久精品国产| 亚洲精品理论电影在线观看| 亚洲精品精品日本日本| 小池里奈第一部av在线观看| 日本顶级metart裸体全部| 国产青草视频在线观看| a级福利毛片| 国产毛片一区二区三区| 偷拍一区二区三区高清视频| 日韩精品专区av无码| 国产乱人伦在线播放| 午夜国产精品久久久久| 久久久亚洲一区二区三区| 亚洲天堂成人av影院| 亚洲国产日韩精品一区二区三区| 粗了大了 整进去好爽视频| 久久久久久人妻一区二区无码Av| 亚洲av狠狠爱一区二区三区| 亚洲av无码国产精品色软件| 国产麻豆md传媒视频| 亚洲精品6久久久久中文字幕| 日韩精品高清不卡一区二区三区| 亚洲一区二区三区精品| 女人被狂躁c到高潮| av大片在线无码免费| 在线视频一区二区在线观看| 亚洲一区二区三区激情在线观看| 成年女人a级毛片免费观看| 欧美老妇与zozoz0交| 国产精品亚洲综合色区丝瓜| 精品人妻少妇丰满久久久免| 成人免费无码大片a毛片| 国产精品免费久久久久影院仙踪林| 欧美人与物videos另类| 国产一区二区三区免费视| 夹得好湿真拔不出来了动态图|