반응형
DMA 설명

DMA(Direct Memory Access) 설명

DMA란?

DMA(Direct Memory Access)는 CPU의 개입 없이 주변 장치와 메모리 간에 데이터를 직접 전송할 수 있는 기능입니다. DMA를 사용하면 CPU가 다른 작업을 수행하는 동안 데이터를 빠르게 전송할 수 있어 효율성이 증가합니다.

DMA의 주요 구성 요소

  • DMA 컨트롤러: 데이터 전송을 관리하는 장치로, 전송의 시작 주소, 전송 크기, 방향 등을 설정합니다.
  • 소스 주소: 데이터를 읽어올 주소입니다.
  • 목적지 주소: 데이터를 쓸 주소입니다.
  • 전송 크기: 한 번의 전송에서 이동할 데이터 크기입니다.
  • 인터럽트: DMA 전송 완료 후 CPU에 알리는 신호입니다.

DMA의 종류

DMA에는 다양한 종류가 있으며, 주요한 종류는 다음과 같습니다:

  • 버스트 모드 DMA: 한 번에 많은 데이터를 전송하는 방식입니다. CPU가 버스 사용을 완전히 포기하고 DMA가 모든 버스를 차지하여 빠르게 데이터를 전송합니다.
  • 사이클 스틸링 모드 DMA: CPU와 DMA가 번갈아가며 버스를 사용하는 방식으로, CPU의 작업을 방해하지 않고 데이터를 전송할 수 있습니다.
  • 블록 전송 모드 DMA: 한 번의 트랜잭션으로 큰 데이터 블록을 전송하며, 데이터가 많을 때 효율적인 방법입니다.

DMA 제어 방법

DMA는 다양한 제어 방법을 사용하여 데이터를 전송할 수 있습니다:

  • 소프트웨어 제어: CPU가 DMA 레지스터를 통해 직접 전송을 제어하는 방식입니다. 주로 초기화나 전송 시작을 위한 설정에 사용됩니다.
  • 하드웨어 요청: 주변 장치가 DMA 요청을 보내면, DMA 컨트롤러가 자동으로 데이터를 전송합니다. 주로 실시간 데이터 전송이 필요한 장치에서 사용됩니다.
  • 인터럽트 제어: 전송이 완료되면 DMA가 인터럽트를 발생시켜 CPU에 알리며, 이로 인해 CPU가 다른 작업을 수행할 수 있습니다.

DMA 펌웨어 코드 예시

#include <stdint.h>

#define DMA_BASE_ADDR 0x40026000  // DMA 컨트롤러의 베이스 주소
#define DMA_SRC_ADDR  0x20000000  // 소스 주소
#define DMA_DEST_ADDR 0x20001000  // 목적지 주소
#define DMA_SIZE      1024        // 전송할 데이터 크기

typedef struct {
    volatile uint32_t SRC_ADDR;   // 소스 주소 레지스터
    volatile uint32_t DEST_ADDR;  // 목적지 주소 레지스터
    volatile uint32_t SIZE;       // 전송 크기
    volatile uint32_t CTRL;       // 제어 레지스터
    volatile uint32_t STATUS;     // 상태 레지스터
} DMA_TypeDef;

#define DMA ((DMA_TypeDef *)DMA_BASE_ADDR)

void dma_init() {
    // DMA 소스 및 목적지 주소 설정
    DMA->SRC_ADDR = DMA_SRC_ADDR;
    DMA->DEST_ADDR = DMA_DEST_ADDR;

    // DMA 전송 크기 설정
    DMA->SIZE = DMA_SIZE;

    // DMA 전송 시작
    DMA->CTRL = 1;  // 제어 비트를 설정하여 DMA 전송을 시작
}

int main() {
    dma_init();

    // DMA가 완료될 때까지 대기
    while ((DMA->STATUS & 0x1) == 0) {
        // 전송 완료를 대기
    }

    // 전송 완료
    return 0;
}
    
반응형

'IT' 카테고리의 다른 글

Embedded System Boot Process  (3) 2024.11.04
DMA Explanation  (1) 2024.11.04
멀티스레딩에 대한 소개  (1) 2024.11.04
Introduction to Multithreading  (1) 2024.11.04
Understanding Mutex and Semaphore – A Practical Example for Synchronization  (2) 2024.11.04

+ Recent posts