Přeskočení instrukce

Načo je program 2x v pamäti?

Nie je lepšie progam preniesť cez sériovú linku, nahrať ho napríklad do SPI Flash alebo EEPROM, skontrolovať všetky CHS a CRC a keď je všetko v poriadku tak z tej EEPROM prepísať do reálnej programovej pamäte?

Ja to robím na ATmege tak, že

Po reštarte sa vždy najprv spustí bootloader.
Ten si overí či má bežať na základe nejakých dvoch bajtov v pevnej pamäti. Ak nemá, spustí samotnú aplikáciu.

Ak bežať má, potom beží a očakáva príjem častí hlavného programu. Ten sa cez protokol posiela v 128B balíkoch. Súčasťou balíka samozrejme je, kam sa má do pamäte uložiť.
Tento prístup umožňuje meniť len tie časti programu, ktoré sú od predchádzajúcej verzie zmenené. Respektíve ak nejaký balík neprejde, dá sa prenos zopakovať samostatne.

Ak je všetko čo malo byť zapísané aj zapísané, potom sa bootloaderu povie, že má spustiť hlavný program.
Ten sa spustí.
Hlavnému programu sa povie, aby zas prepol na bootloader. Ak to spraví a Master dostane hlášku že beží bootloader, zapíše sa do EEPROM, že hlavný program sa môže spustiť hneď od začiatku. Po každom ďalšom reštarte teda bootloader hneď spustí hlavný program.

Ak však nastala niekde chyba a hlavný program neposlušne odmieta spustiť bootloader, zariadenie stačí vypnúť a zapnúť. Keďže v EEPROM nie je uložená informácia o spúšťaní hl. programu od začiatku, bootloader čaká na preprogramovanie.

Je to ošetrené tak, že ak by aj náhodou niečo pri preprogramovávaní zblbo, hocikaý údržbár vie na vzdialenom mieste vypnúť a zapnúť istič a preprogramovanie môže začať znovu, lebo bootloader pohotov čaká na príkazy.

Samozrejme, ku klienovi posielam len na stole odladené programy, takže za dlhé roky nikdy nikto nemusel vypnúť a zapnúť istič na zariadení.

Pri zblbnutí na stole, stačí vypnúť/zapnúť zdroj, chybu opraviť a znovu preprogramovať.

Tým, že sa pri vývoji sw preprogramovávajú iba tie 128B bloky ktoré sa voči pôvodnému kódu zmenili, šetrí sa hodne času.

Tento spôsob roky používam k plnej spokojnosti.

Nenašiel som doteraz dôvod, prečo by mal byť v relatívne vzácnej programovej pamäti program 2x, ale rád sa nechám poučiť.
Hlavne ako rozhodnúť, ktorý z nich má vlastne bežať.
Ak je potrebné sa vrátiť k predchádzajúcej verzii, stále sa mi zdá praktickejšie použiť externú SPI Flash, napriklad AT25SF041-SSHDT čo je 512kB Flash za 0,26EUR. Alebo AT25SF161-SSHDB , čo je 2MB Flash za cenu 0,44EUR.