Điểm của DMA trong CPU nhúng là gì?


17

Tôi đã thực hiện một dự án gần đây với mbed (LPC1768), sử dụng DAC để tạo ra các sóng khác nhau. Tôi đọc các phần của biểu dữ liệu và nó đã nói về cách nó có DMA cho rất nhiều thiết bị ngoại vi. Điều này có vẻ như sẽ hữu ích, nhưng khi đọc thêm, tôi thấy rằng DMA đã sử dụng cùng một bus dữ liệu như cpu (mà tôi đoán là bình thường). Điều này có nghĩa là CPU không thể tương tác với bất kỳ bộ nhớ nào trong khi DAC đang lấy dữ liệu? Ngoài ra, vì DAC không có bộ đệm (theo như tôi có thể nói) và do đó phải DMA rất thường xuyên, điểm của DMA là gì? Nếu CPU không thể thực hiện các giao dịch bộ nhớ, nó có thể làm gì không?


8
Tôi đề nghị bạn xem xét các tính năng của CPU và nếu nó có thể làm bất cứ điều gì khác ngoài truy cập bộ nhớ. Tôi đã nghe nói về một số CPU có thể thực hiện những việc như quyết định hoặc tính toán, không chắc điều này có phổ biến không ..
PlasmaHH

CPU có nên dành thời gian chuyển dữ liệu sang cổng I / O hoặc ủy thác nhiệm vụ cho một thiết bị chuyên dụng không?
StainlessSteelRat

Vâng, CPU có thể làm những việc khác, nhưng trong một hệ thống nhúng, có lẽ nó sẽ dành nhiều thời gian để giao tiếp với các thiết bị ngoại vi, đặc biệt là các cổng I / O. Sẽ không có ý nghĩa hơn khi có thêm một bus dữ liệu chỉ dành cho DMA? Hay là thường không cần thiết? Tình huống mà bạn muốn có thêm một chiếc xe buýt là khi bạn đang cố gắng đẩy các giới hạn của phần cứng của mình, điều mà tôi cho là khi nào bạn muốn đến DMA?
BeB00

1
Ví dụ đơn giản, giả sử bạn muốn in nhiều thông tin sang cổng nối tiếp. Bạn có thể ngồi và đợi từng byte được gửi (chậm), sao chép nó vào bộ đệm và sau đó sử dụng các ngắt trên CPU để gửi từng byte khi cổng sẵn sàng (rất nhiều chuyển đổi ngữ cảnh = chậm) hoặc sao chép nó vào một bộ đệm và để bộ điều khiển DMA hết thời gian dữ liệu trong khi CPU đang bận làm việc khác (có thể nhanh hơn).
Tom Carpenter

2
Đã thấy một bản cover EDN một lần cho thấy hình vẽ một người đàn ông mang một chiếc giày dài ba feet, và một tiêu đề, "Nếu đó là một chiếc giày, hãy mang nó." Vấn đề là, nếu một phần thực hiện mười điều bạn không cần, và một điều bạn cần, và giá cả, dấu chân và ngân sách năng lượng đều phù hợp, thì bạn chỉ nên sử dụng nó, và không lãng phí thời gian để tìm kiếm thứ gì đó với ít tính năng hơn.
Solomon chậm

Câu trả lời:


17

Bảng dữ liệu LPC1768 mà tôi tìm thấy có các trích dẫn sau (nhấn mạnh của tôi):

Bộ điều khiển DMA Mục đích chung tám kênh (GPDMA) trên ma trận đa lớp AHB có thể được sử dụng với SSP, I2S-bus, UART, thiết bị ngoại vi chuyển đổi từ kỹ thuật số sang tương tự và kỹ thuật số sang tín hiệu tương tự chuyển khoản -memory.

Phân chia bus APB cho phép thông lượng cao với một vài quầy giữa CPU và DMA

Sơ đồ khối ở trang 6 hiển thị SRAM với nhiều kênh giữa ma trận AHB và trích dẫn sau đây sao lưu điều này:

LPC17xx chứa tổng cộng bộ nhớ RAM tĩnh trên chip 64 kB. Điều này bao gồm SRAM 32 kB chính, có thể truy cập bởi bộ điều khiển CPU và DMA trên xe buýt tốc độ cao hơn và hai khối SRAM 16 kB bổ sung nằm trên một cổng phụ riêng biệt trên ma trận đa lớp AHB. Kiến trúc này cho phép truy cập CPU và DMA trải đều trên ba RAM riêng biệt có thể được truy cập cùng lúc

