Letysite.ru

IT Новости с интернет пространства
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Direct memory access

Электроника для всех

Блог о электронике

Работа с контроллером DMA

▌Что это?
Есть в современных контроллерах такой блок DMA — контроллер прямого доступа к памяти (ПДП). Штука очень простая, несмотря на умное название. Вся ее суть заключается в том, чтобы по команде от периферии или ядра взять и скопировать кусок памяти с одного места на другой.

Для этого мы в настройки DMA загружаем адрес откуда копировать, адрес куда копировать, какой размер блока данных копируемый за раз (байт, два байта — слово, два слова и так далее) и сколько блоков надо скопировать. А дальше контроллер DMA ждет команды или разрешения на работу. Как оно будет получено он фоном, не занимая проц, это все сделает. При этом сам ,если нужно, будет увеличивать адреса, выбирая следующий блок. А по завершении подаст прерывание, махнет флажком, в общем. Как то отчитается о работе.

Что с этим можно делать? Ой да много чего. Можно, задать в качестве источника адрес какой-либо периферии, скажем выходной регистр АЦП, а в качестве приемника адрес массива в ОЗУ, дать приказ DMA по команде завершения оцифровки АЦП хватать результат и пихать в массив. При этом DMA сам скопирует, сам увеличит адрес, а как заполнит буфер, то обнулится и начнет его переписывать по кругу заново.

И вот у нас, автоматически, без работы проца вообще, образуется циклический буфер приема данных с АЦП, которые мы можем тут же прогнать через любую цифровую обработку, да хоть через усреднение, и получить отфильтрованные уже данные. Или то же самое сделать с UART и заставить DMA аккуратно складывать входящие данные в кольцевой буфер.

А можно сделать и наоборот. Сказать DMA что мол вот тебе буфер, там лежит пара сотен байт, возьми и запихай их все в жерло UART и пойти по своим делам, а DMA трудолюбиво отправит в передачу весь буфер.

▌Ближе к теме
Контроллеры
Если рассмотреть конкретно STM32 то там находится один (на малых контроллерах вроде STM32F103C8T6) или два DMA контроллера DMA1 и DMA2 соответственно. На DMA1 есть 7 каналов, на DMA2 всего 5. Оба канала DMA сидят на шине AHB и перед тем как начать с ним работать надо на него подать тактирование, подняв биты DMA1EN и DMA2EN в регистре RCC_AHBENR, как и с любой другой периферией на STM32. В остальном они идентичные и работа с первым и вторым одинакова.

Каналы контроллера
Каждый канал независимый и может работать сам по себе со своими настройками. Но в один момент времени может работать только один канал у каждого контроллера. Чтобы избежать коллизий у каждого канала есть два уровня приоритета. Первый, программный. Мы просто в битах настройки задаем один из четырех уровней. А второй аппаратный, если придут запрос на два канала с одинаковым приоритетом в настройках, то победит тот, чей номер меньше. Сходно с обработкой прерываний. Там такой же двухступенчатый арбитраж.

За выбор приоритета отвечают два бита PL регистра DMA_CCRx Для каждого канала регистр свой. Вариантов там немного, всего четыре:

  • 00 — низкий
  • 01 — средний
  • 10 — высокий
  • 11 — сверхвысокий.

Каждый канал привязан к конкретной периферии. Т.е. если вам нужно чтобы DMA пинал АЦП, то ищите к какому каналу подключено именно АЦП.


Обратите внимание на то, что помимо аппаратных событий в мультиплексор еще ведет софтверный триггер от бита MEM2MEM. Для каждого канала:

Т.е. мы можем гонять данные не только по приказу периферии, но и просто по желанию левой пятки. Просто надо поставить бит MEM2MEM, указать откуда куда и дать приказ в виде EN бита. И DMA исполнит. Это дает некоторую свободу. Например, у нас нет возможности повесить DMA канал на периферию ,т.к. ее родной канал уже занят другой периферией. Бывает такое огорчение. Что делать? Правильно, взять любой другой канал, настроить на обслуживание этой периферии, а пинок давать не через аппаратное событие, в прерывании, вручную дернуть этот канал через Mem2Mem бит. Да будет не совсем красиво, но куда лучше чем в том же прерывании вручную копировать все это. Хотя тут надо смотреть что будет быстрей. Возможно выгоды не будет никакой. Ради одного байта заряжать DMA смысла нет, а вот ради четырех… уже может иметь смысл.

