컴퓨터 지식 네트워크 - 컴퓨터 프로그래밍 - DMA 전송이란 무엇입니까?

DMA 전송이란 무엇입니까?

DMA 란 무엇입니까?

컴퓨터에 새 사운드 카드나 다른 어댑터 카드를 추가할 때 설치 프로그램에서 DMA 채널을 선택해야 한다는 것을 알려 줄 수 있습니다. DMA 란 무엇입니까? 직접 메모리 액세스인 DMA (direct memory access) 는 빠른 데이터 전송 메커니즘입니다. 데이터 전송은 어댑터 카드에서 스토리지로, 스토리지에서 어댑터 카드로 또는 한 스토리지에서 다른 스토리지로 이동할 수 있습니다. DMA 기술의 중요성은 CPU 가 데이터 전송에 참여할 필요가 없다는 것입니다. 각 컴퓨터 보드에는 일반적으로 컴퓨터가 프로그래밍하고 어댑터의 ROM (예: 플로피 드라이브 컨트롤러의 ROM) 에 저장하는 DMA 컨트롤러가 있습니다. 이러한 프로그램은 DMA 전송 데이터를 제어합니다. 컨트롤러가 초기화되면 데이터 전송이 시작되면 DMA 를 CPU 에서 분리하여 독립적으로 데이터 전송을 완료할 수 있습니다.

DMA 전송의 짧은 시간 동안 기본적으로 두 개의 프로세서가 작동하고, 하나는 프로그램 코드를 실행하고, 다른 하나는 데이터를 전송합니다. DMA 를 사용하여 데이터를 전송하는 또 다른 장점은 데이터가 소스 주소와 대상 주소 간에 직접 전송되며 브로커가 필요하지 않다는 것입니다. 1 바이트가 CPU 를 통해 어댑터 카드에서 메모리로 전송되는 경우 두 단계가 필요합니다. 먼저 CPU 는 이 바이트를 어댑터 카드에서 내부 레지스터로 읽은 다음 레지스터에서 메모리의 해당 주소로 전송합니다. DMA 컨트롤러는 이러한 작업을 한 단계로 단순화하여 버스의 제어 신호를 조작하고 바이트 쓰기를 한 번에 완료합니다. 이로 인해 컴퓨터의 실행 속도와 효율성이 크게 향상되었습니다.

컴퓨터가 발전함에 따라 더 이상 DMA 를 사용하여 메모리 간에 데이터를 전송하지 않습니다. CPU 가 빠르고 DMA 제어보다 빠르지만 어댑터와 메모리 간에 데이터를 전송하는 것은 DMA 가 아니기 때문입니다. 어댑터 카드에서 스토리지로 데이터를 전송하기 위해 DMA 는 어댑터 카드에서 데이터를 읽는 데 사용되는 버스 (즉, 입출력 읽기 작업) 와 스토리지에 데이터를 쓰는 데 사용되는 버스를 트리거합니다. I/O 읽기 활성화란 어댑터 카드가 PC 데이터 버스에 데이터 유닛 (보통 바이트 또는 단어) 을 두는 것을 의미합니다. 이때 스토리지 쓰기 버스도 활성화되고 데이터가 PC 버스에서 스토리지로 복사되기 때문입니다.

각 쓰기 작업에 대해 DMA 디렉터는 주소 버스를 제어하여 데이터를 써야 하는 메모리 세그먼트를 알려줍니다. DMA 제어 데이터를 스토리지에서 어댑터 카드로 전송하는 방법은 위와 유사합니다. 전송할 각 데이터 유닛에 대해 DMA 디렉터는 버스를 활성화하여 메모리 및 입출력 쓰기를 읽습니다. 메모리 주소는 주소 버스에 배치됩니다. 어댑터 카드에서 메모리로 데이터를 전송하는 것처럼 데이터 버스를 채널로 사용하여 소스 주소에서 대상 주소로 데이터를 직접 전송합니다. DMA 는 인터럽트 컨트롤러가 인터럽트 요청선 (IRQ) 에서 인터럽트 요청을 받는 것처럼 DMA 요청선 (DREQ) 에서 DMA 요청을 수신합니다.