Và điều này được củng cố bởi trích dẫn sau:

GPDMA cho phép các giao dịch ngoại vi đến bộ nhớ, bộ nhớ đến ngoại vi, ngoại vi đến ngoại vi và bộ nhớ đến bộ nhớ.

Do đó, bạn có thể truyền dữ liệu đến DAC của mình từ một trong các khối SRAM riêng biệt hoặc từ một thiết bị ngoại vi khác, trong khi sử dụng SRAM chính cho các chức năng khác.

Loại DMA ngoại vi-ngoại vi này phổ biến ở các phần nhỏ hơn, nơi giao diện bộ nhớ khá đơn giản (so với bộ xử lý Intel hiện đại).


À, cảm ơn, tôi đã không nhận ra điều đó là có thể, tôi là người mới đối với DMA. Điều đó có nghĩa là cpu có thể truy cập các thiết bị ngoại vi trong khi DAC đang truy cập SRAM riêng biệt?
BeB00

1
Có - đây chính xác là những gì ma trận AHB dành cho. Nó cho phép các bộ điều khiển khác nhau (CPU, DMA, một số thiết bị ngoại vi nhất định như ethernet và USB) truy cập vào những thứ khác nhau cùng một lúc. Đây là lý do tại sao có nhiều "cổng" cho SRAM.
David

Vâng, AHB trong các máy phát nhỏ giá rẻ này cung cấp băng thông bộ nhớ điên rồ do các ngân hàng bộ nhớ song song: bạn có thể có ethernet, USB2 và mọi thứ chạy ở thông lượng tối đa và cpu thậm chí không nhận thấy ...
peufeu

Ngoài ra mã ngón tay cái có thể đặt 2 hướng dẫn trong một từ 32 bit, do đó, cpu có thể không cần truy cập vào xe buýt thường khi thực hiện toán học hoặc các hoạt động chủ yếu liên quan đến các thanh ghi ... Mặt khác, tôi nghĩ rằng M3 và M4 có thể thực hiện một số truy cập bộ nhớ trên mỗi đồng hồ (hướng dẫn và dữ liệu) do có nhiều bus.
peufeu

30

Cái dài và ngắn là DMA cho phép CPU hoạt động hiệu quả ở tốc độ gốc của nó, trong khi các thiết bị ngoại vi có thể hoạt động hiệu quả ở tốc độ gốc của chúng. Hầu hết các số trong ví dụ được tạo thành.

Hãy so sánh hai tùy chọn để thu thập dữ liệu định kỳ từ ADC:

  1. Bạn có thể đặt ADC là một phần của ngắt (định kỳ hoặc theo cách khác)
  2. Bạn có thể tạo bộ đệm và yêu cầu DMA chuyển các số đọc ADC sang bộ đệm.

Hãy chuyển 1000 mẫu từ ADC sang RAM.

Sử dụng tùy chọn 1: Đối với mỗi mẫu có

  • 12 chu kỳ được dành để vào ngắt
  • đọc adc
  • lưu trữ trong ram
  • 12 chu kỳ được dành để thoát gián đoạn

Hãy giả vờ chức năng ngắt này là 76 lệnh, toàn bộ thường trình dài 100 lệnh, giả sử thực hiện chu kỳ đơn (trường hợp tốt nhất). Điều đó có nghĩa là tùy chọn 1 sẽ dành 100.000 chu kỳ thực thi CPU.

Tùy chọn 2: DMA được cấu hình để thu thập 1000 mẫu ADC. Giả sử ADC có bộ kích hoạt phần cứng từ bộ đếm thời gian.

  • ADC và DMA chuyển 1000 mẫu dữ liệu vào ram
  • DMA làm gián đoạn CPU của bạn sau 1000 mẫu
  • 12 chu kỳ được dành để vào ngắt
  • Mã xảy ra (giả sử nó bảo DMA ghi đè lên RAM)
  • 12 chu kỳ được dành để thoát gián đoạn

Giả sử toàn bộ ngắt (có phí vào và ra) là 100 lệnh đơn chu kỳ. Sử dụng DMA, bạn chỉ mất 100 chu kỳ để lưu cùng 1000 mẫu.

