Bascom - Bootloader

Mi az a bootloader?

A bootloader egy olyan kis szoftver, ami a mikrokontroller külön dedikált programmemóriájában helyezkedik el (ún. BootBlock-ban). Gyakorlatilag a program flash memória egy része. A kommunikáció a kontroller perifériáin keresztül valósul meg, így lehet például RS-232, SPI-busz, I2C-busz is a bootloader külvilági kapcsolata. Feladata pedig a programmemória egyéb területén lévő tartalom megváltoztatása a külső tartalomnak megfelelően.



ATMega32 flashmemória-szerkezete

Mégis, mire alkalmas?

Ha a processzort programozzuk, akkor valamilyen hardvereszközt rá kell csatlakoztatni a célprocesszorra és ezen keresztül letölteni az új programot. Ehhez kell egy PC, programozó-hardver meg egy „mérnök” ajánlott, aki ezt elvégzi. Legalábbis a laikusok szemével nézve. A bootloader teszi lehetővé, hogy a programozó-hardvert megússzuk, csak a hagyományos külvilággal kommunikáló felületet vegyük igénybe - mely a legtöbb esetben egy RS-232 vagy USB-soros port. A bootloader a programot beolvassa és a mikrokontroller flash programmemória részébe beírja.

Mi a bootloader haszna?

A bootloadert sok helyen fel lehet használni. Gondoljunk csak az alaplapok BIOS frissítésére. Külön előny, hogy a bootloaderbe dekódoló algoritmust is beépíthetünk, így a lefordított forrás programállományt nem kell a felhasználónak odaadni. Így akár azt is megússzuk, hogy visszafejtse a programot és így kikerüljön a kezünkből az irányítás.

Kinek van szüksége a bootloaderre?

A bootloadereket a való életben nagyon sok helyen használjuk. Ilyenek a teljesség igénye nélkül például a mobiltelefonok, PDA-k, számítástechnikai eszközök - de akár egy mosógép is. A gyártóknak érdeke, hogy a felhasználó önmaga is fel tudja az új programot tölteni a megvásárolt eszközére és ne a szervizt keresse, mert például speciális programozó hardverre van szüksége hozzá. A felhasználónak nem kell biztosítani sem a visszafejtést, sem a szoftverfrissítés lelkivilágának ismeretét.

Az eljárás igen egyszerű: a felhasználó letölti az internetről a mobiltelefonjához való szoftverfrissítést; csatlakoztatja a PC-jéhez USB vagy RS-232 porton keresztül. A PC oldali szoftvert elindítja, majd a telefonon aktiválja a bootloadert (általában ki, majd bekapcsolással). A telefonban levő bootloader a PC-vel kialakít egy kapcsolatot, beolvassa az új szoftvert, dekódolja, a flash programmemória alkalmazói részére beégeti. Utána a készüléket ki-, majd bekapcsolva az új szoftverrel indul el.

Alapkapcsolás

A legegyszerűbb alkalmazáshoz nem sok minden kell. Csak, mint egy hagyományos RS-232 porthoz. Azaz egy szintillesztő MAX232 chip és körítése (lásd a RS-232 fejezetet). Illetve berakható még egy LED visszajelzési céllal, hogy lássuk, hogy valami történik a chipben.

Az RS-232 illesztő helyett akár USB-soros átalakítót is használhatunk, mint az Arduino áramkörök esetén. 

A bootloader használata

A használat nagyon egyszerű. Bármilyen hagyományos programozóval be kell égetni a lefordított bootloadert (lásd később) a chipbe. Ezután meg kell a chipen jelölni, hogy bootloader van benne, valamint meg kell adni a bootloader méretét. Így a bekapcsolási indításkor nem a $0000 címen indul kontroller, hanem a bootloader címén. Fontos! A bootloadernek - ha nincs programfrissítés - akkor észrevétlennek kell maradnia, azaz a vezérlést tovább kell adnia a $0000 címre.

Bootloader program