어댑터 카드에서 스토리지로의 일반적인 데이터 전송은 다음과 같습니다. 첫째, DMA 컨트롤러는 메모리 주소와 전송할 바이트 수를 기록하도록 프로그래밍되어 있습니다. 어댑터가 데이터 전송을 시작할 수 있을 때 DREQ 회선을 활성화하고 DMA 컨트롤러와 통신합니다. DMA 컨트롤러가 CPU 에 대한 버스 제어를 받은 후 메모리 주소를 출력하고 제어 신호를 전송하여 어댑터에서 1 바이트 또는 한 단어를 읽고 해당 메모리에 쓸 수 있도록 한 다음 메모리 주소를 업데이트하여 다음 바이트 (또는 단어) 가 쓸 주소를 가리키고 데이터 전송이 완료될 때까지 반복합니다. 컨트롤러를 다르게 프로그래밍하면 1 바이트 전송 (즉, 바이트 전송당 하나의 DREQ 신호 필요) 또는 블록 데이터 전송 (즉, 모든 데이터 전송에는 하나의 DREQ 신호만 필요) 을 수행할 수 있습니다.

컴퓨터에 어댑터를 삽입하고 어댑터가 DMA 를 사용하는 경우 일반적으로 설치 프로그램은 DMA 채널을 선택하고 DIP 스위치 또는 점퍼를 설정하여 해당 어댑터에 대한 DMA 채널을 설정해야 합니다. 이론상으로는 서로 다른 어댑터 카드를 함께 사용하면 DREQ 라인을 즐길 수 있지만, 규칙으로서 DMA 충돌이 발생하지 않도록 각 어댑터 카드에 대해 개별적으로 DMA 채널을 배치하는 것이 좋습니다. 일정은 DMA 의 기본 할당입니다. 채널 함수 채널 함수 O Idle 4 는 다중 구간 DMA 디렉터1idle 5 idle 2 floppy 6 idle 3 idle 7 idle 에 사용됩니다. 이로써 DMA 채널 2 와 4 가 이미 점유되었다는 것을 알 수 있다. 대부분의 마이크로컴퓨터에서는 1, 3, 5, 6, 7 채널은 네가 마음대로 분배할 수 있다. 우리는 일반적으로 컴퓨터에 새 하드웨어를 추가하고 두 개의 어댑터 카드 * * * 가 채널을 사용할 때 충돌이 발생하지 않도록 자신의 컴퓨터에 DMA 채널 할당을 기록하는 것이 좋습니다. DMA-직접 메모리 액세스, 직접 메모리 액세스는 데이터 전송 방법입니다. DMA 모드에서는 컴퓨터의 CPU 에 직접 액세스하는 대신 RAM 과 장치 간에 직접 전송되므로 데이터 전송 속도가 크게 향상됩니다. 허허, 위에서 이미 DMA 의 의미와 용도를 보았으니 DMA 전송 모드 ~ ~ 조작 방법: Windows 98/Me 에서 직접 메모리 액세스 DMA 를 활성화하고 Windows 바탕 화면에서 "내 컴퓨터" 아이콘을 마우스 오른쪽 단추로 클릭한 다음 팝업 메뉴에서 "속성" 을 선택하면 됩니다. 시스템 속성 창이 나타납니다. 장치 관리 탭을 클릭합니다. 옵티컬 드라이브를 두 번 클릭하여 하드 드라이브 목록을 봅니다. IDE 디스크 (일반 IDE 디스크와 같은 다른 이름이 있을 수 있음) 를 마우스 오른쪽 버튼으로 클릭하고 팝업 메뉴에서 속성 을 선택합니다. 하드 드라이브 속성 창이 나타납니다. 설정 탭을 누릅니다. 이 항목을 선택하지 않은 경우 DMA 를 선택하고 확인을 누릅니다. Windows 에서 재부팅할지 묻는 메시지가 나타나면 [예] 를 클릭합니다. Windows 2000 에서 DMA 에 직접 메모리 액세스를 활성화하고 Windos 에 관리자 (또는 관리자 권한이 있는 사용자) 로 로그인합니다. Windows 바탕 화면에서 "내 컴퓨터" 아이콘을 마우스 오른쪽 단추로 클릭하고 팝업 메뉴에서 "속성" 을 선택합니다. 시스템 속성 창이 나타납니다. 하드웨어 탭을 클릭한 다음 장치 관리자 를 클릭합니다. 장치 관리자 창이 나타납니다. IDE ATA/ATAPI 컨트롤러를 두 번 클릭하여 컨트롤러 목록을 확인합니다. 기본 IDE 채널을 두 번 클릭합니다. 기본 IDE 채널 속성 창이 나타납니다. 고급 설정 탭을 클릭합니다. 장치 0 의 전송 모드 목록에서 이 항목을 찾을 수 있으면 DMA 를 선택합니다. 확인을 누릅니다. Windows 에서 재부팅할지 묻는 메시지가 나타나면 [예] 를 클릭합니다. Windows XP 에서 직접 메모리 액세스 DMA 를 활성화하고 Windows 에 관리자 (또는 관리자 권한이 있는 사용자) 로 로그인합니다. 시작 버튼을 클릭한 다음 내 컴퓨터를 마우스 오른쪽 버튼으로 클릭하고 팝업 메뉴에서 속성을 선택합니다. 시스템 속성 창이 나타납니다. 하드웨어 탭을 클릭한 다음 장치 관리자 를 클릭합니다. 장치 관리자 창이 나타납니다. IDE ATA/ATAPI 컨트롤러를 두 번 클릭하여 컨트롤러 목록을 표시합니다. IDE 채널에서 두 번 클릭합니다. IDE 채널 속성 창에 나타납니다. 고급 설정 탭을 클릭합니다. 장치 0 (또는 1, 버너의 점퍼 설정에 따라 다름) 의 전송 모드 목록에서 찾을 수 있다면 DMA 를 선택하십시오. 확인을 누릅니다. Windows 를 다시 시작할 필요가 없습니다. = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

