Začínáme s dsPICem (3) - bootloader

V tomto článku se podíváme na to, jak funguje bootloader (zavaděč programu) a co vše je potřeba udělat pro jeho zprovoznění na procesorech dsPIC.

Pokud nějaké zařízení obsahuje jednočipový mikroprocesor, musí tento procesor být také vybaven softwarem, aby mohl vůbec vykazovat nějakou činnost. Takovému specializovanému softwaru obvykle říkáme firmware. Je to proto, že ho zpravidla vyvíjí a do procesoru instaluje přímo firma vyrábějící dané zařízení a samotný uživatel s tím nemá nic společného. Dříve tomu tak skutečně bylo a změna firmwaru uloženého zpravidla v paměti EPROM se dala realizovat jen ve specializovaných servisech takových elektronických zařízení.

V době rozvinutého Internetu a stále výkonnější elektroniky jsme si už ale zvykli na to, že čím dál větší počet zařízení (základní desky počítačů, PDAčka, digitální fotoaparáty, mobilní telefony atd.) nabízí možnost si z Internetu stáhnout nejnovější verzi firmwaru a bez nutnosti navštěvovat servisní středisko si ho do zařízení jednoduše nahrát.

Jak takový upgrade firmwaru funguje? Především musí být firmware v nějaké čistě elektricky přeprogramovatelné paměti (paměť typu EPROM bylo nutné před programováním mazat UV světlem). Další podmínkou je, že zařízení musí mít někde uložený jednoduchý program, který dokáže nový firmware odněkud natáhnout a nahrát na správné místo paměti. Způsobů, jak se toto řeší existuje více. Například nový BIOS pro motherboardy počítačů se zpravidla nahrává pomocí malého programu zavedeného z diskety, různé síťové prvky jako routery atd. mívají nahrávání řešeno pomocí ovládacího webového rozhraní prostřednictvím sítě, USB zařízení bývají řešena tak, že se někam na USB disk uloží příslušný soubor a na zařízení se jen aktivuje update a podobně to mívají zařízení, do kterých se vkládá nějaká paměťová karta.

Řešení u procesorů PIC

U procesoru dsPIC lze update firmwaru řešit například napsáním malého prográmku, tzv. bootloaderu, kterému je schopna nový firmware poslat po sériovém portu odpovídající aplikace z počítače PC. Prohledáme-li Internet, zjistíme, že bootloaderů pro procesor dsPIC existuje hned několik a dokonce jsou k dispozici zdarma, takže takovou dvojici programů (PIC - počítač PC) nemusíme vymýšlet, stačí jen do procesoru nahrát PICovou část a na počítači spustit tu počítačovou. Samozřejmě bootloader sám sebe do procesoru dostat neumí, takže nezbývá než ho tam nahrát klasickým programátorem.

Některé dostupné bootloadery

Microchip

První bootloader najdeme přímo na stránkách výrobce dsPICu firmy Microchip. Je popsaný v Application Note AN1094 a můžete si ho odtamtud stáhnout samozřejmě včetně zdrojových kódů. Bootloader je určen pro všechny procesory PIC, které umí přepisovat paměť programu, tedy všechny členy rodiny PIC24, PIC30 a PIC33. Data se posílají sériovým portem.

Pro zajímavost firma Microchip má také verzi bootloaderu pro procesory, vybavené sběrnicí CAN (popisuje to AN247 a AN851). Tato sběrnice se používá zejména v moderních automobilech pro propojení jednotlivých elektronických zařízení, takže je pak možné nahrávat firmware nějakého zařízení zabudovaného v autě, aniž by bylo potřeba ho vymontovávat.

Ingenia

Další bootloader nabízí španělská firma Ingenia, která se zabývá výrobou zařízení pro řízení motorů. Také jejich bootloader se dá stáhnout se zdrojovým kódem části pro procesor dsPIC. Část pro Windows se dá také stáhnout, ale již jen bez zdrojových kódů. Tento bootloader má velmi pěkně propracovanou Windowsovou část, automatickou detekci rychlosti sériového portu a přehlednou dokumentaci. Nicméně část pro porcesor dsPIC je zbytečně velká.

Tiny bootloader