Bây giờ, mỗi lần DMA truy cập vào xe buýt, vâng, có thể có tranh chấp giữa CPU và DMA. CPU thậm chí có thể bị buộc phải chờ DMA kết thúc. Nhưng việc chờ DMA kết thúc ngắn hơn nhiều so với việc khóa CPU để phục vụ ADC. Nếu xung nhịp lõi CPU là 2 lần xung nhịp Bus, thì CPU có thể lãng phí một vài chu kỳ lõi chờ DMA kết thúc. Điều này có nghĩa là thời gian thực hiện chuyển tiền hiệu quả của bạn là từ 1000 (giả sử CPU không bao giờ chờ) và 9000 chu kỳ. CÁCH vẫn tốt hơn 100.000 chu kỳ.


2
Điều quan trọng cần lưu ý rằng RAM không phải là nơi duy nhất mà CPU có thể lưu trữ dữ liệu. Nói chung, CPU tải dữ liệu từ RAM vào các thanh ghi trước khi làm việc với nó.
Aron

Yah, hoàn toàn chính xác. Ví dụ của tôi hoàn toàn là một bản phác thảo thô.
pgvoorhees

Nhiều bộ vi điều khiển cũng có một bus đa lớp để có thể thực hiện các hoạt động đồng thời. Ví dụ: adc-> ram và flash-> đăng ký cùng một lúc. Ngoài ra, nhiều hướng dẫn dài hơn 1 đồng hồ, vì vậy có nhiều thời gian cho DMA.
Jeroen3

9

Nếu trên một chu kỳ nhất định, bộ xử lý và bộ điều khiển DMA sẽ cần truy cập vào cùng một bus, cái này hoặc cái kia sẽ phải chờ. Tuy nhiên, nhiều hệ thống chứa nhiều vùng bộ nhớ với các bus riêng biệt cùng với "cầu" bus sẽ cho phép CPU truy cập một bộ nhớ trong khi bộ điều khiển DMA truy cập vào một bộ nhớ khác.

Hơn nữa, nhiều CPU có thể không cần truy cập vào thiết bị bộ nhớ trên mỗi chu kỳ. Nếu một CPU thông thường chỉ cần truy cập bộ nhớ theo hai trong ba chu kỳ, một thiết bị DMA có mức độ ưu tiên thấp có thể có thể khai thác các chu kỳ khi bus bộ nhớ không hoạt động.

Tuy nhiên, ngay cả trong trường hợp mỗi chu kỳ DMA sẽ khiến CPU bị đình trệ trong một chu kỳ, tuy nhiên, DMA vẫn có thể rất hữu ích nếu dữ liệu đến tốc độ đủ chậm để CPU có thể làm những việc khác giữa các mục dữ liệu đến , nhưng đủ nhanh để giảm thiểu chi phí cho mỗi mục. Ví dụ, nếu một cổng SPI đang cung cấp dữ liệu cho thiết bị với tốc độ một byte cứ sau 16 chu kỳ CPU, thì việc ngắt CPU cho mỗi lần truyền có thể khiến nó mất gần như toàn bộ thời gian vào và trở về từ thói quen dịch vụ ngắt và không làm bất kỳ công việc thực tế. Tuy nhiên, sử dụng DMA, chi phí có thể giảm xuống còn 13% ngay cả khi mỗi lần chuyển DMA khiến CPU bị đình trệ trong hai chu kỳ.

Cuối cùng, một số CPU cho phép DMA được thực hiện trong khi CPU đang ngủ. Sử dụng truyền dựa trên ngắt sẽ yêu cầu hệ thống thức dậy hoàn toàn cho mỗi đơn vị dữ liệu được truyền. Tuy nhiên, sử dụng DMA, bộ điều khiển ngủ có thể cung cấp cho bộ điều khiển bộ nhớ một vài đồng hồ mỗi khi một byte xuất hiện nhưng để mọi thứ khác ngủ yên, do đó giảm mức tiêu thụ điện.


1
Các bộ phận Cortex-M như LPC1768 có đường dẫn bộ nhớ riêng biệt từ flash đến bộ giải mã lệnh, vì vậy trên thực tế, các hoạt động đăng ký để đăng ký có thể có nghĩa là CPU có thể thực thi nhiều lệnh giữa các lần khi nó cần truy cập vào bộ nhớ dữ liệu.
Chris Stratton

5