부록: DMA 집중 읽기/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *.

* 판권 소유 (C) 2000 텍사스 기기 회사.

* all rights reserved

*-

* 파일 이름 ..... DMA 1.c

* 만든 날짜 .. 01/11/2000

* 최종 수정일. 0 1/04/200 1

\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

# include & lt 표준>

# include & ltlog.h & gt/* DSPBIOS/CSL GUI 구성 헤더 파일 포함 */

# include "DMA1cfg.h" # include < Csl.h & gt

# include & ltcsl _ irq.h & gt

# include & ltcsl _ dma.h & gt/* 상수는 전송 길이 */

#define N 128 /* DMA 전송용 src 및 dst 를 별도의 메모리 섹션에 배치 */

/* 사용자가 지정한 메모리 범위 내 위치를 더 잘 제어하기 위해 */

#pragma DATA_SECTION(src, "dmaMem")

Uint16 src [n]; #pragma DATA_SECTION(dst, "dmaMem")

Uint16 dst [n];

/* 이 예에서는 128 의 단일 프레임 전송 */

/* DARAM 에서 DARAM 까지의 요소, DMA */

/* 매크로 호출은 */에서 원하는 설정을 반영합니다

/* DMA 제어 레지스터를 통해 이를 수행할 수 있습니다. */ /* DMACSDP dstben == 0 */

/* dstpack == 0 */

/* dst == 0 */

/* srcben == 0 */

/* srcpack == 0 */

/* src == 0 */

/* 데이터 유형 == 1 */

/* */

/* DMACCR dstamode == 1 */

/* srcamode == 1 */

/* endprog == 0 */

/* fifoflush == 0 */

/* 반복 == 0 */

/* 자동 초기화 = = 0 */

/* en == 0 */

/* 우선 순위 == 0 */

/* fs == 0 */

/* sync == 0 */

/* */

/* DMACICR blockie == 1 */

/* lastie == 1 */

/* 프레임 ie = =1*/

/* firsthalfie == 1 */

/* dropie == 1 */

/* timeoutie = =1*/DMA _ config myconfig = {

DMA_DMACSDP_RMK (

DMA_DMACSDP_DSTBEN_NOBURST,

DMA_DMACSDP_DSTPACK_OFF,

DMA_DMACSDP_DST_DARAM,

DMA_DMACSDP_SRCBEN_NOBURST,

DMA_DMACSDP_SRCPACK_OFF,

DMA_DMACSDP_SRC_DARAM,

DMA _ dmac SDP _ DATATYPE _ 16 비트

), /* DMACSDP */

DMA_DMACCR_RMK (

DMA_DMACCR_DSTAMODE_POSTINC,

DMA_DMACCR_SRCAMODE_POSTINC,

DMA_DMACCR_ENDPROG_OFF,

DMA_DMACCR_FIFOFLUSH_OFF,

DMA_DMACCR_REPEAT_OFF,

DMA_DMACCR_AUTOINIT_OFF,

DMA_DMACCR_EN_STOP,

안녕, PRIO

DMA_DMACCR_FS_ENABLE,

DMA_DMACCR_SYNC_NONE

), /* DMACCR */

DMA_DMACICR_RMK (

DMA_DMACICR_BLOCKIE_OFF,

DMA_DMACICR_LASTIE_OFF,

DMA_DMACICR_FRAMEIE_ON,

DMA_DMACICR_FIRSTHALFIE_OFF,

DMA_DMACICR_DROPIE_OFF,

DMA_DMACICR_TIMEOUTIE_OFF

), /* DMACICR */

(DMA _ AdrPtr)& amp;; Src, /* DMACSSAL */

0, /* DMACSSAU */

(DMA _ AdrPtr)& amp;; Dst, /* DMACDSAL */

0, /* DMACDSAU */

N, /* DMACEN */

1, /* DMACFN */

0, /* DMACFI */

0 /* DMACEI */

} /* DMA_Handle 개체 정의 */