Размер данных
За раз DMA может копировать порцию данных в 1, 2 или 4 байта. В первую очередь это влияет на приращение адресов при вычислении куда класть. Так что это настройка жизненно важна. Сколько и куда класть определяется обычно периферией. Т.е. если UART принимает и выдает по байту, то результат у нас 8 битный. А вот АЦП, может, например, выдать 16 битный результат. Значит размер указывать надо два байта, чтобы сразу за один заход их все забрать. Ну и, очевидно, что размер принимаемых и сохраняемых данных обычно совпадает. Хотя, вам никто не запретить класть однобайтные данные периферии в 32 разрядный массив, выравниваясь по двойному слову. Тогда размер может быть и разный.

За размер данных периферии и памяти отвечают два бита PSIZE и MSIZE регистра DMA_CCRx

00 — 1 байт
01 — 2 байта
10 — 4 байта
11 — не используется.

Откуда куда
Адрес периферии для каждого канала задается в регистре DMA_CPARх этого канала. Просто пишем туда адрес нужного регистра периферии. Но есть два важных момента. Во-первых, нельзя писать в этот регистр при включенном DMA. Т.е. при изменении их бит EN должен быть снят. Второе, адрес зависим от битов PSIZE регистра DMA_CCRx. Т.е. если у нас указан размер данных как 1 байт (PSIZE = 00), то активные все биты регистра DMA_CPARx. Но если данные указаны как слова или как двойное слово, по 16 или 32 бита соответственно, то один или два младших бита этого регистра игнорируются вообще. Т.е. получается, что адрес выравнивается по словам или двойным словам. Т.е. DMA не сможет записать данные словами начиная с нечетного адреса, но адреса все выровнены по словам, так что это пофигу.

Адрес памяти лежит в аналогичном регистре DMA_CMARx и там все то же, что и для DMA_CPARx только за размер отвечают биты MSIZE и его тоже нельзя трогать на включенном канале.

Также надо указать направление копирования. За него отвечает бит DIR регистра DMA_CCRx.

Когда он 0 то мы читаем из адреса DMA_CPARx и пишем по адресу DMA_CMARx. А когда он 1, то наоборот, соответственно. Название у бита идиотское. Не, ну понятно, что направление, но лучше бы назвали его M2P, то есть если 1, то из памяти в периферию. Или как то так. Долго никак не мог запомнить направление, пока не связал, что 0 он такой округлый и похож на такую же округлую букву P — Periph. А 1 угловатая, прям как буква М — Мemory.

Ну и опции инкремента адреса. биты PINC и MINC во все том же DMA_CCRx. Они отвечают за то, чтобы после каждой сработки у нас автоматически увеличивался адрес которые в DMA_CPARx или с DMA_CMARx соответственно.

Адрес периферии прибит намертво и редко когда надо его менять, так что обычно PINC всегда равно нулю. Т.е. никакого инкремента. Вам же не надо, чтобы после чтения из DR того же UART1 на следующем байте было уже из следующего по списку BRR :)))

Хотя… в некоторых случаях таким образом можно сдернуть по DMA содержимое всех регистров настройки какой-нибудь периферийной штуки. Например для отладки, чтобы сделать это предельно быстро, на лету. Правда тут надо быть очень осторожным. Многие биты событий и флаги прерываний снимаются при чтении. И чтение через DMA тоже считается. Так что побыть бесстрастным наблюдателем не выйдет.

Читать еще:  Как изменить формат презентации powerpoint

Зачем же нужен инкремент DMA_CPARx? А для режима копирования из памяти в память. Тогда мы в DMA_CPARx пишем адрес одного буфера, в DMA_CMARx адрес другого, ставим бит MEM2MEM, даем разрешение и поехали!