Fontos! Nem minden AVR chip rendelkezik bootloader lehetőséggel! Az ATTiny chipek egyike sem, illetve az ATMega48-ba sem került implementálásra. A chip használata előtt ezt az adatlapjában mindenképp érdemes ellenőrizni!

A legegyszerűbb valamely kész bootloader programot használni, mint nulláról megírni egyet. Ez legtöbbször ASM illetve C nyelven (ASM betétekkel) készült. Az ASM nyelvben található a belső programmemória író-olvasó rutinja, ezt magas szintű nyelven nem lehet elérni. Szerencsére a Bascom-AVR a mintakönyvtárában tartalmaz több, soros portos bootloader alkalmazást (pl. bootloader.bas néven). A régebbi (1.11.8.1 előtti Bascomban található) boot.bas állomány nagyrészt beágyazott ASM sorokból áll, így ennek elég nehéz a testreszabása.

A bootloader.bas állományban a kontrollert kiválasztjuk, majd lefordítjuk a programot. A program méretén ne csodálkozzunk, hisz a flashmemória végén helyezkedik el a boot-block! (Ha a forrásállományba belenézünk, láthatjuk, hogy a bootloader határáig elérve csupa FF-t találhatunk (azaz a chip üres). Az így kapott hexadecimális program-állományt a célprocesszorba égessük be bármilyen hagyományos programozóval (STK200, TavIRisp, STK500, TavIR MKII, stb.). Ezután a biztosítékbiteket beállítjuk a bootloader programnak megfelelően:

 

 

Itt figyeljünk a bootloader méretére, a reset esetén teendőre illetve arra, hogy a kontroller órajel forrását se felejtsük el kiválasztani!

A bootloader és a PC közt ún. Z-modem protokoll szerint épül fel a kapcsolat. A bootloader-PC közti sebességet érdemes a leendő főprogram sebességével egyezően megadni. Így a hibás, sérült kommunikációs adatáramlást a legkönnyebb elkerülni. A bootloader sebességét a flash memória írási sebessége és a sorosport sebessége határozza meg. Kb. 9600 bps esetén a bejövő adatsebesség megegyezik az égetési sebességgel.

Beégetés után közvetlenül csak a bootloader fut a kontrollerünkben - állandóan újra és újra elindulva.

A Bascomban megírva egy rövid programocskát (bootnext1.bas), le is tesztelhetjük a működését. Ilyen egyszerű program például:

Do
   Print "test"
   Waitms 1000
   If Inkey() = 27 Then
       Print "boot"
      Goto &H1C00      ’Bootloader address
   End If
Loop

Ezt lefordítjuk, majd a Bascom-AVR-ben a programozónak a Bootloadert választjuk ki. Így ennek segítségével programozzuk a chipünket (a Serial fülön a sebességet és a soros portot, míg az MCS Loader fülön a RESET jel engedélyezését/tiltását állítsuk be!).

 

A programozás elindítása után (F4) a bootletöltő jelenik meg és a chipbe kerül a program.

Önálló letöltő

A bootloader használatához nem lenne szerencsés feltelepíteni a teljes Bascom-AVR csomagot az ügyfél gépére. Ezért a www.mcselec.com oldalon elérhető az önálló bootletöltő.



Ennek használata során a soros portot és a sebességet elegendő megadni. Kis trükkel élve, itt a DSR láb segítségével a chipet resetelik, hogy ne kelljen a felhasználónak ezzel (is) foglalkoznia. Ez persze (mert direkt lábhozzáférés kellene a portlábhoz) nem működik minden esetben. Például USB - RS-232 átalakítók egy részénél sem. Valamint, ha már meglévő hardvert szeretnénk használni ilyen célra, az is problémát okoz. Fontos! A terminálprogramok egy része (ilyen pl. a Windows beépített Hyperterm programja is) a COM portos kapcsolat felépüléskor - hiába van beállítva az átvitelvezérlés nincs-re - a port nyitásakor a DTR jelet megváltoztatja és így a chipet RESET állapotban tartja!

Ha megfigyeljük a bootloader működését, akkor RESET után a soros porton a letöltő a #123 illetve a #124 kódot küldi a céleszköz felé (flash vagy EEPROM programozásának kiválasztása), amire az válaszolva lép be a bootloader a megfelelő részprogramjába. Ezt saját célra is ki tudjuk használni:

A főprogramunkban ellenőrizzük, hogyha #123 vagy #124 kódú karakter érkezik, akkor a chipet saját magunk indítsuk újra illetve a vezérlést adjuk át a bootloadernek.

Erre a következő megoldás lehetséges: az előzőekben megírt programot módosítva (bootnext2.bas):

   Do
      Print "test"
      Waitms 1000
      If Inkey() = 123 Then
         Print "boot-123"
         Goto &H1C00’BOOTLOADER Address
      End If
      If Inkey() = 124 Then
         Print "boot-124"
         jmp &H1C00      ’Bootloader address
      End If
   Loop

Mind a jmp cím, mind a goto cím utasítás az adott programcímre való ugrást jelenti. Itt a cím a bootloader elejét jelenti.

Az újraindítást akár a watchdog segítségével (lsd. 21. fejezet: Energiatakarékos módok (Sleep, wake-up, watchdog)) is megvalósíthatjuk (bootnextwd.bas). Ennek előnye, hogy minden bootloaderes chip esetén működik, nem kell mindig átírni a bootloader kezdőcímét.

   Config Watchdog = 1024
   Stop Watchdog
   $baud = 9600
   Do
      Print "test"
      Waitms 1000
      If Inkey() = 123 Then
         Print "boot-123"
         Start Watchdog
         Stop
      End If
      If Inkey() = 124 Then
         Print "boot-124"
         Start Watchdog
         Stop
      End If
   Loop

A letöltés folyamán a következő ábra tájékoztat a folyamatról:

Eredmények

A bootloader használatával több mindent nyerünk, úgymint:

  • nem szükséges külön programozó hardver,
  • gyorsabb programozás,
  • rugalmasabb illetve kényelmesebb programfejlesztés,
  • kisebb programmemória.

A gyorsabb programozás nagyobb program állományoknál jelentős. Az ATMega16 chip esetén 13 kbyte programkód letöltése 1 percnél rövidebb időt vesz igénybe, míg a hagyományos ISP programozással ez rossz esetben a ~2,5-3 percet is elérte!

A kisebb programmemória a bootloader elhelyezkedéséből következik, ugyanis a program memória felső végéből csípődik le. Erre fontos, hogy figyeljünk, mert a bootloader elejének felülírása a bootloader újraprogramozását vonja maga után! Ennek kivédésére a Bascomban a $loadersize = direktíva szolgál, melynek segítségével a túlméretes program fordítása esetén figyelmeztetést kapunk.

Fontos! A Bootloader használata után a memória már mindenféle adattal szennyezett lehet. Azaz induláskor használtuk a SRAM területet. A Bascom lefordított főprogramban, ha valamely változót használunk (azaz egy kiosztott SRAM memóriacímet), lehetséges, hogy a bootloader által már otthagyott „szemét” van benne! Fontos, hogy minden egyes változónak, illetve használt rendszerrésznek (pl. PWM, TIMERx, stb.) adjunk kezdőértéket! Nem bízhatunk abban, hogy a rendszer inicializálja a memóriaterületet! (A Bascom 2.0.7.5 illetve Bascom 1.11.8.8 esetén a változók alapértéke 0. De az ördög sosem alszik, inkább legyen picit hosszabb a program, de a későbbi fordítók is működjenek vele.) Ha nem akarunk memóriatörlést, akkor a Bascom-AVR programban a $noramclear utasítással kényszeríthetünk ki ilyen működést. A biztos törlést megvalósíthatjuk például:

   Dim A As Byte
   A = 0            ’0. SRAM hely, biztosan használt

Fontos! A bootlader készítéséhez Bascom-AVR regisztrált változata szükséges! 

TavIR-Facebook