Seznámení s bootloaderem - jak funguje?

Zdravím.
Jelikož jsem se dostal k problému, jak do několika mých aplikací nahrávat program přes USB (>>RS232), dostal jsem se pochopitelně i křešení tohole problému.
Nikdy jsem bootloaderem nepracoval a mám jen povrchní představu o tom jak se to používá a jak to funguje. Zkoušel sjem pročíst datasheet, ale krom hromady chytrých řečí jak nastavit LockBity jsem nic moc nepochytil.
Vysvětlil by mi někdo prosím, jakým způsobem ten bootloader v praxi funguje?
Já vím jen, že při startu procesoru se začíná na resetvektoru na začátku bootloaderu, tj nejprve se spustí bootloader program. - Jak bootloaderprogram pozná, že je nyní žádán aby přeprogramoval FLASH? Tak jasné, třeba můlžu jeden I/O pin využít k přepnutí do režimu programování - dle toho identifikovat a aktivovat programovací režim v dané aplikaci. Přesně tohle je ale to, co udělat nemůžu. Jednak bych ty data chtěl taha po RS232 (Rx a Tx only, žádné další dráty). Jak tedy funguje v praxi to, že proceseor prostě běží a najednou je pomocí RS232 požádán o přeprogramování (update firmware) - nějak mi uniká, jak se tohle řeší. Viz třeba to neoblíbené arduino - prostě “na kliknutí” se tam nacpe nový FW. jak tedy zařídit, aby se procesor přepnul )nějakým požadavkem či co) do toho prograovacího modu?
To by bylo asi tak první, co mě napadlo.

To další bude už pro mě asi větší záhada. Jak funguje proces vlastního programování? PC (například) posílá po RS232 data a procesor je pomocí bootloader programu “sype” do FLASH. Popřípadě se potom provede verifikace.

A třetí část - naprogramovat si ten bootloader svůj. Assembler jsem už opustil (sice jsem jej dřív dosti podporoval a věnoval se mu, ale zjistil jsem že to není až tolik progresivní a že i v C se dá napsat dostatečně efektivní aplikace a u spousty aplikací s tím C není problém) - zajímá mě tedy řešení v C. Jaké jsou k dispozici na to knihovny (jsou-li nějaké), jak kompileru říct, že danou část kódu má umístit na vektor bootloaderu, atd; popřípadě kde čerpat informace o této problematice?

Pro případné všetečné otázky, jak budu mít vyřešenou stranu na PC - tak předem říkám, že s programem na PC si poradím, tam problém není. (doufám… jen se asi budu muset poprat s formátem intelhex)

EDIT: Jaký nejmenší procesor AVR má bootloader? Žádný menší než ATmega8 neni?

Díky, H

Ha, moc otázek najednou. :smiley:

Přepínání do bootloaderu se provádí 2 způsoby:
1.)Nastavením fuses - skočí do bootload sekce po startu
2.)Přímým skokem za běhu programu (jmp BOOTLOADSECTION)

Většinou se používá první způsob.
Pak záleží na samotném bootloaderu, jak je naprogramován.
Většinou čeká nějaký krátký čas na příjem sekvence z UARTU
a když nic nepřijde, tak skočí do běžného programu (jmp 0).

Samotný průběh programování je poněkud složitější.
Doporučuji tedy použít už některý z už existujících.
Na netu je jich plno. Stačí si vybrat.

Pokud vím BOOTLOADER mají pouze ATMEGY.

ATtiny nemaju akurat rozdelenu pamat na dve casti, to ale neznamena ze by sa do nich nemohol zapisat bootloader. Len treba mat zaskrtnutu spravnu poistku

vypis z ds:

Self-Programming the Flash

The device provides a Self-Programming mechanism for downloading and uploading program
code by the MCU itself. The Self-Programming can use any available data interface and associated
protocol to read code and write (program) that code into the Program memory.

K signalizaci vzdáleného programování by mělo jít také využít IO pin. Když na něm bude připojenej kondik, tak podrží logickou hodnotu i během resetu.

