česky english Vítejte, dnes je pátek 19. duben 2024

Úvod do embedded systémů

DPS 3/2011 | Články
Autor: Petr Volný

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.

Definice embedded systémů

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ří:

  • několik čítačů/časovačů pro generování časových průběhů případně měření časových událostí,
  • obvody typu watchdog pro kontrolu správnosti funkce celého systému,
  • sériová rozhraní typu UART (Universal Asynchronous Receiver Transmitter),
  • sériová rozhraní typu SPI,
  • sériová rozhraní typu I2C,
  • PWM generátory,
  • A/D a D/A převodníky,
  • USB řadiče,
  • Ethernet řadiče,
  • DMA řadiče pro urychlení přenosu mezi operační pamětí a nějakým periferním zařízení,
  • šifrovací jednotky standardů DES, AES, MD5,
  • detektory poklesu napájení,
  • integrované radiové moduly.

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)

Obr. 1 Blokové zapojení procesoru (zdroj Texas Instruments)

Specifické vlastnosti embedded systémů

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:

  • Relativně méně výkonné procesory z hlediska jejich taktovací frekvence.
  • Málo operační paměti, typicky striktně rozdělené mezi paměť programů a konstant (paměti typu ROM, FLASH) a paměť pro data a zásobník (paměť typu RAM). Velikost takových pamětí se pohybuje od jednotek Kbyte až po stovky Mbyte.
  • Velké množství periferních obvodů různých typů, například časovače, sériové sběrnice různých typů, radiová a podobná rozhraní, displeje.
  • Snaha o minimalizaci spotřeby elektrické energie, schopnost pracovat na baterie.

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í.

Hardwarový návrh a výběr procesorů

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:

  • Tento přístup obecně vyčerpává zdroje systému, hlavně čas procesoru. Ten se pak nemůže věnovat dalším činnostem a tedy je fakticky omezen jeho výkon.
  • Není možno zaručit správný a očekávaný chod takto realizovaných funkcí, například rychlé časovače, měření času, přesné taktování sériové sběrnice na vyšších rychlostech nebo vzorkování analogových dat.

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:

  • instrukční soubor procesoru,
  • množina vnitřních registrů,
  • způsob zpracování přerušení a výjimek,
  • zkušenost a znalost programátora.

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)

Obr. 2 Cenové relace (zdroj Texas Instruments)

Typickými nevýhodami jsou:

  • Osmi nebo 16bitová architektura, z toho vyplývající malý adresný prostor (jednotky KB), který je pak často nahrazován různými technikami pomocí externích adresních expandérů, což vede například ke zcela specifickým programovacím technikám.
  • Dnešní algoritmy i v embedded systémech chtějí pracovat často s 32bitovou aritmetikou, což vede u jednodušších systémů k delším základním aritmetickým operacím.
  • Jednoduchý, málo flexibilní systém přerušení.
  • Neexistence jednotek ochrany paměti, tzv. MPU (Memory Protection Unit), které jsou hlídačem programů, zdali nepracují s daty mimo vymezený adresní prostor.
  • Malá množina integrovaných periferních obvodů.
  • Nemožnost nebo velmi omezená možnost realizace plnohodnotných programovacích technik, které používají překladače vyšších jazyků, jako jsou například rekurzivní algoritmy, lokální proměnné funkce, nebo nepřímo volané funkce (podpora automatové techniky realizace algoritmů).
  • Není implementován ortogonální instrukční soubor. Ortogonální instrukční soubor znamená, že ve všech instrukcích, které používají registr procesoru jako zdrojový nebo cílový operand, lze použít libovolný registr. Ortogonální instrukční soubor se vyskytuje prakticky u všech architektur typu RISC. Naopak tento není implementován v architekturách PIC, 8051 a kupodivu x86 a vyšších.

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.

Existující mikroprocesory pro embedded systémy lze rozdělit do 2 kategorií:

  • nezávislé procesorové rodiny,
  • procesorové rodiny jednoho výrobce.

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ří:

  • Rodina Intel 8051, někdy označovaná jako '51 nebo jen 51, základem je 8bitový mikroprocesor, vyvinutý společností Intel v roce 1980.
  • Rodina x86. Tato rodina je tvořena procesory řady Intel 8086/8088 nebo 80186. Je to 16bitový mikroprocesor s adresovacím prostorem 1 Mbyte.
  • Rodina x386. Tato rodina je tvořena procesory řady Intel 80386, 80486 a Intel Pentium v různých variantách. Jedná se o 32bitové procesory.
  • Rodina ARM. Tato architektura byla vyvinuta anglickou firmou Advanced RISC Machine (dříve Acorn RISC Machine). Je to dnes jeden z nejpoužívanějších procesorů na světě. Firma samotná nevyrábí žádný konkrétní procesor, ale prodává obvodové řešení procesoru jako tzv. makrobuňku pro ostatní výrobce polovodičů. Navíc se tato rodina dnes skládá z několika rozdílných architektur, jako jsou:
  • základní ARM/Thumb architektura,
  • ARM-Cortex-Mx (například hojně rozšířená varianta Cortex-M3),
  • ARM-Cortex-Ax (velmi výkonná architektura, včetně více procesorových jader v jednom čipu).

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ší.

  • Rodina MIPS. Jsou to 32 nebo 64bitové procesory, které svým výkonem patří mezi špičku v embedded systémech.

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í.

  • Rodina PIC, vyvinutá firmou Microchip Technology. Má zvláštní architekturu, která má 8bitovou datovou sběrnici a 12, 14, 17, nebo 24bitovou instrukční sběrnici.
  • Rodina MSP430. Firma Texas Instruments tento procesor prezentuje jako procesor s nejmenší spotřebou na světě.
  • Rodina TMS320, která se objevuje v DSP procesorech firmy Texas Instruments.
  • Rodina Renesas (bývalý NEC). Tato rodina obsahuje mnoho různorodých typů procesorů, od 8bitových až po 32bitové. Mezi 8/16bitové patří typy RL78, 78K, R8C nebo H8. Mezi 16/32bitové patří H8S, H8SX, M16C a RX. K 32bitovým patří V850 a SuperH. Zmíním se krátce pouze o typu RX. Je to nejnovější přírůstek firmy Renesas. Sám sebe identifikuje jako konkurenta k ARMCortex M3. Mezi významné vlastnosti patří integrovaná jednotka pro výpočty v plovoucí čárce.

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.

Vývojové nástroje pro programátory

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.

Závěr

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ů.