Portál AbcLinuxu, 8. května 2025 07:44

Dotaz: XMEGA bootloader bez preruseni behu hlavni aplikace

27.3.2020 21:44 RadekXxX | skóre: 9
XMEGA bootloader bez preruseni behu hlavni aplikace
Přečteno: 495×
Odpovědět | Admin
Ahoj, snazim se napsat bootloader, tak aby 1/2 aplikacni pameti obsahovala hlavni aplikaci a 2/2 aplikacni pameti byla jako "buffer" pro nove nahravanou aplikace pres bootloader, jakmile se nova aplikace nahraje, tak se pouze presune 2/2 do 1/2 a provevde skok na zacatek pameti, takze uzivatel ani nepozna, ze se provedla aktualizace, resil jsem to tak, ze jsem v hlavni aplikaci zapisoval data do flash, na konci skocil na bootloader, ktery jenom preklopil 2/2 do te 1/2, bohuzel jsem zjistil, ze v pameti zustane jenom ta boot sekce, jinak je vse smazane, pak jsem zjistil, ze SPM prikazy lze volat pouze z BOOT sekce. Take me napadlo to udelat takto:

- Vytvorit funkce FlashRead, FlashWrite, FlashErase, FlashDone(to presune 2/2 do 1/2 flash a skoci na adresu 0) a funkcim dat atribut boot sekce - Potom bych mel tyto funkce normalne funkcni a pristupne z aplikacni casti, takze bootloader bych resil primo z aplikace - Kdyz bych provadel update FW, tak bych HEX orezal po BOOT sekci a tuto cast bych posilal jako update

ale tet nevim, kdyz to jednoduse orezu, tak pravdepodobe jina kompilace programu, novejsi prekladac, optimalizace,.. tyto funkce bude hledat v pameti na jine adrese.

Je mozne to resit tak, ze pro kazdou funkci vyhradim atributem zvlastni sekci v boot prostoru a pak bude jasne, ze na te adrese je vzdy ta spravna funkce ? Nebo nad tim premyslim uplne nesmylsne a resi se to jinak ?

Dekuji za rady
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Jendа avatar 27.3.2020 21:55 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: XMEGA bootloader bez preruseni behu hlavni aplikace
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ano, takhle přesně to doporučovali v nějaké appnote.

Bootloader a hlavní appku kompiluju jako úplně nezávislé věci. Funkce v boot sekci můžeš buď linker skriptem přilepit na předem určenou adresu (což je trochu nepružné kdyby třeba nová verze té funkce byla větší a bylo by to potřeba posunout), nebo si na známou adresu dát jejich adresy a volat je přes ně. Určitě je nechceš volat z hlavní appky jménem a doufat že se to nějak pořeší při linkování, to se ti časem rozbije. Normálně si vymysli adresu, přetypuj ji na funkci a zavolej ji.

(disclaimer: xmega jsem nikdy nepoužíval, ale s atmegama jsem se vyblbnul dost)
27.3.2020 22:07 RadekXxX | skóre: 9
Rozbalit Rozbalit vše Re: XMEGA bootloader bez preruseni behu hlavni aplikace
No ja prave bootloader budu mit primo v hlavni aplikaci, takze ho nepotrebuji sestavovat v jinem projektu, jedna se me jenom o ty 4 SPM funkce. Takze pokud kazde funkci nastavim atributem jinou section v boot oblasti, tak je muzu z aplikace pod jejim jmenem volat libovolne i kdyz bude jina verze kompilatoru, linker, optimalizace, ...

Chapu to spravne ?
28.3.2020 10:32 RadekXxX | skóre: 9
Rozbalit Rozbalit vše Re: XMEGA bootloader bez preruseni behu hlavni aplikace
Takze funkcni reseni vypada takto:
void FlashErasePage (dword addr) __attribute__ ((section (".BootErasePage")));
void FlashWritePage (dword addr, byte * buf) __attribute__ ((section (".BootWritePage")));
...
Kazda funkce je na jine adrese v oblasti bootloaderu.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.