dma編程
❶ 如何用labview 的int 或 DMA編程採集壓力數據
你用的是哪個公司的採集卡?型號是什麼?
告訴這些才知道怎麼編寫,不同公司的板卡驅動不一樣,程序編寫也不一樣了。
❷ DMA控制器的DMA控制器的設置
目前有兩類主要的DMA傳輸結構:寄存器模式和描述符模式。無論屬於哪一類DMA,表1的幾種信息都會在DMA控制器中出現。當DMA以寄存器模式工作時,DMA控制器只是簡單地利用寄存器中所存儲的參數值。在描述符模式中,DMA控制器在存儲器中查找自己的配置參數。
1)基於寄存器的DMA
在基於寄存器的DMA內部,處理器直接對DMA控制寄存器進行編程,來啟動傳輸。基於寄存器的DMA提供了最佳的DMA控制器性能,因為寄存器並不需要不斷地從存儲器中的描述符上載入數據,而內核也不需要保持描述符。基於寄存器的DMA由兩種子模式組成:自動緩沖(Autobuffer)模式和停止模式。在自動緩沖DMA中,當一個傳輸塊傳輸完畢,控制寄存器就自動重新載入其最初的設定值,同一個DMA進程重新啟動,開銷為零。如果將一個自動緩沖DMA設定為從外設傳輸一定數量的字到 L1數據存儲器的緩沖器上,則DMA控制器將會在最後一個字傳輸完成的時刻就迅速重新載入初始的參數。這構成了一個「循環緩沖器」,因為當一個量值被寫入 到緩沖器的最後一個位置上時,下一個值將被寫入到緩沖器的第一個位置上。
自動緩沖DMA特別適合於對性能敏感的、存在持續數據流的應用。DMA控制器可以在獨立於處理器其他活動的情況下讀入數據流,然後在每次傳輸結束時,向內核發出中斷。
停止模式的工作方式與自動緩沖DMA類似,區別在於各寄存器在DMA結束後不會重新載入,因 此整個DMA傳輸只發生一次。停止模式對於基於某種事件的一次性傳輸來說十分有用。例如,非定期地將數據塊從一個位置轉移到另一個位置。當你需要對事件進 行同步時,這種模式也非常有用。例如,如果一個任務必須在下一次傳輸前完成的話,則停止模式可以確保各事件發生的先後順序。此外,停止模式對於緩沖器的初 始化來說非常有用。
2)描述符模型
基於描述符(descriptor)的DMA要求在存儲器中存入一組參數,以 啟動DMA的系列操作。該描述符所包含的參數與那些通常通過編程寫入DMA控制寄存器組的所有參數相同。不過,描述符還可以容許多個DMA操作序列串在一 起。在基於描述符的DMA操作中,我們可以對一個DMA通道進行編程,在當前的操作序列完成後,自動設置並啟動另一次DMA傳輸。基於描述符的方式為管理 系統中的DMA傳輸提供了最大的靈活性。
❸ 在DMA編程時如何設定Transfersize, Burstsize, Width
DMA
對於ISA設備,DMA只能在16M以下內存中進行
#define __get_dma_pages(gfp_mask, order \
__get_free_pages((gfp_mask)|GFP_DMA,(order))
static unsigned long dma_mem_alloc(int size)
{
int order = get_order(size);
return __get_dma_pages(GFP_KERNEL,order);
基於DMA的硬體使用匯流排地址而非物理地址(CPU角度看到的未經轉換的地址)
虛擬地址/匯流排地址
unsigned long virt_bus(volatile void *address);
void *bus_to_virt(unsigned long address);
DMA地址掩碼
int dma_set_mask(struct device *dev, u64 mask);
分配DMA一致性的內存區域
void *dma_alloc_coherent(struct device *dev,size_t size, dma_addr_t *handl,gfp_t gfp);
返回DMA緩沖的虛擬地址,handle返回匯流排地址
void *dma_free_coherent(struct device *dev,size_t size, dma_addr_t );
void *dma_alloc_writecombine(struct device *dev,size_t size, dma_addr_t *handl,gfp_t gfp);
流式DMA映射
dma_addr_t dma_map_single(struct device *dev, void *buffer, size_t dize, enum
dma_data_direction direction);
獲得DMA緩沖區控制權
void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_addr, size_t dize, enum
dma_data_direction direction);
direct DMA_TO_DEVICE DMA_FROM_DEVICE DMA_BIDIRIRECTIONAL DMA_NONE
dma_addr_t dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t dize, enum
dma_data_direction direction);
返還控制權
void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_addr, size_t dize, enum
dma_data_direction direction);
申請大緩沖區 SG模式下申請不連續小緩沖
int dma_map_sg(struct device *dev,struct scatterlist *sg,int nents, enum
dma_data_direction direction);
返回緩沖區數量 對每個項,函數為設備產生恰當的匯流排地址
struct scatterlist
{
struct page *page;
unsigned int offset;
dma_addr_t dma_adress;
unsigned int length;
}
執行dma_map_sg()後,sg_dma_address可返回scatterlist 對應緩沖區匯流排地址,sg_dma_len()
dma_addr_t sg_dma_address(struct scatterlist *sg);
unsigned int sg_dma_len(struct scatterlist *sg);
mem= 預留緩存作為IO內存使用,可以靜態映射也可以ioremap();
=======================================================
申請DMA通道
int request_dma(unsigned int dmant, const char * device_id);
void free_dma(unsigned int dmanr)
流程
1open():request_dma()初始化DMAC 申請DMA緩沖區
2write()..:DMA傳輸
3中斷處理:若能進行中斷處理,進行中斷處理
4release :釋放緩沖區 free_dma()
===
使用8237DMA範例
typedef struct
{....
void *dma_buffer;
struct {
unsigned int direction;
unsigned int length;
void *target;
unsigned long start_time;
}current_dma;
unsigned char dma;
}xxx_device;
static int xxx_open()
{
....
//set up interrupt
if((retval= request_irq(dev->irq, &xxx_interrupt, 0, dev->name, dev)))
{ printk( KERN_ERR "%s:could not allocate IRQ %d\n", dev->name, dev->irq);
return retval;
}
//request dma
if((retval= request_dma(dev->dma, dev->name)))
{
free_irq(dev->irq, dev);
printk(KERN_ERR "%s :could not alloc DMA%d chann..);
return retval;
}
dev->dma_buffer = ((void *)dma_mem_alloc(DMA_BUFFER_SIZE);
if(!dev->dma_buffer)
{
printk(KERN_ERR );
free_dma(dev->dma);
free_irq(dev->irq,dev);
return -ENOMEM;
}
init_dma();
...
}
static int mem_to_xxx(const byte *buf, int len)
{
...
dev->current_dma.direction =1;
devo->current_dma.start_time = jiffies;
memcpy(dev->dma_buffer, buf, len);
target= isa_virt_to_bus(dev->dma_buffer)// ISA
//write
flags= claim_dma_lock();
disable_dma(dev->dma);
clear_dma_ff(dev->dma); //dma flip flop
set_dma_mode(dev->dma, 0x48); //dma ->io
set_dma_addr(dev->dma, target);//addr
set_dma_count(dev->dma,len);
outb_control(dev->x_ctrl|DMAE|TCEN,dev)//get device DMA
enable_dma(devo->dma);
release_dma_lock(flags);
printk(KERN_DEBUG "%s :dma transfer started \n" ,dev->name);
...
}
static int xxx_to_mem(const byte *buf, int len, char *target)
{
...
dev->current_dma.target = target;
dev->current_dma.direction =0;
devo->current_dma.start_time = jiffies;
devo->current_dma.length = len;
outb_control(dev->x_ctrl|DIR|TCEN|DMAE,dev)
flags= claim_dma_lock();
disable_dma(dev->dma);
clear_dma_ff(dev->dma); //dma flip flop
set_dma_mode(dev->dma, 0x04); //
set_dma_addr(dev->dma, isa_virt_to_bus(target));//addr
set_dma_count(dev->dma,len);
enable_dma(devo->dma);
release_dma_lock(flags);
...
}
static irqreturn_t xxx_interrupt(int irq, void *dev_id, struct pt_regs *reg_ptr)
{
....
do
{ ///complete??
if(int_type==DMA_DONE)
{ outb_control(dev->x_ctrl &~(DMAE|TCEN|DIR), dev);
if(dev->current_dma.direction)
{
...
}
else
{
memcpy(dev->current_dma.target, dev->dma_buffer,dev->current_dma.len);
}
else if{int_type=RECV_DATA)
{
xxx_to_mem(...);//通過DMA讀數據到內存。
}
望採納!!!
❹ dma是什麼
DMA是什麼?
當我們向計算機中加入了一塊新的音效卡或其它適配卡時,安裝程序可能會提醒我們應該選擇一個DMA通道。那DMA是什麼呢?
DMA(Direct Memory Access) ,即直接存儲器存取,是一種快速傳送數據的機制。數據傳遞可以從適配卡到內存,從內存到適配卡或從一段內存到另一段內存。DMA技術的重要性在於,利用它進行數據傳送時不需要CPU的參與。每台電腦主機板上都有DMA控制器,通常計算機對其編程,並用一個適配器上的ROM(如軟盤驅動控制器上的ROM)來儲存程序,這些程序控制DMA傳送數據。一旦控制器初始化完成,數據開始傳送,DMA就可以脫離CPU,獨立完成數據傳送。在DMA傳送開始的短暫時間內,基本上有兩個處理器為它工作,一個執行程序代碼,一個傳送數據。
利用DMA傳送數據的另一個好處是,數據直接在源地址和目的地址之間傳送,不需要中間媒介。如果通過CPU把一個位元組從適配卡傳送至內存,需要兩步操作。首先,CPU把這個位元組從適配卡讀到內部寄存器中,然後再從寄存器傳送到內存的適當地址。DMA控制器將這些操作簡化為一步,它操作匯流排上的控制信號,使寫位元組一次完成。這樣大大提高了計算機運行速度和工作效率。
計算機發展到今天,DMA已不再用於內存到內存的數據傳送,因為CPU速度非常快,做這件事,比用DMA控制還要快,但要在適配卡和內存之間傳送數據,仍然是非DMA莫屬。要從適配卡到內存傳送數據,DMA同時觸發從適配卡讀數據匯流排(即I/O讀操作)和向內存寫數據的匯流排。激活I/O讀操作就是讓適配卡把一個數據單位(通常是一個位元組或一個字)放到PC數據匯流排上,因為此時內存寫匯流排也被激活,數據就被同時從PC匯流排上拷貝到內存中。對於每一次寫操作,DMA控制器都控制地址匯流排,通知應將數據寫到哪段內存中去。
DMA控制數據從內存傳送到適配卡的方法與上面類似。對每一個要傳送的單位數據,DMA控制器激活讀內存和I/O寫操作的匯流排。內存地址被放到地址匯流排上,像從適配卡到內存傳送數據一樣,以數據匯流排為通道,數據從源地址直接傳送到目的地址。
DMA從DMA請求線(DREQ)上接收DMA請求,正像中斷控制器從中斷請求線(IRQ)上接收中斷請求一樣。一個典型的從適配卡到內存的數據傳送是這樣進行的,首先,對DMA控制器編程,寫入數據要到達的內存地址和要傳送的位元組數。適配器可以開始傳送數據時,它將激活DREQ線,與DMA控制器連通。DMA控制器在與CPU取得匯流排控制權後,輸出內存地址,發送控制信號,使得一個位元組或一個字從適配器讀出並寫入相應內存中,然後更新內存地址,指向下一個位元組(或字)要寫入的地址,重復上面的操作,直至數據傳送完畢。對控制器進行不同編程,就可以實現單位元組傳送(即每傳送一個位元組都要求一個DREQ信號)或塊數據傳送(即全部數據傳送只需要一個DREQ信號)。
如果你要往計算機中插一塊適配卡,而且適配卡使用DMA,通常安裝程序會讓你選擇一個DMA通道,設定DIP開關或跳線,來為相應適配器設置DMA通道。盡管從理論上講,只要不是同時使用DREQ線,不同的適配卡可以共享這條線的,但是按常規,我們最好為每個適配卡單獨安排一個DMA通道,這樣就可以保證不會發生DMA沖突。附表是DMA的預設分配情況。
通道 功能 通道 功能
O 空閑 4 用於級聯DMA控制器
1 空閑 5 空閑
2 軟盤 6 空閑
3 空閑 7 空閑
從中可以看出,DMA通道2和4已被佔用,在大多數微機上,通道1、3、5、6和7可由你任意分配。我們平時最好對自己的計算機上DMA通道的分配情況記錄下來,以免我們向計算機增加新硬體時出現兩個適配卡共用一個通道,導致沖突。
❺ DMA控制器通過中斷向CPU發DMA請求信號。請判斷題。對錯
不對。DMA控制器有兩種結束模式,中斷和查詢。選擇中斷後,應該是當數據傳送完畢後,才向CPU發送信號。
DMA既可以指內存和外設直接存取數據這種內存訪問的計算機技術,又可以指實現該技術的硬體模塊(對於通用計算機PC而言,DMA控制邏輯由CPU和DMA控制介面邏輯晶元共同組成,嵌入式系統的DMA控制器內建在處理器晶元內部,一般稱為DMA控制器,DMAC)。
值得注意的是,通常只有數據流量較大(kBps或者更高)的外設才需要支持DMA能力,這些應用方面典型的例子包括視頻、音頻和網路介面。
(5)dma編程擴展閱讀
在基於寄存器的DMA內部,處理器直接對DMA控制寄存器進行編程,來啟動傳輸。基於寄存器的DMA提供了最佳的DMA控制器性能,因為寄存器並不需要不斷地從存儲器中的描述符上載入數據,而內核也不需要保持描述符。
基於寄存器的DMA由兩種子模式組成:自動緩沖(Autobuffer)模式和停止模式。在自動緩沖DMA中,當一個傳輸塊傳輸完畢,控制寄存器就自動重新載入其最初的設定值,同一個DMA進程重新啟動,開銷為零。
如果將一個自動緩沖DMA設定為從外設傳輸一定數量的字到 L1數據存儲器的緩沖器上,則DMA控制器將會在最後一個字傳輸完成的時刻就迅速重新載入初始的參數。這構成了一個「循環緩沖器」,因為當一個量值被寫入 到緩沖器的最後一個位置上時,下一個值將被寫入到緩沖器的第一個位置上。
❻ 電腦里的DMA是什麼意思
DMA(Direct Memory Access),即直接存儲器存取,是一種快速傳送數據的機制。數據傳遞可以從適配卡到內存,從內存到適配卡或從一段內存到另一段內存。
利用它進行數據傳送時不需要CPU的參與。每台電腦主機板上都有DMA控制器,通常計算機對其編程,並用一個適配器上的ROM(如軟盤驅動控制器上的ROM)來儲存程序,這些程序控制DMA傳送數據。一旦控制器初始化完成,數據開始傳送,DMA就可以脫離CPU,獨立完成數據傳送。
在DMA傳送開始的短暫時間內,基本上有兩個處理器為它工作,一個執行程序代碼,一個傳送數據。利用DMA傳送數據的另一個好處是,數據直接在源地址和目的地址之間傳送,不需要中間媒介。如果通過CPU把一個位元組從適配卡傳送至內存,需要兩步操作。首先,CPU把這個位元組從適配卡讀到內部寄存器中,然後再從寄存器傳送到內存的適當地址。DMA控制器將這些操作簡化為一步,它操作匯流排上的控制信號,使寫位元組一次完成。這樣大大提高了計算機運行速度和工作效率。
計算機發展到今天,DMA已不再用於內存到內存的數據傳送,因為CPU速度非常快,做這件事,比用DMA控制還要快,但要在適配卡和內存之間傳送數據,仍然是非DMA莫屬。要從適配卡到內存傳送數據,DMA同時觸發從適配卡讀數據匯流排(即I/O讀操作)和向內存寫數據的匯流排。激活I/O讀操作就是讓適配卡把一個數據單位(通常是一個位元組或一個字)放到PC數據匯流排上,因為此時內存寫匯流排也被激活,數據就被同時從PC匯流排上拷貝到內存中。
直接內存訪問(DMA)方式是一種完全由硬體執行I/O交換的工作方式。DMA控制器從CPU完全接管對匯流排的控制。數據交換不經過CPU,而直接在內存和I/O設備之間進行。DMA控制器採用以下三種方式:
①停止CPU訪問內存:當外設要求傳送一批數據時,由DMA控制器發一個信號給CPU。DMA控制器獲得匯流排控制權後,開始進行數據傳送。一批數據傳送完畢後,DMA控制器通知CPU可以使用內存,並把匯流排控制權交還給CPU。
②周期挪用:當I/O設備沒有 DMA請求時,CPU按程序要求訪問內存:一旦 I/O設備有DMA請求,則I/O設備挪用一個或幾個周期。
③DMA與CPU交替訪內:一個CPU周期可分為2個周期,一個專供DMA控制器訪內,另一個專供CPU訪內。不需要匯流排使用權的申請、建立和歸還過程。
❼ DMA是怎麼回事
DMA的英文拼寫是「Direct Memory Access」,漢語的意思就是直接內存訪問,是一種不經過CPU而直接從內存了存取數據的數據交換模式。PIO模式下硬碟和內存之間的數據傳輸是由CPU來控制的;而在DMA模式下,CPU只須向DMA控制器下達指令,讓DMA控制器來處理數的傳送,數據傳送完畢再把信息反饋給CPU,這樣就很大程度上減輕了CPU資源佔有率。DMA模式與PIO模式的區別就在於,DMA模式不過分依賴CPU,可以大大節省系統資源,二者在傳輸速度上的差異並不十分明顯。DMA模式又可以分為Single-Word DMA(單位元組DMA)和Multi-Word DMA(多位元組DMA)兩種,其中所能達到的最大傳輸速率也只有16.6MB/s直接存儲器存取(DMA)控制器是一種在系統內部轉移數據的獨特外設,可以將其視為一種能夠通過一組專用匯流排將內部和外部存儲器與每個具有DMA能力的外設連接起來的控制器。它之所以屬於外設,是因為它是在處理器的編程式控制制下來執行傳輸的。值得注意的是,通常只有數據流量較大(kBps或者更高)的外設才需要支持DMA能力,這些應用方面典型的例子包括視頻、音頻和網路介面。 一般而言,DMA控制器將包括一條地址匯流排、一條數據匯流排和控制寄存器。高效率的DMA控制器將具有訪問其所需要的任意資源的能力,而無須處理器本身的介入,它必須能產生中斷。最後,它必須能在控制器內部計算出地址。 一個處理器可以包含多個DMA控制器。每個控制器有多個DMA通道,以及多條直接與存儲器站(memory bank)和外設連接的匯流排,如圖1所示。在很多高性能處理器中集成了兩種類型的DMA控制器。第一類通常稱為「系統DMA控制器」,可以實現對任何資源(外設和存儲器)的訪問,對於這種類型的控制器來說,信號周期數是以系統時鍾(SCLK)來計數的,以ADI的Blackfin處理器為例,頻率最高可達133MHz。第二類稱為內部存儲器DMA控制器(IMDMA),專門用於內部存儲器所處位置之間的相互存取操作。因為存取都發生在內部(L1-L1、L1-L2,或者L2-L2),周期數的計數則以內核時鍾(CCLK)為基準來進行,該時鍾的速度可以超過600MHz。 每個DMA控制器有一組FIFO,起到DMA子系統和外設或存儲器之間的緩沖器的作用。對於MemDMA(Memory DMA)來說,傳輸的源端和目標端都有一組FIFO存在。當資源緊張而不能完成數據傳輸的話,則FIFO可以提供數據的暫存區,從而提高性能。 因為你通常會在代碼初始化過程中對DMA控制器進行配置,內核就只需要在數據傳輸完成後對中斷做出響應即可。你可以對DMA控制進行編程,讓其與內核並行地移動數據,而同時讓內核執行其基本的處理任務—那些應該讓它專注完成的工作。
❽ 什麼是DMA
�且恢摯燜俅�褪�蕕幕�啤J�荽�菘梢源郵逝淇ǖ僥詿媯�幽詿嫻絞逝淇ɑ虼右歡文詿嫻攪硪歡文詿妗�MA技術的重要
性在於,利用它進行數據傳送時不需要CPU的參與。每台電腦主機板上都有DMA控制器,通常計算機對其編程,並用一個適配器上的ROM(如軟盤驅動控制器
上的ROM)來儲存程序,這些程序控制DMA傳送數據。一旦控制器初始化完成,數據開始傳送,DMA就可以脫離CPU,獨立完成數據傳送。
在DMA傳送開始的短暫時間內,基本上有兩個處理器為它工作,一個執行程序代碼,一個傳送數據。利用DMA傳送數據的另一個好處是,數據直接在源地址和目
的地址之間傳送,不需要中間媒介。如果通過CPU把一個位元組從適配卡傳送至內存,需要兩步操作。首先,CPU把這個位元組從適配卡讀到內部寄存器中,然後再
從寄存器傳送到內存的適當地址。DMA控制器將這些操作簡化為一步,它操作匯流排上的控制信號,使寫位元組一次完成。這樣大大提高了計算機運行速度和工作效率。
計算機發展到今天,DMA已不再用於內存到內存的數據傳送,因為CPU速度非常快,做這件事,比用DMA控制還要快,但要在適配卡和內存
之間傳送數據,仍
然是非DMA莫屬。要從適配卡到內存傳送數據,DMA同時觸發從適配卡讀數據匯流排(即I/O讀操作)和向內存寫數據的匯流排。激活I/O讀操作就是讓適配卡
把一個數據單位(通常是一個位元組或一個字)放到PC數據匯流排上,因為此時內存寫匯流排也被激活,數據就被同時從PC匯流排上拷貝到內存中。
對於每一次寫操作,DMA控制器都控制地址匯流排,通知應將數據寫到哪段內存中去。
DMA控制數據從內存傳送到適配卡的方法與上面類似。對每一個要傳送的單位數據,DMA控制器激活讀內存和I/O寫操作的匯流排。內存地址被放到地址匯流排
上,像從適配卡到內存傳送數據一樣,以數據匯流排為通道,數據從源地址直接傳送到目的地址。
DMA從DMA請求線(DREQ)上接收DMA請求,正像中斷控制器從中斷請求線(IRQ)上接收中斷請求一樣。
一個典型的從適配卡到內存的
數據傳送是這樣進行的,首先,對DMA控制器編程,寫入數據要到達的內存地址和要傳送的位元組數。適配器可以開始傳送數據時,它
將激活DREQ線,與DMA控制器連通。DMA控制器在與CPU取得匯流排控制權後,輸出內存地址,發送控制信號,使得一個位元組或一個字從適配器讀出並寫入
相應內存中,然後更新內存地址,指向下一個位元組(或字)要寫入的地址,重復上面的操作,直至數據傳送完畢。對控制器進行不同編程,就可以實現單位元組傳送
(即每傳送一個位元組都要求一個DREQ信號)或塊數據傳送(即全部數據傳送只需要一個DREQ信號)。
如果你要往計算機中插一塊適配卡,而且
適配卡使用DMA,通常安裝程序會讓你選擇一個DMA通道,設定DIP開關或跳線,來為相應適配器設置DMA通道。
盡管從理論上講,只要不是同時使用DREQ線,不同的適配卡可以共享這條線的,但是按常規,我們最好為每個適配卡單獨安排一個DMA通道,這樣就可以保證
不會發生DMA沖突。附表是DMA的預設分配情況。通道 功能通道 功能 O 空閑 4 用於級聯DMA控制器 1 空閑 5 空閑 2 軟盤 6
空閑3 空閑 7
空閑從中可以看出,DMA通道2和4已被佔用,在大多數微機上,通道1、3、5、6和7可由你任意分配。我們平時最好對自己的計算機上DMA通道的分配情
況記錄下來,以免我們向計算機增加新硬體時出現兩個適配卡共用一個通道,導致沖突。