Pseudo DMA pro MCU

   Jak asi název DMA (Direct Memory Access) napovídá, jedná se o přímý přístup pariferních zařízení do paměti. V PC již řadu let (přesněji snad desítky let) neodmyslitelná funkce. V principu jde o to, že periferie přes DMA řadič mohou přistupovat přímo do operační paměti. CPU je v tomto případě "volný" k jiným úkolům a nemusí dané zařízení nepřetržitě obsluhovat. Jediné co musí zajistit, je zinicializování přenosu. Tak například v případě čtení z HDD pošle řadiči instrukce kolik dat, z jaké adresy a kam má načíst a po skončení operace řadič může vyvolat přerušení procesoru - ten se už může "vrhnout" na kompletní data.
   DMA už ovšem dávno není jen doménou PC, ale stále častěji se objevuje na výkonějších jednočipech (třeba ARM). Na jednodušších verzích, jako jsou třeba AVR, tato možnost bohužel chybí. Periferie jako LCD nebo D/A převodníky lze tedy ovládat jedině přímo pomocí MCU. Obsluhu těchto periferií je ovšem možné napsat tak, aby zdánlivě probíhala bez zásahu MCU - právě proto "pseudo DMA". Nejednodušším způsobem je třeba nastavit časovač na nějakou vhodnou periodu a vyvolávat jím přerušení. V obsluze pak třeba vždy odeslat jeden byte do D/A převodníku, do LCD řadiče nebo opačně. MCU sice v průměru stále ztrácí čast výkonu na řízení dané periferie, ale děje se tak zdánlivě bez našeho přičinění, navíc v pravidelných intervalech, což by v hlavní programové smyčce nešlo. Zejména pokud jde třeba o audio D/A převodníky, tak perioda vzorkování je mnohdy kratší než některé operace. Jistým druhem Pseudo DMA je pak i příjem dat z USARTu přes přerušení, kde si přijímaná data lze ukládat do vyrovnávací paměti a až v hlavní programové smyččce je zpracovávat.
   Prakticky jsem již pseudo DMA na jednočipech AVR realizoval několikrát. Nejprve v kombinaci se softwarově vytvořenou vyrovnávací pamětí (FIFO) pro ovládání sériového I2S audio D/A, dále několikrát pro LCD (grafické i znakové), ale také pár experimentů pro zápis na HDD z externí RAM (segmentovaných 512kB).

Pseudo DMA rutiny pro HD44780

   Tento demonstrační prográmek ukazuje pseudo DMA refresh LCD s řadičem HD44780. Znaková paměť DDRAM se obnovuje z interní RAM AVR. Všechny texty/císla se zapisují jen do RAM, což je velmi rychlé a po dokončení zápisu se jen zinicializuje refresh LCD a o zbytek se postará přerušní timeru 2. Případně lze zapnout automatické obnovování po každém zápisu do znakové RAM. Ušetří se tak poměrně dost strojového času, protože klasické obnovení LCD 2x20 znaků by normálně trvalo přes 1,6ms v kuse a to je někdy až příliš. Rutiny jsou napsány pro ATmega32, ale změnou timeru je lze přepsat pro kterýkoliv jiný AVR.
Zdrojáky


   Po vypsání pár textíků se spustí něco jako terminál. Komunikace je nastavena na 19200bd bez řízení toku. AVR přijaté znaky vypisuje na LCD a zároveň vrací terminálu. Enter maže řádek.

Poslední aktualizace: 27.3.2007