Něco jako “bootloader” by mělo jít dát do všeho, co má SPM instrukci, tedy i do tiny13. Tam bude spíš otázka, jesli se vejdeš.

S IntelHEX na AVR bys neměl mít problém, tam to dodržujou (na picech to není intel hex ani žádnej ze tří dalších, maj to nějaký poprasený).

Divous: První způsob? A častěji? Tak nějak o tom pochybuju. Spíš ten druhý. Většinou se flashuje na externí žádost, a ne že musíš pustit zařízení a ihned do něj posílat startup sekvenci. Aspoň takhle to vidím já.
jmp BOOTLOADSECTION - hlavně že jsem se ptal na céčko. Ale i tak díky.
Odpověď “Samotný průběh programování je poněkud složitější.” je značně neuspokojivá.
Stáhnout cizí kód a používat cizí aplikaci na flashování je nepřípustné.

Martin, piityy - díky, netušil jsem že tiny mají také SPM instrukci.

piityy: ten externí IO pin nechci, právě proto, že mám k dispozici jen RxD a TxD.

U toho externího pinu bys ho neovládal hw ale programově. Řekl bys programu, že se bude flešovat, on by nastavil onen pin (nabil kondik) a provedl reset. Po resetu by podle stavu pinu s kondikem bootloader kontrolu buď převzal sám, nebo ji předal základnímu programu.

Ohledně těch tiny - SPM mají, akorát pro ně asi nebude podpora v céčku.

Co se týká staženého bootloaderu - určitě by byl dobrý alespoň pro inspiraci. Atmel má i nějaký jednoduchý v aplikačních poznámkách. Zatím jsem to však neřešil, takže princip předávání kontroly nad procesorem neznám.

Jo takhle si to myslel s tím pinem - už chápu.
Ale obě varianty mají jeden háček:
u varianty s kondíkem musí procesor SW vyvolat reset (dobře, další I/O pin pověsit na RST vstup) - imho už prasárna na druhou.
A u varianty jiné je potřeba v C provést zmíněné JMP na vektor bootloaderu.

Jak tedy v Cčku lze vyvolat skok na bootloader sekci, případně obráceně, skočit na adr 0? (SW vyvolat reset)
Pomocí inline kodu v ASM? (Nebo to jde elegantněji a je na to C nějak uzpůsobené, třeba pomocí nějaké fce která tohle sama umí)?

Ty tiny zatím řešit nebudu, pro daný účel co potřebuju mi vyhovuje ta atmega8 - dostatek vývodů.
Je někde k mání ta aplikační poznámky? Já nidky nervím, zda někde existuje jejich kompletní (tématický) seznam, hledám to dycky jak tupec.

O tom nepochybuj. drviva vacsina bootloaderov na webe a ze ich je pozehnane. namatkovo

chip45boot
cvmegaloader
fast_bootloader
bootloader_atmega8
tiny_13_updater
unibootloader
wiznet
stk500_bootloader

vsetky ktore som pozeral riesia iba to, ci sa nema nahodou procesor preprogramovat po restarte. Neriesia to, ako sa hlavna aplikacia do bootloadera prepne. Jednoducho maju na dosticke tlacitko na resete, spusita bootloader v PC, stlacia tlacitko a uz idu. Zmysel to pre nich ma ten, ze nepotrebuju programator ak sa hraju so zariadenim na stole. To je motivacia vzniku vacsiny bootloaderov (nech uz toto slovo znamena cokolvek)

Ak by sa zariadenie malo na zaklade vlastneho aplikacneho sw do bootlovacej casti aj dostat, to je pre nich komplikacia ktora im berie z flash samotnej aplikacie a musia na nu mysliet pri jej tvorbe (aby tam mali spravne prislusne kusy kodu). To je pre nich obtazujuce a z ich pohladu zbytocne.

