999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

QNX下PEX8311多路實時數據采集的驅動設計

2014-04-29 06:41:36湯文民張海洋
電子世界 2014年21期

湯文民 張海洋

【摘要】實時操作系統QNX在工業領域中的應用越來越廣泛,在高速數據采集方面QNX能最大限度地發揮實時操作系統的優勢。本文介紹了QNX下PEX8311多路實時數據采集驅動的開發流程。詳細闡述了驅動程序和應用程序之間利用共享內存方式完成進程通信的具體實現方法。最后,應用程序采用無鎖環形緩存進行多路數據分發的實現。該方法也為其他操作系統實現多路實時數據采集驅動程序提供了一種全新的方法。

【關鍵詞】QNX;PCI;共享內存;PEX8311;環形緩存

1.QNX多路實時采集卡

多路實時采集卡由基于PCI接口PEX8311和FPGA的連接組成。FPGA可以同時采集16路數據,每路數據采樣率達到200k且每路可以單獨設置采用率,因此最高采用率可以達到3.2M。PEX8311采用DMA工作模式中的demand方式將采集到的數據傳輸給運行在CPU上的QNX。驅動程序利用QNX實時性高的特點把采集到的數據實時存入到用戶程序和驅動程序都可以訪問的共享存儲空間中。驅動進程和應用進程利用共享內存方式交換采集數據,避免了不必要的中間環節,節省了系統開銷,增強了系統的實時性。

2.采集卡驅動設計

(1)資源管理器交互建立

資源管理器是QNX操作系統實現與用戶程序交互數據的通道,應用程序中使用到的open(),close(),read(),write()等函數通過資源管理器接口映射到底層函數對硬件相應的操作。實現流程如下:

dispatch_create();函數實現用戶程序與資源管理器交互所需要的通道

iofunc_func_init();該函數初始化應用程序功能函數層接口

iofunc_attr_init ();該函數初始化設備屬性接口

resmgr_attach ();該函數向進程管理器注冊,并使設備在命名空間中產生相應的名稱。

(2)硬件資源管理和分配

和其他操作系統類似,QNX提供了豐富的PCI接口函數,可

以方便地注冊、管理、使用PCI設備。具體流程如下:

ThreadCtl(); 設置線程對IO端口進行操作的權限

pci_attach(); 連接到QNX提供的PCI服務上

pci_attach_device();

devinit.port=inf.CpuBaseAddress[0]+(j*0x200);

devinit.intr=inf.Irq;

探測PCI設備并取得相應設備的資源,如設備首地址、中斷等。

port_regbase=mmap_device_memory();

設備首地址映射到內存地址,訪問設備寄存器用port_regbase+offset即可。

(3)中斷注冊

QNX提供了兩種連接中斷的接口:

Int InterruptAttachEvent(int intr,const struct sigevent *event,unsigned flags);

Int InterruptAttach(int intr,const struct sigevent*(*handler)(void*, int ), const void *area, int size, unsigned flags);

其中intr代表了中斷向量號,在讀取設備信息時已經被初始化在了info變量中。兩個函數分別有自己的優缺點,在具體設計中應視具體情況而定。InterruptAttachEvent()函數用法簡單,運行在用戶空間,可以啟動單獨的線程去處理特定任務,優點是其應用接近linux操作系統可以方便程序移植,缺點是當中斷發生時會引起上下文切換,從而使降低效率。對于InterruptAttach()函數而言,中斷處理函數首先將原線程打斷,然后判斷中斷是否需要建立新的線程處理此任務還是原線程處理此任務,所以對于不是自己要處理的中斷,可以減少上下文切換的開支。本論文中采樣InterruptAttach()函數處理中斷,具體操作流程如圖1所示。

圖1 InterruptAttach處理過程

為了減少系統調度開銷,采用圖1的調度策略,即中斷返回并沒有創建新的線程來處理中斷后的大量數據交換,而是在原線程中處理這些數據。

圖2 共享內存示意圖

(4)共享內存

驅動進程和應用進程采用共享內存的方式傳遞采集到的數據,PEX8311采用DMA方式,傳輸數據塊中包含16路的采集數據,其每次傳輸的數據塊長度為D_size,其中,由于每路的采集率可以設置為不同的采集率,所以傳輸數據塊中包含各路的信息量可以是不同的,例如:第一路采樣率為200k,第十路采樣率為100k,那么數據塊中包含第一路和第十路的數據量為2:1,圖2表示共享內存的示意圖,共享內存的大小為Shm_size=Shm_end–Shm_start,寫指針W_ptr和讀指針R_ptr沿著內存增加的方向移動,當到達共享內存底部時環回到頂端,讀寫指針在共享內存初始化時賦值為頂端地址,寫指針W_ptr只能被中斷程序修改,讀指針只能被應用程序修改。所以在共享內存使用上不需要信號量,只需保證寫指針W_ptr不超過讀指針R_ptr即可。

當PEX8311用DMA每傳輸完一個數據塊后產生一個中斷,在中斷服務程序中,除了做一些中斷保護外,對共享內存的處理描述代碼如下:

bufFlag = 1;

W_ptr += D_size;

if(W_ptr >= Shm_start + Shm_size)

W_ptr = Shm_start;

當中斷發生后,代碼D_size的數據已經傳輸完畢,寫指針W_ptr需要被重新賦值,指針移到下一位置準備接收,當其到達共享內存的的低端時,需要重新賦值Shm_start,然后開始采集下一幀數據。然后通過返回一個信號量,退出中斷,為了系統的實時性,中斷處理程序盡量短,在中斷中通過返回return(event)信號量辦法告訴QNX操作系統中斷處理函數執行完畢,需要進行調用InterruptWait()函數中斷后的后續操作,中斷后續操作的工作就是通知應用進程一幀數據已經采集完畢并存儲在共享內存中,可以進行讀操作了。函數sem_post()用來兩個進程間的通信,其為信號量加1,在應用進程里函數sem_wait()實現信號量減1,函數sem_post()和函數sem_wait()均為原子操作,這樣應用進程就能和驅動進程完成一個讀一個寫的操作。變量bufFlag為操作標志,在驅動進程里可以完成某種判讀的處理。

3.應用進程接口

應用進程把得到的采集數據放到16個環形緩存(buffer)里,每個環形緩存用一個結構體表示:

struct kbuf{

unsigned char *buffer;

unsigned int size;

unsigned int in;

unsigned int out;

};

環形緩存是一個實現無鎖且提供同時讀寫操作的特殊緩存,其容量大小size定義必須為2的冪。in為寫入指針,out為讀出指針。下面列出了環形緩存的寫入操作代碼:

len=min(len,k_buf->size-k_buf->in+k_buf->out);

l=min(len,k_buf->size-(k_buf->in&(k_buf->size-1)));

memcpy(k_buf->buffer+(k_buf->in &(k_buf->size-1)),data,l);

memcpy(k_buf->buffer,data+l,len-l);

k_buf->in+=len;

return len;

k_buf為環形緩存數據結構,data為要存入數據的地址指針,len為要寫入數據的長度,該操作返回實際寫入的數據長度。

4.結束語

本文介紹了PEX8311多路高速采集卡在QNX操作系統下的驅動程序設計。應用共享內存方式完成驅動和應用之間的進程通信,并利用環形緩存實現各路數據的存取。在實際應用中取得良好的效果。

主站蜘蛛池模板: 国产极品美女在线| 青青草国产免费国产| 亚洲天堂在线视频| 国产黑丝视频在线观看| 新SSS无码手机在线观看| 久久精品人妻中文系列| 亚洲第一在线播放| 九月婷婷亚洲综合在线| 精品日韩亚洲欧美高清a| 欧美日韩动态图| 在线人成精品免费视频| 欧美A级V片在线观看| 国产成人久久综合一区| 亚洲天堂精品在线观看| 欧美激情一区二区三区成人| hezyo加勒比一区二区三区| 亚洲第一视频免费在线| 婷婷丁香在线观看| 欧美精品亚洲精品日韩专区| 欧美视频二区| 国产在线观看91精品亚瑟| 女人18毛片水真多国产| www.av男人.com| 亚洲第一页在线观看| 国产电话自拍伊人| 综合色区亚洲熟妇在线| 免费视频在线2021入口| 四虎影视8848永久精品| 欧美日韩精品在线播放| 国产天天色| 国产精品va| 色欲色欲久久综合网| 欧美福利在线| 国产午夜精品一区二区三| 久久国产精品嫖妓| 欧美亚洲第一页| 国产农村妇女精品一二区| 伊人精品成人久久综合| 亚洲黄网在线| 国产无码精品在线| 国产aⅴ无码专区亚洲av综合网| 久久一级电影| 国产特一级毛片| 国产一区二区人大臿蕉香蕉| 四虎影院国产| 午夜国产大片免费观看| 欧美成人午夜在线全部免费| 日韩资源站| 国产成人亚洲综合A∨在线播放| 黄色网在线| 国产成在线观看免费视频| 亚洲中文字幕久久精品无码一区| 伊人久久大香线蕉成人综合网| 国产精品色婷婷在线观看| 91丝袜乱伦| 国产视频大全| 成人噜噜噜视频在线观看| 在线不卡免费视频| 香蕉蕉亚亚洲aav综合| 欧美区在线播放| 日本久久免费| www.精品国产| 九九香蕉视频| 极品私人尤物在线精品首页| 亚洲性日韩精品一区二区| 亚洲天堂2014| 97色婷婷成人综合在线观看| 熟妇丰满人妻| 国内精自线i品一区202| 熟女日韩精品2区| 国产欧美另类| 日韩a级片视频| 国产毛片网站| 久青草国产高清在线视频| 99在线小视频| 国产成人亚洲无码淙合青草| 亚洲午夜久久久精品电影院| 国产麻豆精品手机在线观看| AV无码一区二区三区四区| 中文国产成人精品久久| 色综合久久综合网| 日韩国产 在线|