McuLab jediný zdroj v čipu jsou takty

Tohle je statická kopie kapitoly pro vyhledávače. Interaktivní verze má animované obrázky, kontrolní otázky a tlačítka, která příklad načtou do kalkulačky.

DMA: nekupuje rychlost, kupuje takty

Přímý přístup do paměti se obvykle vysvětluje jako „rychlejší přenos“. Není. Přenos trvá zhruba stejně dlouho — jen ho nedělá procesor, a tím se uvolní jediná věc, které je v čipu málo.

procesorem8192 taktůpřes DMA214 taktůušetřeno 7978 taktů (38,4×)to je 47,5 µs jádra zpětvyplatí se od 8 bajtů výša i pro obrovský přenos je zrychlení konečné — sběrnice se sdílítady se to vyplatí
Červený pruh je práce procesoru, zelený je to, co ho DMA stojí. Zmenšuj počet bajtů a najdi bod, kde se to přestane vyplácet.

Co DMA stojí

taktyCPU = nastavení + přenos · sdílení sběrnicenení to nula

Nastavení kanálu je desítky taktů a je stejné pro čtyři bajty i pro čtyři kilobajty. Odtud bod, pod kterým se DMA nevyplatí — a je vyšší, než by člověk čekal: při šedesáti taktech nastavení a osmi taktech na bajt je to kolem osmi bajtů, ale při dvou taktech na bajt už kolem čtyřiceti.

Druhá položka je sdílení sběrnice: DMA sahá do téže paměti jako procesor a občas mu zabere takt. Nebývá to víc než patnáct procent, ale znamená to, že zrychlení je konečné i pro obrovský přenos — nikdy nevyjde nekonečno.

Kde se to v robotu vyplatí nejvíc

kdeproč
ADC → paměťvzorkuje se rychleji, než by stačilo přerušení; sekvence kanálů jde celá
SPI k enkodérudesítky bajtů každou periodu smyčky, jinak by to bylo přerušení na bajt
UART příjemkruhový buffer bez jediného přerušení, dokud nepřijde celá zpráva
PWM z tabulkyčasovač si střídy bere sám — sinusovka bez zásahu jádra

A jedna past, která se najde až na osciloskopu: DMA přenáší, když je připraveno, ne když se to hodí. Pokud přenos běží přes okamžik, kdy regulační smyčka čte data, čte je napůl přepsaná. Řešení je dvojitý buffer nebo přerušení „hotovo“ — ne kontrola příznaku, ta přijde vždycky o kousek pozdě.

Vzorce v této kapitole

cykly — co DMA stojí procesor
cykly_CPU = nastavení + přenos·sdílení [—] STM32F407 RM0090