Logo distribuce AKANE

Embedded linux - mrňous mezi OS

Pojmem embedded systém se v počítačovém hájemství obvykle míní vysoce customizovaný (pokud ne přímo od píky napsaný) systém používaný na zvláštním (většinou miniaturním) hardwaru. Potíže při tvorbě takového systému spočívají zejména v nestandardních preiferiích a omezeném prostoru (paměťovém i diskovém) který je k disposici. Linux je zde přirozenou volbou: jeho hlavní předností je vysoká modularita a konfigurovatelnost, které mu umožňují přizpůsobit se podmínkám, ve kterých jiné OS bídně hynou.

Shodou okolností jsem se k tvorbě jednoho embedded systému připletl - než bych tedy trousil obecná moudra, budu se snažit popsat konkrétní řešení a problémy, které mě cestou potkaly.

Použitý hardware

Zadavatelem projektu byla firma MITE Hradec Králové, která také dodala veškerý hardware:

Cílový produkt (vystavovaný na AMPÉRu '99 v Praze) vypadal takto:

Plán cílové sestavy

Rozhraní mezi UCB/externím zařízením větrák-teploměr-ohřívací těleso zajišťoval jiný mně neznámý člověk mně neznámým způsobem - jako pesimista považuji za pozoruhodné, že ačkoliv jsme oba měli k disposici jen papírovaou specifikaci raw protokolu a funkčnosti, celý systém po spojení obou částí okamžitě a bez větších problémů fungoval po celou dobu výstavy.

Úvodní přípravná fáze zahrnovala vytvoření miniinstalace Linuxu a napsání aplikačních programů: Java applet komunikující po TCP/IP (zobrazování teploty, tlačítka "Zapni/vypni chlazení/ohřev"), TCP/IP multithreadového serveru (v Perlu) a vysílacích/přijímacích programů komunikujících po sériovém portu (v C).

Miniinstalaci jsem se rozhodl založit na jádru 2.0.36 a starých libc knihovnách (jsou asi o polovinu menší ne glibc). Z dalšího jsem do instalace zahrnul ořezanou instalaci Perlu (bezpochyby mrhání místem a výkonem, ale velice pohodlné na psaní i ladění) a několik základních utilit. Kvůli pohodlí jsem také nakonec zaměnil menší shell ash za komfortnější, ale naducaný bash.

V instalaci jsem ponechal řádkového klienta FTP (šťastná volba, jak se později ukázalo) a telnet. Ze serverů zůstal pouze apache, zkompilovaného s minimem modulů a nameserver bind. Určité problémy nastaly po experimentování s různými verzemi knihoven libc (systém občas posílal a občas neposílal když měl) ale nakonec se vše v dobré obrátilo (tímto děkuji Ondřeji "Feelovi" Filipovi za cenné rady stran knihoven a (un)mountování souborových systémů).

V jádru jsem nechal podporu NFS (nejjednodušší a nejmenší způsob jak zpřístupnit cizí disk). Původně jsem byl v pokušení nezahrnout podporu modulů, ale nakonec (opět částečně z vrozené lenosti) jsem používal modul pro síťovou kartu.
Po dokončení a odladění distribuce jsem si pořídil image celého systému (+-12MB) a začal s instalací na embedded systém.

Instalace embedded systému

Problémy na sebe nenechaly dlouho čekat. Po zapojení systému a pokusu nabootovat z diskety se počítač resetoval a odmítl dále pracovat. Po dvoudenním bádání (v podezření by zejména FLASH disk) se nakonec na webu objevilo řešení: Linuxové jádro se pokouší provést reset klávesnice, což se nestadardnímu keyboard controleru DIMM-PC nelíbí. Řešení bylo jednoduché - odkomentování jednoho #DEFINE ve zdrojácích (Tam také skončily moje naděje na snoubení systému s jádrem 2.2.x, neboť v něm je tato část zcela překopaná nějakým Martinem Marešem a svou oblíbenou konstantu jsem tam nenašel).

Z technické specifikace hardwaru dále vyplynulo, že FLASH disk (jehož jsem mimochodem podezříval neprávem, jeho IDE rozhraní fungovalo bezchybně) má omezený počer write cyklů - něco kolem 100 000, což by mohl být problém. Upravil jsem tedy startovací skripty tak, aby po nezbytných zápisech při inicializaci systému (mtab a spol.) přemountoval kořenový filesystém na read-only (tím také odpadla potřeba používání update). Notorické "zapisovače" (bind a apache) jsem odkázal do patřičných mezí linkem na /dev/null, pro informace které mají alespoň minimální hodnotu (PID a spol.) jsem vyhradil zhruba 200kB ramdisk s možností ukládání cenných informací na disk při shutdownu (nevyužito). Systém neměl swap, kořenový filesystém používal ext2fs, původně minix. Akane Linux se vším všudy zabíral nakonec necelých 10MB (9.64MB).

Funkčnost systému byla následující: Po startu systému a démonů se nastartoval naslouchač na COM portu, propojený přes STDOUT s perlovským TCP/IP serverem. Přes COM přicházely v pravidelných intervalech informace o teplotě na čidle a stavu periferií, které server předával klientům (byli-li jací). K disposici byl zejména javovský applet a v omezené míře i řádkový klient pro linux. Pokud teplota ležela ve stanovených mezích, bylo možné zapnout či vypnout chlazení či ohřev, pokud se čidlo dostalo do "kritických mezí", vyslalo zprávu o zablokování systému a řídilo teplotu ve vlastní režii dokud se nesrovnala na normál.

Aplikace v praxi

To vše je samozřejmě jen vystavovaný produkt, nepříliš užitečný komukoliv nebo čemukoliv. Praxe může být řádově obtížnější - jednak co se týče logiky aplikací, jednak pro rozdíly vývojové desky od "skutečného" embedded systému. Ten totiž nedisponuje floppy rozhraním a v pokročilejší verzi ani klávesnicí či VGA kartou. Instalace je pak o něco komplikovanější (navíc, kvůli výrobě v malých sériích, ji musí být schopna vykonat i minimálně zaškolená osoba):

Vize do budoucna

Uplatnění takovýchto systémů je široké, možnosti nepřeberné. V nejbližší době vyvstal plán embedded minirouteru/firewallu pro provozní LANy - za tímto účelem bude třeba dále zmenšit objem systému (cílový počítač je 386SX/33, 8MB RAM/8MB FLASH disk); doufám že při zachování funkčnosti bude možné stěsnat OS pod 5 MB.

Co se týče dalších plánů: V potaz přichází aplikace real-time RT-linuxu pro uplatnění embedded systémů v časově kritických aplikacích (systémy pro nemocnice ap.), ale nechme zatím vize vizemi...


Autorem tohoto dokumentu je Jan Liška, <lisak@infonet.cz>. Dokument vznikl v rámci Semináře Linux, vyučovaného na MFF UK, 20.5.1999