Là một lập trình viên, DMA là một tùy chọn để truyền dữ liệu đến và từ các thiết bị ngoại vi hỗ trợ nó. Đối với ví dụ cổ điển về việc dịch chuyển một bộ đệm lớn thông qua một thiết bị ngoại vi nối tiếp như SPI hoặc UART hoặc thu thập một số mẫu từ ADC, bạn có ba phương pháp di chuyển dữ liệu đó:

  1. Phương pháp bỏ phiếu. Đây là nơi bạn chờ trên các cờ đăng ký để cho phép bạn thay đổi vào / ra byte kế tiếp. Vấn đề là bạn đang giữ tất cả việc thực thi CPU trong khi chờ đợi điều này. Hoặc, nếu bạn phải chia sẻ thời gian CPU trong một hệ điều hành, thì quá trình chuyển của bạn sẽ bị chậm lại đáng kể.

  2. Phương pháp ngắt. Đây là nơi bạn viết một thói quen dịch vụ ngắt (ISR) thực thi với mỗi lần chuyển byte và bạn viết mã trong ISR quản lý việc chuyển. Điều này hiệu quả hơn CPU vì CPU sẽ chỉ phục vụ ISR của bạn khi cần. Nó là miễn phí để sử dụng tại tất cả các thời điểm khác, ngoại trừ trong ISR. ISR cũng là một trong những lựa chọn nhanh hơn để thực hiện chuyển tiền về tốc độ chuyển.

  3. DMA. Bạn định cấu hình DMA với các con trỏ nguồn / đích, số lần chuyển và tắt nó đi. Nó sẽ đánh cắp các chu kỳ bus và thời gian CPU để thực hiện việc chuyển và CPU có thể tự do làm những việc khác trong thời gian trung bình. Bạn có thể định cấu hình cờ hoặc ngắt để cho biết khi chuyển xong. Nó thường là một cú chạm nhanh hơn ISR và thường là tùy chọn chuyển nhanh nhất của bạn.

Là một lập trình viên, tôi thích DMA hơn vì nó dễ viết mã nhất và về cơ bản là kỹ thuật nhanh nhất để thực hiện chuyển tiền. Thông thường, bạn chỉ cần cấu hình một vài thanh ghi cho các con trỏ nguồn / đích và số lần chuyển để thực hiện và tắt nó đi. Tôi dành nhiều giờ hơn để làm việc với mã ISR so với mã tăng tốc DMA vì mã ISR yêu cầu các kỹ năng thiết kế quan trọng và phải được mã hóa, kiểm tra, xác minh, v.v. Mã DMA nhỏ hơn nhiều và mã tôi phải tự viết là tương đối tầm thường và tôi đang nhận được tốc độ chuyển tối đa trong giá cả.

Theo kinh nghiệm của tôi, gần đây với bộ xử lý Atmel SAM3 / 4, DMA chạy nhanh hơn một ISR hiệu quả của việc chế tạo của riêng tôi. Tôi đã có một ứng dụng sẽ đọc được một đống byte từ SPI cứ sau 5 ms. Rất nhiều phép toán dấu phẩy động đã xảy ra trong các tác vụ nền nên tôi muốn CPU được tự do nhất có thể cho các tác vụ đó. Việc triển khai ban đầu là ISR và sau đó tôi chuyển sang DMA để so sánh và cố gắng mua thêm một chút thời gian CPU giữa các mẫu. Tốc độ truyền đạt được cải thiện đôi chút, nhưng chỉ một chút. Nó hầu như không thể đo lường được trên phạm vi o.

Đó là bởi vì trên các bộ vi xử lý gần đây mà tôi đã thấy, ISR và DMA đang hoạt động gần như giống nhau - chúng có chu kỳ CPU theo yêu cầu và DMA thực hiện các hoạt động tương tự với CPU như tôi đã mã hóa trong ISR hiệu quả .

Trong những trường hợp hiếm hoi, tôi đã thấy các thiết bị ngoại vi có vùng RAM riêng mà DMA chỉ có thể truy cập. Đây là trên Ethernet MAC hoặc USB.


3

DMA rất có thể được sử dụng ở đây để DAC có thể có một số thời gian thông thường, tạo ra dạng sóng bằng cách thay đổi đầu ra analog ở một khoảng thời gian đã biết.

Có nếu đó là xe buýt dùng chung thì ... bạn phải chia sẻ.

Cpu không phải lúc nào cũng sử dụng xe buýt, do đó đôi khi nên chia sẻ với động cơ dma. Và tất nhiên, điều đó có nghĩa là các ưu tiên được tham gia, đôi khi chỉ là người đến đó trước (ví dụ: có lệnh fifo trước tài nguyên và năm mươi yêu cầu, theo thứ tự họ đến, vâng, điều đó không nhất thiết phải có tính quyết định ). Trong trường hợp như thế này, bạn có thể muốn dma được ưu tiên hơn cpu để những thứ nhạy cảm về thời gian như DAC hoặc ADC có thời gian xác định. Phụ thuộc vào cách họ chọn để thực hiện nó.