А вот бит MINC ставится почти всегда. Мы указываем DMA_CMARx начало буфера и DMA, увеличивая адрес, его последовательно заполняет, или читает из него в периферию.
Впрочем, если нам надо гнать из периферии в периферию, скажем из АЦП сразу в SPI, то бит MINC тоже равен нулю будет.

Ну и есть еще один вариант, когда инкремента нет ни на адресе приемника, ни на адресе источника. Таким образом делаются прямые перегонки, например, из АЦП сразу в USART, минуя процессор. Или на SPI. Так можно в десяток строк кода превратить STM32 в какой нибудь вариант SPI АЦП 🙂

Также есть бит CIRC, который разрешает цикличный режим. Т.е. как только DMA отработает свое количество циклов заданных в регистре DMA_CNDTRx так адрес сбрасывается в исходное положение. Таким образом, можно указать в DMA_CNDTRx размер буфера и получить циклических буфер нахаляву, аппаратно.

Сколько?
За то сколько раз должно отработать DMA отвечает регистр DMA_CNDTRx. На каждую сработку от входного сигнала (или от постоянно стоящего бита MEM2MEM) DMA копирует один обьект и уменьшает число в DMA_CNDTRx и так до нуля. Дойдет до нуля, канал выключится. Бит EN тут уже ничего решать не будет. Но если стоит бит CIRC, то регистр перезагрузится исходным значением и продолжит работу. Значение может быть до 65535, используются только младшие 16 бит, старшие два байта ДОЛЖНЫ БЫТЬ НУЛЕМ ВСЕГДА.

Записать в регистр DMA_CNDTRx можно только при выключенном DMA канале. Читать можно когда угодно, по нему можно определять сколько объектов осталось DMA передать.

И тут есть важный нюанс. Я намеренно выше говорил, что «сколько осталось объектов». DMA_CNDTRx Считает не БАЙТЫ, а сколько раз DMA сработал. А за одну сработку, он зависимости от настроек, может пересунуть 1, 2 или 4 байта.

Т.е. если вы откуда то скопипастите код в котором будет что-то вида:

Direct memory access (DMA)

DMA stands for «Direct Memory Access» and is a method of transferring data from the computer’s RAM to another part of the computer without processing it using the CPU. While most data that is input or output from your computer is processed by the CPU, some data does not require processing, or can be processed by another device.

In these situations, DMA can save processing time and is a more efficient way to move data from the computer’s memory to other devices. In order for devices to use direct memory access, they must be assigned to a DMA channel. Each type of port on a computer has a set of DMA channels that can be assigned to each connected device. For example, a PCI controller and a hard drive controller each have their own set of DMA channels.

For example, a sound card may need to access data stored in the computer’s RAM, but since it can process the data itself, it may use DMA to bypass the CPU. Video cards that support DMA can also access the system memory and process graphics without needing the CPU. Ultra DMA hard drives use DMA to transfer data faster than previous hard drives that required the data to first be run through the CPU.

An alternative to DMA is the Programmed Input/Output (PIO) interface in which all data transmitted between devices goes through the processor. A newer protocol for the ATAIIDE interface is Ultra DMA, which provides a burst data transfer rate up to 33 mbps. Hard drives that come with Ultra DMAl33 also support PIO modes 1, 3, and 4, and multiword DMA mode 2 at 16.6 mbps.

DMA Transfer Types

Memory To Memory Transfer

Auto initialize

In this mode, during the initialization the base address and word count registers are loaded simultaneously with the current address and word count registers by the microprocessor. The address and the count in the base registers remain unchanged throughout the DMA service.

After the first block transfer i.e. after the activation of the EOP signal, the original values of the current address and current word count registers are automatically restored from the base address and base word count register of that channel. After auto initialization the channel is ready to perform another DMA service, without CPU intervention.

DMA Controller

