Title Image

Blog Logo

🌱 DMA - Direct Memory Access

🌱 DMA - Direct Memory Access

    Như giới thiệu ở bài viết Các kỹ thuật thiết kế luồng xử lý trong chương trình nhúng, mình đã giới thiệu về Polling, Interrupt, và sử dụng DMA. Bài viết này mình sẽ giới thiệu kỹ hơn về kỹ thuật sử dụng DMA trong các ứng dụng nhúng, một kỹ thuật cũng rất quan trọng và được sử dụng rộng rãi trong các ứng dụng thực tế.

    Xem thêm: Các kỹ thuật thiết kế luồng xử lý trong chương trình nhúng.

    👉 Cơ chế Master-Slave

    Trước khi tìm hiểu DMA, chúng ta sẽ bắt đầu lại với cơ chế hoạt động thông thường của Core, và hiểu nó theo cơ chế Master Slave

DMA

    Hãy nhìn hình vẽ trên, CPU sẽ điều khiển việc transfer data giữa Peripheral (UART, I2C, SPI, ...) và bộ nhớ (RAM) qua các đường bus. Cơ chế này được hiểu như cơ chế Master - Slave, với CPU đóng vai trò là Master, Peripheral và Memory đóng vai trò như các slave. Nên việc giao tiếp giữa 2 Slave sẽ do Master điều khiển. 

    Tuy nhiên với việc CPU phải làm thêm 1 công việc quan trọng khác - Fetch lệnh từ bộ nhớ (FLASH) để thực thi các lệnh của chương trình. Vì vậy, khi cần truyền dữ liệu liên tục giữa Peripheral và RAM, CPU sẽ bị chiếm dụng, và không có thời gian làm các công việc khác, hoặc có thể gây miss dữ liệu khi transfer. 

    Chính vì vậy, hệ thống hỗ trợ một Master khác để chuyên làm công việc này, đó là DMA.

    👉 DMA là gì?

    DMA - Direct Memory Access. hay truy cập trực tiếp bộ nhớ, được biết đến như một thành phần trong vi điều khiển, có vai trò như một Master, dùng để điều khiển việc truy cập trực tiếp vào bộ nhớ mà không thông qua CPU. DMA có thể làm giảm tải "áp lực làm việc" cho CPU. 

    💬 Một số kiến trúc Vi điều khiển không hỗ trợ DMA (8051, AVR, PIC, ...), có thể sử dụng bộ chip ngoài DMAC - DMA Controller để thay thể. Ở đây chúng ta chỉ xét đến các dòng có hỗ trợ DMA nội, cụ thể là trong Vi điềuk khiển STM32. 

    Hoạt động cơ bản của DMA có thể được mô tả trong hình sau:

DMA

    DMA có thể điều khiển data truyền từ SRAM đến Peripheral - UART và ngược lại, mà không thông qua data bus  của CPU. 

    Nhược điểm của DMA

    Có thể thấy DMA có ưu điểm to lớn, tuy nhiên, đôi khi nó mang lại một số nhược điểm. Nếu không được sử dụng đúng cách, DMA còn có thể gây tốn năng lượng hơn so với sử dụng trực tiếp CPU.

    Trong một số kiến trúc vi điều khiển sử dụng Bộ nhớ Cache, khi DMA truy cập write vào data memory, nó sẽ được ghi vào bộ nhớ Cache. Sử dụng DMA sẽ làm mất hiệu lực của bộ nhớ Cache và tốn thêm năng lượng của Vi điều khiển.

   Xem thêm: Bộ nhớ đệm - Cache.   

    👉 DMA trong STM32

    Mình sử dụng phần cứng là Vi điều khiển STM32F401, các bạn sử dụng chip khác có thể xem trong tài liệu Reference Manual. 

    STM32F401 hỗ trợ 2 DMA Controller có 16 streams (luồng) với 8 streams cho mỗi Controller, mỗi stream dành riêng để quản lý các yêu cầu truy cập bộ nhớ từ một hoặc nhiều thiết bị ngoại vi. Mỗi Stream có thể có tối đa 8 Channel và có một cơ chế phân xử để xử lý mức độ ưu tiên giữa các Channel. 

   Các đặc điểm chính của DMA - STM32

  • Kiến trúc Dual AHB master bus, một dành riêng cho truy cập bộ nhớ, một dành cho truy cập ngoại vi.
  • 8 streams cho mỗi DMA Controller, lên đến 8 channel cho mỗi stream. Mỗi Stream có một bộ đệm FIFO để tối ưu băng thông của hệ thống.
  • Hai mode: FIFO Mode và Direct Mode.
  • Mỗi Stream có thể được cấu hình bởi Hardware:
    • Channel thông thường hỗ trợ transfer giữa 2 slave (Memory hoặc Peripheral).
    • Channel Double Buffer hỗ trợ bộ đệm kép ở bộ nhớ.
  • Các Channel có thể lập trình mức độ ưu tiên (4 mức - Very high, high, medium, low) hoặc hỗ trợ bởi Hardware khi mức ưu tiên ngang nhau (Channel 0 > Channel 1).
  • Số lượng data items có thể được quản lý bởi DMA Controller hoặc Peripheral:
    • DMA Flow Controller: Số lượng items có thể lập trình được từ 1 đến 65535.
    • Peripheral Flow Controller: Số lượng items không xác định, được điều khiển bởi Source/Destination Peripheral và kết thúc việc truyền bởi Hardware.
  • Source và Destination có độ rộng dữ liệu độc lập (byte / half-word / word).Khi độ rộng của Data của Source và Destination không bằng nhau, DMA sẽ tự động đóng gói / giải nén các dữ liệu truyền đi để tối ưu hóa băng thông (Tính năng này chỉ dùng với FIFO Mode). 
  • Mỗi Stream đều hỗ trợ bộ quản lý Circular Buffer.
  • Hỗ trợ 5 Event Flags (DMA Half Transfer, DMA Transfer Complete, DMA Transfer Error, DMA FIFO Error, Direct Mode Error).

    💬 Dưới đây là Block Diagram của DMA trong Vi điều khiển STM32F4.

DMA

    Bộ điều khiển DMA thực hiện truyền/nhận bộ nhớ một cách trực tiếp: Với vai trò AHB Master, DMA có thể nắm quyền điều khiển bus matrix AHB để bắt đầu các quá trình truyền nhận - Transactions. Nó có thể thực hiện các giao dịch sau:

  • Peripheral to Memory 
  • Memory to Peripheral
  • Memory to Memory

    Trên đây là các đặc điểm chính của DMA và DMA trong Vi điều khiển STM32. Các bài sau sẽ chia sẻ về cách lập trình các ứng dụng sử dụng DMA.

    Chúc các bạn học tập tốt 😊

Xem Bài DMA 2

Đăng nhận xét

0 Nhận xét