Compartilhar via


Direct Memory Access

Windows Mobile Not SupportedWindows Embedded CE Supported

9/8/2008

Acessar memória direto (acesso direto à memória (DMA)) é um método de transferir dados de um dispositivo para memória, da memória para um dispositivo ou de memória para memória, sem a ajuda de um microprocessador. Você pode executar comum reserva e dispersão/coletar acesso direto à memória (DMA) usando as funções CEDDK.dll ou kernel. Reserva comuns acesso direto à memória (DMA) usa um contíguo reserva na memória principal. Dispersão/coletar acesso direto à memória (DMA) usa múltiplo blocos na memória diferentes endereços. Para obter mais informações sobre as funções CEDDK.dll, consulte Biblioteca de Vínculo Dinâmico CEDDK.

Um padrão acesso direto à memória (DMA) transferir ocorre quando um controlador acesso direto à memória (DMA) desempenha a transferir. Um mestre barramento acesso direto à memória (DMA) transferir ocorre quando um dispositivo periférico realiza a transferir. Microsoft recomenda que você use as funções CEDDK.dll para acesso direto à memória (DMA). Chamar a funções CEDDK.dll as funções kernel. A seguinte tabela compara duas maneiras de executar acesso direto à memória (DMA): Usando funções CEDDK.dll e funções kernel. **

Observação

O método transferir acesso direto à memória (DMA) descrito a seguir foi substituído por uma nova biblioteca de abstração acesso direto à memória (DMA) em Windows Embedded CE 6.0. A biblioteca de abstração acesso direto à memória (DMA) deve ser usada em local do método descrita abaixo. Para obter mais informações sobre a biblioteca de abstração acesso direto à memória (DMA), consulte Direct Memory Access Abstraction

Usando funções CEDDK.dll Usando funções kernel

CEDDK.dll fornece essas funções para obter uma reserva para transferências acesso direto à memória (DMA):

HalAllocateCommonBuffer

HalFreeCommonBuffer

HalTranslateSystemAddress

O kernel oferece essas funções para obter uma reserva para transferências acesso direto à memória (DMA):

AllocPhysMem

FreePhysMem

Funções CEDDK.dll podem identificador barramento e traduções endereço Platform-specific hardware.

Você deve conversões endereço Platform-specific hardware identificador. Você pode chamar HalTranslateSystemAddress Para traduzir o endereço.

Funções CEDDK.dll são úteis para comum reserva acesso direto à memória (DMA).

As funções kernel podem ser útil para dispersão/coletar acesso direto à memória (DMA).

Funções CEDDK.dll usam um alinhamento memória usar como padrão de 64 KB.

As funções kernel permitem que você alteração o alinhamento memória usar como padrão.

As CEDDK.dll funções identificador endereço conversões entre o sistema e o barramento PCI ou barramento ISA para o controlador acesso direto à memória (DMA). Você pode suporte outros tipos barramento. As funções CEDDK.dll traduzem um físico endereço memória RAM para o correspondente barramento-relativo físico endereço para o controlador acesso direto à memória (DMA). Para configurar um comum reserva de barramento mestre usando as funções, um mestre barramento CEDDK.dll acesso direto à memória (DMA) driver de dispositivo acesso direto à memória (DMA) pode chamar HalAllocateCommonBuffer Com o DMA_ADAPTER_OBJECT estrutura.

O seguinte exemplo de código mostra um chamar correto para HalAllocateCommonBuffer. O exemplo de código é proveniente de driver ES1371 localizado no Diretório %_WINCEROOT%\Public\Common\OAK\Drivers\WaveDev\PDD\ES1371.

// Allocate an adapter object on the stack
DMA_ADAPTER_OBJECT AdapterObject; 
AdapterObject.ObjectSize = sizeof(AdapterObject); 
AdapterObject.InterfaceType = PCIBus; 
AdapterObject.BusNumber = 0; 

// Allocate a single paged 4 KB output buffer
dma_out_page[0] = (PUCHAR) HalAllocateCommonBuffer(&AdapterObject, 4096, &dma_out_logical_address, FALSE);

if (!dma_out_page[0]) { 
  ERRMSG("PDD_AudioInitialize: DMA Buffer Page Allocation Failed");
  return FALSE;
}

Se a chamar para HalAllocateCommonBuffer for bem-sucedido, ele retornará a reserva alocada, ou NULL se o chamar falhar. O driver pode usar o comum alocado reserva como uma área armazenamento para transferências acesso direto à memória (DMA). A função também retorna o físico barramento-relativo endereço da reserva, o qual a função opcionalmente fornece para o controlador acesso direto à memória (DMA).

Você também pode usar o AllocPhysMem e FreePhysMem funções kernel para comum reserva transfere acesso direto à memória (DMA). Se você usar as funções kernel, chamar HalTranslateSystemAddress Para traduzir o endereço está passando para o controlador acesso direto à memória (DMA) para evitar uma violação memória. Essas funções tomar um parâmetro alinhamento, as funções CEDDK.dll usam alinhamento usar como padrão de 64 KB. Para um comum reserva acesso direto à memória (DMA) exemplo com funções de kernel, consulte o Diretório %_WINCEROOT%\Public\Common\Oak\Drivers\Usb\Hcd.

Para configurar dispersão/coletar acesso direto à memória (DMA), você deve usar múltiplo pares de endereços de base e comprimentos simultaneamente. O driver ATAPI localizado no Diretório %_WINCEROOT%\Public\Common\Oak\Drivers\Block\Atapi é um exemplo de dispersão/coletar acesso direto à memória (DMA) implementação.

See Also

Reference

HalFreeCommonBuffer

Concepts

CEDDK Dynamic-Link Library