SDK poskytuje funkce, které vás nechají přistupovat přímok vlastnostem hardware na Picu. Jsou to velmi jednoduché obaly (wrappers) kolem základních mechanismů práce s hardwarem — paměťově mapované registry (memory-mapped registers). Můžete si myslet, že obcházení SDK a programování přímo před přístup k hardware je efektivnější a lepší, ale není. SDK je tak tenký obal nad hardware, že je velmi málo případů, kdy ušetříte nějaké zlomky mikrosekund přímým přístupem k hardwaru. Jediný důvod proč se učit jak používat paměťově mapované registry spočívá v tom, když narazíte na situaci, kde SDK neposkytuje funkci, která by dělato to, co potřebujete. V tomto článku se podíváme, jak používat přímo hardware pomocí jednoduchým programů.
Registry
N2které jiné procesory používají speciální způsoby připojování zařízení, avšak Pico procesor používá běžnější způsob, paměťově mapované registry.
Tak každé zařízení je reprezentováno množinou oblastí v paměti neboli "registry", které je mohou řídit.
Každý bit v registru určuje nejakou vlastnost zařízení nebo způsob jak vlastnost nastavit.
Skupina registrů může být vyjádřena typem short int, které nastavují hodnoty nebo režimy práce.
Jak přistupovat k registru?
Jednoduše, buď do registru uložíme hodnotu (zápis) anebo obsah registru uložíme do nějaké proměnné (čtení).
To není v Céčku žádná novinka.
Rozdíl je jen v tom, že neodkazujeme na adresu paměti poskytovanou systémem, ale přímo na pevnou adresu, kterou najdeme v dokumentaci.
Můžete používat ukazatel, ale takový, který je inicializován konstantou nebo literálem.
Například, podíváme-li se do dokumentace, tak najdeme, že GPIO registry sedí na adrese 0x40014000. Konkrétní registr je pak definován offsetem k této základní adrese.
| Offset | Jméno registru | Popis |
|---|---|---|
|
GPIO0_STATUS |
stav GPIO0 |
|
GPIO0_CTRL |
řízení GPIO0 včetně funcí select a overrides |
|
GPIO1_STATUS |
stav GPIO1 |
|
GPIO1_CTRL |
řízení GPIO1 včetně funcí select a overrides |
a tak dále až dolů |
||
|
GPIO29_CTRL |
řízení GPI29 včetně funcí select a overrides |
Je vidět, že pro každou GPIO linku (od GP0 až po GP29) máme dva registry, jeden stavový registr a jeden řídící.