The controller is integrated into the processor board and manages all DMA data transfers. Transferring data between system memory and an 110 device requires two steps. Data goes from the sending device to the DMA controller and then to the receiving device. The microprocessor gives the DMA controller the location, destination, and amount of data that is to be transferred. Then the DMA controller transfers the data, allowing the microprocessor to continue with other processing tasks. When a device needs to use the Micro Channel bus to send or receive data, it competes with all the other devices that are trying to gain control of the bus. This process is known as arbitration. The DMA controller does not arbitrate for control of the BUS instead; the I/O device that is sending or receiving data (the DMA slave) participates in arbitration. It is the DMA controller, however, that takes control of the bus when the central arbitration control point grants the DMA slave’s request.

Direct Memory Access

Introduction

Direct Memory Access, or DMA, is an absolutely essential part of any modern computing architecture. DMA allows the CPU to offload intensive memory access tasks to other components. This then frees the CPU from these menial chores and provides more cycles to more complex tasks for which it is better suited.

For example, perhaps you would like to save this article on your hard drive for future reference. Once you’ve chosen to do this and you’ve chosen a location to save the article, is the CPU really necessary? Are you performing any calculations? Ignoring any progress indicators or file system updating for now, there’s really not much going on here. The data is received by your network card and is then routed to the desired location on your hard drive. Simple. The capabilities of the CPU would certainly be overkill for this type of operation.

Though the basic idea of, and motivation for, direct memory access is quite simple, operations that access memory directly can be quite complex. As you can imagine, when multiple devices (or peripherals) are all attempting to access memory locations trouble can quickly ensue. This is the reason or the requirement for a DMA controller. The DMA controller is the device which controls all DMA operations.

To control the DMA operations, the DMA controller first needs to be setup with information related to the upcoming operation. This information includes things like the source and destination addresses, the mode, and the size of the data to be transferred. The DMA controller is then armed with the knowledge of what to transfer, where to transfer it to, how to do it, and how long to do it for. With this knowledge the DMA controller can then request control of the memory bus from the CPU. When the CPU is ready to relinquish control of the memory bus, the CPU sends an acknowledge single in response to the DMA controller’s request signal.

Читать еще:  System accessibility service


Figure 1: Direct Memory Access interactions. Courtesy of www.eetimes.com

Burst or Single-cycle

What happens after the DMA controller gains control of the memory bus depends on the mode in which the DMA controller has been instructed to operate in. There are two general modes of operation for DMA controllers. The first of these is referred to as burst. When a DMA controller is operating in burst mode it retains control of the memory bus for the duration of the memory transfer. The negative aspect of operating in burst mode is that the CPU will not be able to access the memory bus until the DMA controller completes the memory transfer. While the CPU will be able to access its L1 and L2 cache, it won’t be able to access any other memory; this will obviously limit what the CPU can accomplish and may result in the CPU having to wait until the DMA controller has completed the memory transfer and relinquished control of the memory bus back to the CPU.

To avoid the unfortunate situation where the CPU is left waiting for the memory transfer to complete, the DMA controller can operate in another mode called single-cycle. While operating in single-cycle mode, the DMA controller relinquishes control of the memory bus after transferring each block of memory. The size of this block is typically 256 or 512 bytes. This then gives the CPU the opportunity to utilize the memory bus for its own purposes without having to wait for any significant amount of time. Unfortunately there is a down side to the DMA operating in single-cycle mode. When the DMA controller relinquishes control of the memory bus it must then send a request to the CPU to regain control of the bus and must then wait for an acknowledge signal from the CPU before regaining control of the bus for another transfer of a memory block. Thus, having to repeat the request/acknowledge sequence many times the total time taken to complete the memory transfer is increased.

The single-cycle operating mode is the most commonly used mode, though most DMA controllers are capable of both modes. The optimum block length which the DMA will transfer before relinquishing control of the bus and re-requesting control is a matter quite complex. One major factor in determining the optimal size of the block is the observed error rate. As errors are observed in the transfer of memory (quite common when the memory is transferred over a communications link) retransmission of the data must occur. For this reason when there is a high rate of error smaller block lengths are optimal. However, when there are few errors a small block length will result in a increase in request/acknowledge cycles between the DMA controller and the CPU thus decreasing the total memory transfer time. How these decisions are implemented is dependent upon each DMA controller manufacturer (or more precisely the engineer who designed it!) and is not widely distributed. If you’d like to know how this is determined for a specific DMA controller, you may be able to find it somewhere in the documentation, otherwise it might require a query to the company.

