V této sérii článků na téma embedded systémy se zaměřím na několik aspektů návrhů těchto systémů, zvláště s přihlédnutím k metodám a technikám programování, použití operačních systémů a také ke komunikačním protokolům, zásadám jejich návrhu a implementace.
Embedded systémy jsou specializované počítačové systémy, které slouží pro jednu nebo několik málo funkcí. Často tyto systémy nalézáme ve spotřební elektronice, v automatizaci, v průmyslových zařízeních, automobilech a podobně. Základní konstrukční jednotkou jejich elektronické části bývá tzv. mikrokontrolér (MCU), což je mikroprocesor doplněný o operační paměť a nějakou množinu potřebných periferních zařízení. Mezi tato periferní zařízení typicky patří:
Jinou alternativou hardwarové konstrukce embedded systémů, někdy koexistující s výše uvedeným mikrokontrolérem, je použití hradlových polí, s možností implementace mnoha hardwarových modulů včetně procesorů. Takovým řešením může být například procesor Nios firmy Altera nebo makrobuňka procesoru ARM Cortex-M0 firmy Advanced RISC Machine. Zatímco řešení Nios je vhodné pro firmy vyvíjející koncové zařízení, kdy je firma schopna pomocí hradlového pole vytvořit pomocí jedné součástky celé potřebné zapojení včetně specifických hardwarových funkcí, řešení ARM Cortex-M0 je spíše akceptováno výrobci polovodičových součástek při návrhu svého mikrořadiče. Řešení firmy Altera je spíše vhodné v případě velmi specifické aplikace, kdy je možné vytvořit pro procesor Nios zcela nové instrukce, které jsou určeny pro zvláště hardwarově náročné práce. Pro většinu běžných aplikací je toto řešení kupodivu finančně náročnější než běžný mikrokontrolér. Možná i proto se zatím podle mého názoru toto řešení nepříliš prosazuje v praxi.
Obr. 1 Blokové zapojení procesoru (zdroj Texas Instruments)
Embedded systémy jsou v dnešní době z velké části plnohodnotné počítačové systémy, obsahující jeden nebo více procesorů o šířce slova 8 až 64 bitů, operační paměť a spoustu periferních zařízení. Na rozdíl od počítačových systémů všeobecného určení, jako jsou například osobní počítače, se embedded systémy vyznačují těmito rozdíly:
Základním programovacím jazykem se pro mikroprocesory embedded systémů dnes stává jazyk C/C++. Nároky na programátora jsou kromě běžných znalostí programovacích jazyků C/C++ a assemblerů zvětšeny o detailní znalosti průběhu startu daného mikroprocesoru, přerušovacího podsystému, znalost práce linkeru pro správné vytvoření mapy paměti, uložené v paměti typu ROM/FLASH a za běhu programu. Zkušený programátor by rovněž měl znát, jak pracuje překladač jazyka C se segmenty, volací konvence funkcí jazyka C pro možnost volat funkce, psané v jazyce Assembler z jazyka C a naopak. Další samostatnou kapitolou programátorských znalostí je používání konstantních objektů v jazyce C, to je takových, jejichž obsah se během celého chodu aplikace nemění. Jsou to například tabulky funkcí, struktury s konstantním obsahem nebo ukazatele na objekt, jehož poloha se nemění.
Při hardwarovém návrhu konkrétního systému je třeba dobře promyslet zejména hardwarové doplňky, které budou podporovat specifické funkce daného zařízení. Častou chybou je předpoklad, že mnoho funkcí, hlavně časově závislých, bude realizováno pomocí programového vybavení. Toto je samozřejmě možné, má to však několik nevýhod:
Navíc v dnešní době není problém s vybaveností mikrokontrolérů dostatečným hardwarem za velmi nízké ceny.
Volba mikroprocesoru je průnikem mnoha požadavků. Promítají se do ní tato hlediska:
Posledně jmenované hledisko je subjektivní a dle mého názoru je příliš svazující. Na jedné straně je sice pravda, že přechod programátora na jinou procesorovou platformu trvá nějaký čas, odhadem asi půl roku, ale tato doba je silně vyvážena výsledným efektem, kdy systémy mohou při použití novějších procesorů výrazně zvýšit svůj výkon, množství funkcí, robustnost implementace programů. I cena je v současné době velmi podobná, v některých případech dokonce nižší než u použití staršího procesoru nebo mikrořadiče. Příkladem mohou být právě masově používané procesory řady Intel 8051 nebo procesory PIC firmy Microchip Technology. Jejich architektura byla jistě ve své době přelomová, ale dnes jsou k dispozici za stejnou cenu daleko výkonnější procesory s bohatším vybavením.
Obr. 2 Cenové relace (zdroj Texas Instruments)
Všechny tyto nevýhody vedou k používání špatných programovacích technik. Navíc například ceny procesorů řady ARM Cortex- M3 firmy Texas Instrument (nedávno Luminary Micro) pro modely s nejmenší pamětí startují od 2 dolarů za kus (36 Kč). Za tuto cenu dostanete plně 32bitový procesor s interní FLASH a RAM pamětí a množstvím integrovaných periferií. Tato cena je již srovnatelná s jinými méně výkonnými 8/16bitovými procesory.
Nezávislé procesorové rodiny jsou produkovány více než jedním výrobcem. Výhodou použití takových procesorů je pak nezávislost na jednom výrobci procesorů. Návrhář si může vybrat konkrétní mikrořadič podle výrobce, přidaných periferií, velikostí interních pamětí, přičemž neustále platí, že vlastní procesor je stále stejný a programátor může zúročit všechny dosavadní znalosti a napsané knihovní funkce. K nejvíce používaným nezávislým procesorovým rodinám patří:
Všechny procesory této rodiny jsou 32bitové. Na základě této rodiny procesorů vyrábějí konkrétní mikrořadiče firmy Texas Instruments, STMicroelectronics, NXP Semiconductors, Atmel, Samsung, Intel a další.
Závislé procesorové rodiny jsou vyráběny jen jedním výrobcem. Mohou nabízet některé unikátní vlastnosti, díky nimž v jistých aplikacích má smysl jejich použití.
Vím, že výčet není zcela vyčerpávající, chybí zde například firma Freescale nebo Infineon, chtěl jsem uvést pouze příklady řešení návrhu procesorů v mikrokontrolérech.
Jak již bylo uvedeno, hlavním programovacím nástrojem se stává jazyk C/C++ doplněný o části kódu, napsané v jazyce assembler konkrétního procesoru. Hlavním nástrojem programátora je proto překladač jazyka C/C++ a assembler, doplněný o spojovací program (linker) a knihovník (librarian, archiver). Navíc je mnohdy k dispozici integrované vývojové prostředí (IDE Integrated Development Environment), které obsahuje editor a projektový manažer, usnadňující vytváření projektů, jejich správu. Tyto programové balíky bývají rovněž doplněny o podporu odlaďování, případně simulace procesoru.
Nejznámější samostatný C/C++ překladač spolu s assemblerem, spojovacím programem, knihovníkem a podporou odlaďování, je GCC, tedy GNU C/C++, a balík GNU binutils. Tento překladač pokrývá ohromnou škálu procesorů, a i když nepatří k nejlépe optimalizujícím překladačům, je více než dostačující. Navíc je zadarmo, a pokud pracujete na více procesorových platformách, oceníte znovupoužitelnost vašich znalostí, jako jsou direktivy a přepínače překladače, syntaxe skriptů spojovacího programu, standardní knihovník a ladicí program. Jelikož celý balík vznikl v prostředí UNIXových operačních systémů, bývá jako projektový manažer používán standardní UNIXový program make. GNU překladač lze však nalézt i jako součást několika integrovaných prostředí, jako jsou CodeSourcery (www.codesourcery.com) nebo například μVision firmy Keil.
Dalším důležitým integrovaným balíkem pro mnoho platforem je komerční IAR Embedded Workbench firmy IAR (www.iar.com). Tento program pracuje pod operačním systémem Windows. Jejich C/C++ překladač vyniká velmi dobrou optimalizací. Rovněž jejich spojovací program má některé unikátní vlastnosti, jako je například schopnost složitějších výrazů v externích odkazech různých programových modulů.
Z dalších systémů bych rád jmenoval již výše zmíněný μVision firmy Keil, MUITL IDE firmy Green Hills a například Cross- Works firmy Rowley Associates.
V tomto článku jsem se pokusil o nastínění výběru hlavních komponent dnešních embedded systémů a nástrojů pro práci s nimi. Dle mého názoru je skutečně u mnoha embedded systémů klíčový výběr hlavní součástky, což bývá mikrokontrolér tak, aby systém byl maximálně levný, ale ne na úkor výkonu a množiny vlastností. Rovněž bych znovu upozornil na to, že dnešní mikrokontroléry obsahují velikou množinu poměrně komplexních periferních obvodů, a velká část rozhodování o použití toho kterého mikrokontroléru by měla brát do úvahy právě hardwarové funkce daného systému a jejich realizaci pokud možno integrovanými periferními obvody. Navíc je dobré při návrhu mít nějakou rezervu v technických prostředcích, protože jak praví poučka: „Poté co zadavatel sdělí své definitivní a konečné požadavky na systém, za týden Vám přidá další funkce a požadované vlastnosti“.
V příští části se budu věnovat programovacím technikám při programování embedded systémů.