To znamená, že se většina zařízení programuje tak, že se k tomu využívá RST tlačítko?
Grrr, to se mi nepáčí. Na daný účel by se mi hodilo dělat to přes tu SW žádost.
Ale klidně vyzkouším i jiný BL. Zaujal mě ten stk500-bootloader. Skoro podle názvu byhc řekl, že by to mělo jít flashovat z AVR studia - či ? To by bylo úplně ideální na jeden pokus do školy…
Zkusím si o tom stk500BL něco najít.

EDIT: Nebo kde konkrétně jsi o tom stk500_bootloader něco četl? Zajímala by ě právě ta možnost to flashovat přímo z AVR studia - ten snad tuším něják podporuje STK500 či co.
Popřípadě by se mi možná ještě hodila rada, jak se s tím bootloaderkodem má zacházet - jak ho dostat do procesoru, atd. (pokud t jinde nenajdu vysvětlené jak pro blby :slight_smile: )

Venovat pin na “externy reset”? Dobré :slight_smile: :slight_smile: :slight_smile:

sorry…

normalne skoc na reset vektor a potom v slucke cakaj definovany cas ci nieco cez RX nepride. Nema zmysel mat stlaceny dlho reset. Tym sa vobec nic neriesi. Pocas stlaceneho resetu mas akurat nativne aktivovany interny bootloader cez SPI, o ktory v tomto pripade evidentne nejde.

uryvky z rozsiahlejsieho cyklu


// konstatny potrebne pre preprogramovanie stanice
#define TIMER_PRG_PREPROG 4 // v nasobkoch 500ms, cas ked sa otestuje EEPROM, ci netreba nieco preprogramovat
#if (PROCESOR == up_mega32)
	#define BEGIN_BOOTLOADER 0x3800 // 2048 words bootloader
#elif (PROCESOR == up_mega324)
	#define BEGIN_BOOTLOADER 0x3800 // 2048 words bootloader
#elif (PROCESOR == up_mega644)
	#define BEGIN_BOOTLOADER 0x7800 // 2048 words bootloader
#elif (PROCESOR == up_mega128)
	#define BEGIN_BOOTLOADER 0xF800 // 2048 words bootloader
#else 
#error "neexistujuci procesor !!!"
#endif

//...

volatile static void *ukazatel = NULL;


//...


if ((pole_boot[0] == 'W') && (pole_boot[1] == 'R')) {
   // ak sa nacitalo 'WR', potom skoc na zaciatok
   ukazatel = (void *)BEGIN_BOOTLOADER;

// šup, a uz bezi bootloader, ktory si tam predtym naprogramoval nejakym programatorom
   goto *ukazatel;
}



// ak by si chcel efektivne v GCC skakat v ramci programu 
// (napriklad pri efektivnom riadeni skokov v programe miesto pouzitia mnohonasobneho switch)
// tak to sa robi napr. takto

void fn_hociaka(void)
{
   static void *ukazatel = NULL;


//...

    if (ukazatel != NULL) {
        goto *ukazatel; 
    }

         // bla bla bla part I.
	ukazatel = &&navestie1;
navestie1:

       if (!(podmienka1)) return;

       // bla bla bla part II.

	ukazatel = &&navestie2;
navestie2:

       if (!(podmienka2)) return;

       // bla bla bla part III.

	ukazatel = NULL;
   return;
}

ako nastavit adresu pri tvorbe bootloadera sa dozvies z prilozeneho obrazku
nastavenie_pre_bootloader.JPG

No a? Ak to tym ludom vyhovuje (a evidentne vyhovuje, inak by to tak nerobili) preco nie. Mozno to povazovat za bezpecnostne opatrenie a hlavne nemusia sa starat pri vyvoji aplikacie aby tato obsahovala kod potrebny na prepnutie do bootloadera.

Tie bootloadery som zbieral niekedy na pomedzí rokov 2005-2007. V podstate ma moc nezaujimali a ani som ich neskusal a netestoval, iba som z niektoreho z nich okopcil kusok C-cka pre palenie do Flash. Ale v podstate to zodpoveda datasheetu, tak len pre istotu sa oplati skontrolovat, ci to clovek dobre z neho pochopil. Zbytok som si spravil sam na svoj obraz.