When the DMA controller has completed the transfer of a block and relinquished its control of the memory bus back to the CPU the CPU can then access the bus for its own purposes. In the example I used above, and in many other examples, this provides the CPU with an opportunity to update any progress indicators and to update the file system with any new information relevant to the DMA operation being performed (the existence of a new file for instance).

Cache Coherency

Another issue which arises during DMA operations is called cache coherency. When the CPU accesses a memory location, the value of that location is stored in the CPU’s cache. If a DMA operation were to involve this memory location then the value in the CPU’s cache may not match the value at the true memory location. For further reading on cache coherency view my previous article here.

To solve this problem there are two possible solutions. Systems that are fully cache coherent implement a hardware solution where the DMA controller sends a signal to the cache controller when it wishes to access a memory location. If the DMA wants to write to that location, the cache controller will invalidate the CPU’s cache value. If the DMA wishes to read the memory location the cache controller will flush the CPU’s cache to ensure that the memory location contains the most up to date value (which would be the value in the CPU’s cache). This method of operation requires some overhead but guarantees the coherency of the CPU’s cache.

In systems that are not fully cache coherent the job of maintaining cache coherency is left to the operating system. The operating system will be required to decide if the cache should be flushed prior to a DMA operation, or invalidated afterwards. Which method is better? I’m not sure there’s a definitive answer, both methods are adequate. However, I personally prefer the elegance of the hardware solution implemented in fully cache coherent systems.

Контроллер DMA (Direct Memory Access)

Контроллер DMA – Прямой доступ к памяти.

Для быстрого сбора или передачи данных в автоматическом режиме, что бы не отнимать ресурсы процессора на выполнения основной задачи, предназначен Контроллер DMA. Он позволяет организовывать каналы автоматического сбора и отправки данных на периферийные устройства. Контроллер DMA – присутствует в контроллера PIC24H, позволяет организовать обмен данными с устройствами посредством двух портовой памяти DPSRAM.

Контроллер DMA передает данные между регистрами периферийных устройств и данными в пространства SRAM. Подсистема DMA PIC24H использует двух портовые функции памяти SRAM (DPSRAM) и регистры структуры, которые позволяют работать DMA через ее собственные, независимые адреса и шины данных без влияния на работу процессора. Эта архитектура устраняет необходимость в цикле задержки, который останавливает CPU, когда более высокий приоритет DMA запрашивает передачу данных. Оба процессор и контроллера DMA может писать и читать в/из адресов в пространстве данных без помех, в режиме реального времени. Кроме того, операции DMA и передачи данных в/из памяти и периферийных устройств не влияет на обработку данных процессором. Например, когда во время выполнения самостоятельного программирования (RTSP), процессор не выполняет никаких инструкций, пока RTSP не закончена. Это условие, однако, не влияет на передачу данных в/из памяти для периферийных устройств.

Контроллер DMA поддерживает восемь независимых каналов. Каждый канал может быть настроен на обмен данными для выбранного периферийного устройства. Периферийные устройства, поддерживаемых контроллером DMA включают:

  • ECAN™ technology
  • 10-bit/12-bit Analog-to-Digital Converter (ADC)
  • Serial Peripheral Interface (SPI)
  • UART
  • Input Capture
  • Output Compare
Читать еще:  Powerpoint open xml presentation

Кроме того, выполнение обмена данными контроллером DMA могут быть вызваны таймерами, а также внешними прерываниями. Каждый канал DMA является однонаправленным. Два DMA канала могут быть настроены на направления на чтение и запись в периферийное устройство. Если более чем один канал получает запрос на передачу данных, то простая схема фиксированных приоритетов, основанная на номере канала, определяет какой канал завершает передачу и какой канал или каналы, остаются в ожидании. Каждый DMA канал может перемещать блок до 1024 элементов данных, после чего он генерирует прерывание для процессора, чтобы указать, что блок готов для обработки данных.