DMA _ Handle myhDma

Int I, j;

Uint16 err = 0;

Volatile bool wait for transfer = true; 잘못된 탐색기 (잘못된 탐색기)

{

/* 소스 및 대상 버퍼 초기화 */

For(I = 0;; 나< = (n-1); I++) {

Dst [I] = 0;

Src [I] = I+1;

}

} void taskFxn(void)

{

/* DMA 채널 열기 0 */

Myhdma = DMA _ open (DMA _ cha 0,0); /* 기본적으로 TMS320C55xx 컴파일러는 모든 데이터 기호 word */

/* 주소. 그러나 DMA 는 모든 주소가 byte */

/* 주소. 따라서 */을 (를) 위해 주소를 2 로 이동해야 합니다.

/* DMA 전송의 단어 주소를 바이트 주소로 변경합니다. */

Myconfig.dmacssal =

(DMA _ adrptr) ((uint16) (myconfig.dmacssal)) < & lt 1);

Myconfig.dmacdsal =

(DMA _ adrptr) ((uint16) (myconfig.dmacdsal)) < & lt 1); /* DMA 제어 레지스터에 구성 구조 값 쓰기 */

DMA _ config(my hdma & amp;; Myconfig); /* 사용 가능한 DMA 채널을 전송 시작 */

DMA_FSETH(myhDma, DMACCR, EN,1); /* DMA 상태 레지스터의 프레임 상태 비트가 신호를 보낼 때까지 기다립니다. */

/* 전송이 완료되었습니다. */

그리고 (! DMA_FGETH(myhDma, DMACSR, FRAME)) {

을 눌러 섹션을 인쇄할 수도 있습니다

}/* DTA 값을 확인하여 전송이 올바른지 확인 */

For(I = 0;; 나< = (n-1); I++) {

If (dst[i]! = src[i]) {

++err;

}

} 만약 (오류) {

LOG _ printf(& amp;; 추적, ">& gt& gt 경고, DMA 샘플 1 실패");

}

그렇지 않으면 {

LOG _ printf(& amp;; 흔적, "... DMA 샘플 1 완료");

}/* DMA 를 완성했으니 꺼주세요. */

Dma _ close (myhdma);

} DMA 기능 기능 목적

DMA_close () 는 DMA 및 해당 처리기를 종료합니다

DMA_config () 는 구성 구조 (DMA_Config) 를 사용하여 DMA 를 설정합니다

DMA_configArgs () 는 함수에 전달된 레지스터 값을 사용하여 DMA 를 설정합니다

DMA_getConfig () 는 DMA 구성을 읽습니다

DMA_getEventId () 는 DMA 가 인터럽트를 완료한 IRQ 이벤트 Id 를 반환합니다

DMA_open () 은 DMA 를 열고 핸들러를 할당합니다

DMA_pause () 는 해당 DMA 채널에서 전송을 중단합니다

DMA_reset () 는 기본값을 사용하여 DMA 레지스터를 재설정합니다

DMA_start () 는 해당 DMA 채널에서 전송을 활성화합니다

DMA_stop () 은 해당 DMA 채널에서 전송을 비활성화합니다

Trackback: /TrackBack.aspx? PostId= 15685 14 이 글은 CSDN 블로그에서 나왔으니 출처:/zhong rg/archive/2007//kloc-0

上篇: 올해 아시안게임 남자 여자 수영 상세 정보 下篇: 왜 해커들은 왜 아직도 스스로를 화이트햇이라고 부르나요?
관련 내용