Inak, tiez mi maximalne nevyhovuje pouzivanie reset tlacitka.

Pokud budu psát bootloader a dál ho zveřejňovat pr třetí osoby, tak pak třebas ten reset pin. Pokdu si to dělám do své aplikace, tak byhc pak nevedl diskuze, o tom, zda tam udělat msítečko, které bude aktivovat ten flashovací režim. Zde je to myslím jasné.

Na ty první pokusy mi bude ale asi stačit to reset tlačítko.
Kde se dá něco sehnat o tom bootloaderu STK500? Programovat to rovnou z AVR studia by se mi právě naprosto skvěle hodilo - teda pokud to jde.
Kde se dá stáhnout nějaký ten zdroják/popis/etc ? (Můžeš mi to prosím poslat?)

Na sw resetování procesoru používám WDT. Mimochodem - skok na vektor resetu (adresa 0x0) nemá s resetem nic společného a právě o tom se dá říct, že je to prasečina, která může být mimochodem nebezpečná pro okolní hw (v závislosti na jeho návrhu) a ne jen pro něj.

S tym suhlasim. Treba si dobre uvedomit, co chcem resetom alebo skokom na reset vektor dosiahnut. Ak je treba realizovat poctivy reset s nastavenim periferii na default, urcite by som pouzil piityy-ho riesenie.

Skok na adresu 0 jako ukončení běhu bootloaderu. Tohle jsme myslel.
A pro okolní HW nebezpečné? To byhc řekl že dost záleží co je to za HW. Banku LED diod to asi fakt neublíží.

Google google a zase len Google.

zadaj “bootloader STK500”.

Neviem ci to funguje podla Tvojich predstav, v zivote som to neskusal. Na take socialne experimenty jednoducho nemam cas :slight_smile:
Ja ani poriadne neviem co a naco STK500 je, tusim nieco priamo od Atmelu ale inak nic viac. Posielam co som volakedy stiahol.
stk500v2bootloader.zip (18.6 KB)

STK500 je řek bych standardizovaná metoda/protokol programování AVR čipů. Jako je STK200 programátor (pár odporů na LPT portu), tak STK500 by měl právě chodit přes RS232 (prostředník mezi PC a AVR)
Do googlu jsem psal jiný výraz, ale tohle na mě na první stránce nevypadlo. Tak zatím díky. Přes víkend to prozkoumám

Netvrdim, ze TO malo na teba na prvej stranke vypadnut. Poslal som ti to, co uz susim dlhe roky niekde hlboko na dne HD. Myslim, ze je to dost jasne aj z datumu vzniku suborov. Aktualny sw ti google rad pomoze pohladat. To sa tyka aj dalsich projektov.

Tak ti drzim palce a daj vediet ako si dopadol.

Už jsem si to zběžně pročetl, je to dobře komentované a docela přehledné. To chválím. Zkusím to pak rozchodit.
Divous - nevím co si měl na mysli tím, že je to složité. Nevím za koho mě máš, ale tohle mi jako složité nepřipadá. Pravda, sice jsme to nezkusil zatím napsat vlastní, ale viděl jsem podstatně horší věci než tohle.
Kdyby se tenhle bootloader osekal od toho STK500 protokolu, zbylo by tam pár řádků kódu.
Tak pánové, zatím díky za pomoc, po víkendu se ozvu, jak to dopadlo. NYní nebudu doma takže nebudu mít šanci si stím hrát.
Zatím zdar :slight_smile:

ja som nejaky botloader vypreparoval s ATMEGA8 chystama sa ho aj pouzit len nemam na to cas… upraveny program je tak že po privedeni napajania cakaka caa 4s na dany prikaz a ked nepride opusti sa rezim bootloadera a spusti sa program v procesore. Inak dost dlho to programuje ATmega8 s int osc 8Mhz …cez programator je to sekunda a cez botloader 30s