DMA контроллер обеспечивает следующие функциональные возможности:

  • Восемь каналов DMA
  • Режим косвенной адресации с пост-приращение
  • Режим косвенной адресации без пост-приращение
  • Периферийные косвенным режимом адресации (периферический генерирует адрес назначения)
  • Прерывание для CPU после заполнения или передачи половины или полного буфера данных
  • Передача байта или слова данных
  • Фиксированные уровни приоритета каналов DMA
  • Руководство (программное обеспечение) или автоматической (периферический запросы DMA) начала передачи
  • Одиночный или автоматический режим повтора передачи блока данных
  • Пинг-понг режиме (автоматическое переключение между двумя адресами DPSRAM начала после каждого полного блока передачи )
  • DMA запрос для каждого канала может быть выбран из любого поддерживаемого источника прерывания
  • Поддержка отладки функций

DMA регистры.

Каждый канал DMA имеет набор из шести регистров состояния и управления.

DMAxCON: Регистр управления каналом

Этот регистр предназначен для включения/отключения канала, задание передаваемого размера данных (слово/байт), направления передачи данных, метод прерывания, выбор режим адресации, режим записи данных обычный или режим работы Null.

DMAxREQ: Регистр настройки соответствия канала DMA периферийному устройству через IRQ

Этот регистр связывает канал DMA с конкретным периферийным устройством, путем загрузки в регистр номера DMA периферийного устройства. Через этот регистр канал DMA получает запрос выполнить передачу данных, когда периферийное устройство подготовит данные и выставит прерывание.

DMAxSTA: Стартовый адрес для буфера А в DPSRAM памяти

Этот регистр указывает начальный адрес смещения для буфера А от базового адреса DPSRAM блока данных для передачи по каналу DMA_Х в или из DPSRAM. Чтение этого регистра возвращает значение адрес смещения DPSRAM после последней передачи . Запись в этот регистр то время как соответствующий канал DMA включен (т.е. активный) может привести к непредсказуемому поведению и этого следует избегать.

DMAxSTB: Стартовый адрес для буфера В в DPSRAM памяти

Этот регистр указывает начальный адрес смещения для буфера В от базового адреса DPSRAM блока данных для передачи по каналу DMA_Х в или из DPSRAM. Чтение этого регистра возвращает значение адрес смещения DPSRAM после последней передачи. Запись в этот регистр то время как соответствующий канал DMA включен (т.е. активный) может привести к непредсказуемому поведению и этого следует избегать.

DMAxPAD: Адрес регистра данных периферийного устройства

Этот регистр чтения/записи содержит указатель на регистра данных периферийного устройства. Запись в этот регистр то время как соответствующий канал DMA включен (т.е. активный) может привести к непредсказуемому поведению и этого следует избегать.

DMAxCNT: Регистр количества данных, загружаемых в буфер

Этот регистр содержит размер буфера данных. DMAxCNT + 1 представляет количество запросов которые должен обслужить DMA канал для передачи блока данных. То есть, если значение записанное в регистр DMAxCNT = ‘0’, будет передаваться один элемент. Значение регистра DMAxCNT не зависит от размера данных передачи (размер бита в DMAxCON регистра). Запись в этот регистр то время как соответствующий канал DMA включен (т.е. активный) может привести к непредсказуемому поведению и этого следует избегать.

В дополнение к отдельному каналу DMA регистров контроллера DMA имеет три регистров DMA статуса.

DSADR: Регистр адреса последнего обращения в память DPSRAM

Этот 16-разрядный, с доступном только для чтения, регистр состояния, является общим для всех каналов DMA. Она захватывает адрес по которому было последнее обращение к памяти DPSRAM (чтение или запись). Он сбрасывается при сбросе и, следовательно, содержит значение ‘0x0000 ‘, если его прочитать до начала любой активности DMA. Этот регистр доступный в любое время, но в первую очередь предназначена как для отладочных функций.