Třetím a dle mého soudu nejlepším bootloaderem je Tiny Bootloader jakéhosi rumunského amatérského autora. Je velmi jednoduchý, dobře promyšlený a jak jeho název napovídá opravdu velmi malý. V paměti procesoru PIC totiž zabírá pouhých 100 instrukcí! Rozhraní pro počítač je sice na pohled jednodušší, ale skýtá všechny potřebné funkce, a je pro uživatele velmi příjemné.

Jak bootloader funguje?

Poslední výkonné rodiny procesorů PIC mají možnost programování RTSP (Run-Time Self-Programming), a proto bootloader může být normální spustitelný program sídlící v části paměti programu, kterou sám přepisuje metodou RTSP. Samozřejmě si nesmí "pod sebou podřezat větev" tím, že by se sám přepsal.

Nejjednodušší způsob, jak toto ošetřit je umístit bootloader až na úplný konec paměti programu. V případě Tiny bootloaderu tam tedy zabírá posledních 100 instrukcí a proto maximální velikost našeho uživatelského programu, který budeme do procesoru chtít nahrávat bude muset být o těchto 100 instrukcí kratší, než kolik maximálně umožňuje daný typ procesoru. Toto je vpodstatě jediná nevýhoda použití bootloaderu. Ovšem vzhledem k tomu, že procesory dsPIC mají paměť pro cca 4000 nebo 8000 instrukcí, není toto omezení nikterak závažné.

Dobrá, bootloader tedy leží na konci paměti programu. Ale jak ho tam spustit? Jedinou možností, jak v procesorech dsPIC spustit po resetu program je umístit na adresu 0x000000 instrukci GOTO <adresa jeho začátku>. Tím tedy máme zajištěno spuštění bootloaderu po resetu procesoru PIC.

Organizace paměti s bootloaderem Problém je ovšem v tom, že jakmile bootloaderem nahrajeme do procesoru svůj vlastní program, budeme chtít aby se po resetu spustil právě on. Pokud přepíšeme pozici 0x000000 vlastní instrukcí GOTO, spustíme sice hravě náš program, ale už se nám těžko podaří někdy v budoucnu znovu spustit bootloader.