Mọi người đôi khi có giả định này thường không chính xác rằng dma là miễn phí. Nó không tiêu tốn thời gian của xe buýt, nếu được chia sẻ với cpu (mà cuối cùng là khi nó nói chuyện với một tài nguyên mà cpu có thể nói chuyện) thì cpu và / hoặc dma bị tắt, vì vậy cpu vẫn phải chờ một số thời gian, trong một số triển khai (có thể không phải là vi điều khiển của bạn), cpu bị tắt hoàn toàn cho đến khi dma hoàn thành, cpu bị dừng trong thời gian. Chỉ phụ thuộc vào việc thực hiện. Phần miễn phí của nó là cpu không phải liên tục bị gián đoạn hoặc bỏ phiếu hoặc nín thở cho một số sự kiện để cung cấp dữ liệu. Nó có thể mất thời gian của nó để tạo bộ đệm tiếp theo cho dma hơn. Nó phải theo dõi quá trình chuyển dma để hoàn thành và xử lý vấn đề đó, nhưng thay vì nói mỗi byte thì bây giờ là nhiều byte, một số khối dữ liệu.

Không có một câu trả lời phổ quát. "Nó phụ thuộc" ... vào thiết kế cụ thể của thứ cụ thể bạn đang sử dụng. Ngay cả trong một thiết kế chip / bo mạch / hệ thống có thể có nhiều động cơ dma và không có lý do gì để cho rằng tất cả chúng đều hoạt động theo cùng một cách. Đối với mọi trường hợp bạn phải tìm ra nó, và thật không may, họ thường không ghi chép tài liệu hoặc tài liệu đó đủ tốt. Vì vậy, bạn có thể phải tạo ra một số thí nghiệm nếu nó là một mối quan tâm.


lưu ý nhúng không có gì để làm với nó. Điểm quan trọng của dma là đạt được hiệu suất bằng cách có thể thực hiện công việc cho cpu để nó không phải có mã và tận dụng các chu kỳ bus không sử dụng thông thường và thực hiện công việc ở đó. Ngoài ra đối với những điều như trong câu hỏi của bạn về việc cung cấp dữ liệu vào đúng thời điểm lý tưởng mà không cần chi phí cpu. những lợi thế này có hữu ích nhúng hay không.
old_timer

1

Các câu trả lời cho đến nay nói về tốc độ trên mạng, CPU có thể làm việc và DMA mang lại lợi ích như thế nào. Tuy nhiên, có một sự xem xét khác, quyền lực .

Nếu CPU muốn gửi một gói dữ liệu trên một liên kết chậm, thì hầu như mọi lúc sẽ phải thức dậy nếu sử dụng bỏ phiếu hoặc ngắt, tuy nhiên CPU chính có thể ở trạng thái ngủ trong khi DMA đang được thực hiện .


0

Một số bộ xử lý như dòng STM32H7 có rất nhiều tùy chọn RAM và hàng đống RAM kết hợp chặt chẽ. Việc có các ngân hàng RAM riêng biệt cho phép DMA xử lý rất nhiều RAM trong khi bộ xử lý đang xử lý dữ liệu trong ram kết hợp chặt chẽ không yêu cầu bộ nhớ đệm và không bị DMA cản trở. Để di chuyển dữ liệu xung quanh bạn có thể sử dụng MDMA. Tôi đã chế tạo một bộ radar FMCW bằng một trong số này. ADC lấy dữ liệu IQ từ hai đầu vào thành một SRAM. Sau đó tôi chia tỷ lệ dữ liệu và thực hiện fft phức tạp 256 bin trong dtcm ram. Sau đó, FIFO kết quả thành một mảng 2d trong ram AXI bằng MDMA.

Tôi lấy một thùng fft 64 thứ hai trên fifo cho vectơ vận tốc. Sau đó, tôi thực hiện cường độ của dữ liệu phức tạp và gửi dữ liệu kết quả 128 & 64 giá trị dấu phẩy ra cho một H7 khác bằng SPI ở tốc độ 12,5 MHz để phát hiện. Tôi làm tất cả điều này trong 4 ms.

Tốc độ lấy mẫu của ADC là 84 kHz và sử dụng quá mức, tôi nhận được độ phân giải khoảng 18 bit.

Không tệ cho bộ xử lý mục đích chung chỉ chạy trong dải MHz và không có RAM ngoài.

Ngoài ra, bộ nhớ cache lớn mà thiết bị này đã cải thiện hiệu suất cho calcs bên ngoài dtcm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.