DMACS0: Регистр 0 состояния контроллера DMA

Этот 16-разрядный, с доступном только для чтения, регистр состояния, содержит флаги ошибок записи в данных в периферийное устройство и в DPSRAM память.

DMACS1: Регистр 1 состояния контроллера DMA

Этот 16-разрядный, с доступном только для чтения, регистр состояния, содержит указание какой канал DMA совсем недавно был активным и показывает какой канал работает в режиме Пинг-понг.

DMA контроллер – блок схема

Пример использование контроллера DMA для получение данных от АЦП, помещение его в массив для последующей обработки процессором.

Задача следующая, необходимо настроить работу АЦП в непрерывном режиме измерений, а работу DMA контроллера для сбора 128 байт данных и формирования прерывания для процесса обработки данных.

Настройка АЦП (пример для контроллера PIC24HJ256GP206)

#39. DMA: Direct Memory Access (Прямой доступ к памяти)

Мы обсудим использование прямого доступа к памяти (DMA) для освобождения процессора от затрат на передачу блоков данных между памятью и периферийными устройствами. Рассмотрим следующую идиому, где данные блока считываются с периферийного устройства, повторно ожидая флаг состояния и затем считывая элемент с периферийного устройства.

Мы рассматривали это в разделе Последовательная связь, связь по SPI и увидим это снова со связью I2C. Этот подход, называемый программным опросом, имеет три ограничения. Во-первых, процессор связан во время передачи и не может выполнять другие задачи; в идеале при большой передаче данных (рассмотрите возможность считывания сектора данных с SD-карты), передача может быть начата, и процессор может быть освобожден для выполнения другой работы, пока передача осуществляется. Во-вторых, фактическая скорость передачи ниже, чем может позволить базовое оборудование. Наконец, трудно достичь жестких временных ограничений, например, потоковая передача звука зависит от выборок данных, которые должны передаваться с постоянной скоростью.

Чтобы увидеть различия в производительности, рассмотрим два снимка экрана логики, показывающих передачу SPI при заполнении, и ЖК-дисплей 7735 со сплошным цветом. Верхний снимок измеряет время для переноса 2 пикселей, а нижний снимок измеряет время для передачи 128 пикселей. Теоретический пик составляет 12х10 6 /16 = 750 000 пикселей в секунду для тактовой частоты SPI 12 МГц. Без прямого доступа к памяти наша скорость передачи составляет 1/20×10 -6 = 50 000 пикселей / секунду, в то время как с DMA наша скорость передачи составляет 128/17×10 -4 = 735 000 пикселей / секунду. Конечно, с DMA, есть неизбежные издержки между блоками. Таким образом, существует компромисс между пропускной способностью и пространством памяти (большие блоки дают более высокую пропускную способность).

DMA реализован в процессорах с выделенными аппаратными устройствами. Эти устройства совместно используют шину памяти и периферийные шины с процессором (CPU. На этой схеме устройство DMA считывает данные из памяти по шине памяти и выполняет запись в периферийное устройство по периферийной шине. Ситуация с STM32 несколько сложнее, потому что есть несколько периферийных шин, но принцип тот же.

Только одно устройство может использовать шину в любой момент, поэтому передача DMA влияет на процессор. Однако учтите, что пиковая скорость для устройства SPI составляет 750 000 передач / секунду, в то время как шина памяти устройства линейки значений STM32 может поддерживать 24 000 000/5 операций ОЗУ в секунду (каждая передача занимает 5 циклов шины). Таким образом, наша передача блоков потребляет примерно 15% циклов шины памяти. Архитектура STM32 гарантирует, что процессор не будет голодать). Кроме того, только часть инструкций STM32 напрямую обращаются к памяти RAM — остальные просто извлекают инструкции из FLASH, который использует другую шину.

Добавить комментарий Отменить ответ

Для отправки комментария вам необходимо авторизоваться.

Ссылка на основную публикацию
Adblock
detector