Naštěstí tento problém, jak ilustruje obrázek, Tiny bootloader řeší elegantním způsobem. Pro "uživatelskou" instrukci GOTO má vyhraženu poslední paměťovou pozici před svým začátkem. Instrukce na adrese 0x000000 tedy vždy skáče na bootloader. A teprve bootloader po uplynutí nějakého časového intervalu, kdy se nic neděje, skočí na adresu těsně před svým začátkem, kde je instrukce GOTO <uživatelský program>. O to, aby se adresa startu správně přesunula (z pozice 0x000000 na pozici těsně před bootloader) se navíc stará windowsovská část bootloaderu, takže při vývoji naší aplikace na to vůbec nemusíme myslet a kompilujeme jí tak, jako by v procesoru žádný bootloader nebyl (pouze s omezením velikosti viz výše. Také pokud se třeba po vlastním vývoji rozhodneme aplikaci do procesoru nahrát klasickým programátorem již bez bootloaderu, bude bez nutnosti jakéhokoliv zásahu nebo překompilace ihned fungovat.

Příprava bootloaderu

Bootloadery jsou na Internetu k dispozici ve zdrojovém kódu nejen proto, aby uživatel věděl, co si vlastně do procesoru nahrává, ale i proto, že je zpravidla potřeba je před nahráním přizpůsobit použitému typu procesoru a cílové aplikaci, a teprve takto upravené zkompilovat a do PICa programátorem naprogramovat.

Parametry, které je třeba upravit u Tiny bootloaderu jsou následující:

  • kmitočet použitého krystalu a režim hodin
  • nastavení dalších konfiguračních registrů procesoru
  • nastavení přenosové rychlosti sériového portu
  • výběr běžných/alternativních pinů pro sériový port
  • timeout bootloaderu, po kterém se spustí uživatelský program

Kmitočet krystalu, režim hodin a další konfigurační registry

Procesory dsPIC umožňují v režimu RTSP i zápis do konfiguračních registrů procesoru. Není to ale úplně triviální postup a kód bootloaderu by se jeho umožněním zbytečně prodlužoval. Navíc by to byla operace dost nebezpečná, protože například právě přepsání hodnot režimu činnosti oscilátoru (ale i jiných nastavení konfiguračních registrů) by mohlo bootloader zcela znefunkčnit. Z těchto důvodů Tiny bootloader možnost pozdější změny konfiguračních registrů v rámci uživatelského programu nemá implementovanou.

Proto je třeba nejdříve rozmyslet jak budou konfigurační registry nastaveny v cílové aplikaci, a právě tak je nastavit přímo ve zdrojovém kódu bootloaderu.

Pozn.: Přenastavení konfiguračních registrů v uživatelské aplikaci je bootloaderem prostě ignorováno, takže žádné pozdější nebezpečí nehrozí.

Přenosová rychlost sériového portu a použité piny

Varianty propojovacích kabelů Je vhodné nastavit dostatečně rychlý přenos, aby programování procesoru netrvalo dlouho. Na druhé straně příliš rychlý přenos má větší nároky na kvalitu použitého kabelu, jeho délka nesmí být velká a přenos může snadněji podlehnout vnějšímu rušení. Jako rozumný kompromis volím obvykle přenosovou rychlost 38 400 Bd.

Je třeba si také uvědomit, že přenosová rychlost je odvozena z kmitočtu hodinového signálu, Proto konstanty na začátku zdrojového kódu týkající se kmitočtu musí být nastaveny skutečně podle reality.

Alternativní piny sériového portu se, pokud je to potřeba, přepnou odkomentováním (odstraněním středníku na začátku) jediné instrukce ve zdrojovém kódu:

;    bset    U1MODE, #ALTIO    ;use alternate Tx/Rx lines

Na obrázku vlevo jsou dvě varianty sériového kabelu. Na straně počítače je na kabelu vždy samice, na straně desky je logičtější samec (spodní obrázek). V takovém případě kabel propojuje pouze zem (pin 5) a piny TX a RX (piny 2 a 3). Chcete-li použít možnost resetu prostřednictvím bootloaderu, je třeba navíc připojit pin 7 (RTS). Na obrázcích je toto propojení znázorněno čárkovanou čarou.

Na straně PC nezapomeňte na konektoru propojit piny 1, 6 a 4 a také piny 7 a 8.

Timeout bootloaderu

Timeout bootloaderu je čas, který uplyne od doby resetu procesoru do doby, kdy bootloader skočí do uživatelského programu. Během tohoto času musíme aktivovat windowsovskou část bootloaderu, aby došlo k přenosu nového souboru do procesoru. Pokud zvolíme dlouhý timeout, budeme mít sice hodně času na "kliknutí ve windowsech", ale na druhou stranu po každém resetu dsPICa budeme zbytečně čekat na spuštění našeho programu.

Timeout můžeme výrazně zkrátit díky tomu, že i windowsovská část bootloaderu má svůj timeout, po který se snažií skontaktovat s bootloaderem v procesoru. Nahrávání nového firmwaru se pak provádí tak, že se nejprve klikne ve windowsech a teprve pak se zresetuje PIC, který okamžitě skočí do bootloaderu a s windowsy se skontaktuje téměř ihned. Proto timeout může být velmi krátký.

Ještě lepší možností je využití signálu RST k resetu procesoru přímo z bootloaderu ve windows těsně po kliknutí na jeho nahrávací tlačítko.

 

Celý bootloader si nahrajte ze stránek autora upravte podle potřeb a zkompilujte. Pokud jste úplní začátečníci a nevíte si s úpravou a překladem příliš rady, můžete navíc použít níže vystavený soubor obsahující pouze zdrojový kód a přeložený hex soubor pro následující konfiguraci:

  • procesor: dsPIC30f3012
  • hodiny: krystal 7,3728 MHz, PLL 8x (hodiny procesoru 58,9824 MHz, výkon 14,7 MIPS)
  • sér. port: 38400 Bd, běžné piny
  • timeout: 3 s
  • další konfigurace: watchdog - off, MCLR - enabled

 

PřílohaVelikost
bootloader.zip9.05 KB