Użyj układu, który ma ponad dwukrotnie więcej pamięci Flash, niż potrzebujesz do kodu. W ten sposób możesz przenieść nowe oprogramowanie do tej pamięci, jednocześnie pozostawiając stare, na wypadek, gdyby coś poszło nie tak.
Po odszyfrowaniu i zweryfikowaniu sum kontrolnych nowego oprogramowania układ ładujący może skopiować go do swojej ostatecznej lokalizacji, zastępując stary. Jeśli coś pójdzie nie tak podczas tej części, po twardym resecie program ładujący powinien sprawdzić, czy nowe oprogramowanie układowe nie jest prawidłowe (uruchamiając ponownie sumę kontrolną) i ponowić kopiowanie.
To najprostszy i najbardziej niezawodny sposób, jaki znam. Wymaga również niewielkiego kodu w programie ładującym i nie wymaga duplikowania żadnej funkcji między programem głównym a programem ładującym (nie potrzebujesz żadnej logiki komunikacyjnej w programie ładującym).
Użyj bootloadera i kilku KB dodatkowej pamięci flash.
Aktualizacja jest wykonywana przez program ładujący, wysyłając specjalne polecenie przez UART, USB, I2C lub inny protokół. Tylko główny kod jest zawsze aktualizowany - kod bootloadera nigdy nie jest dotykany inaczej niż przez zewnętrzny programator (tj. JTAG / PICkit dla PIC itp.)
Jeśli aktualizacja się nie powiedzie (awaria zasilania, ktoś potknie się o przewód lub inny powód), widżet nie będzie działał, ale bootloader nadal tam będzie, więc można ponowić próbę aktualizacji.
Flaga może być ustawiona gdzieś w bajcie, co zapobiega nieprawidłowemu działaniu głównego kodu, ponieważ nie został w pełni zaktualizowany.
źródło
Jeśli Twoje urządzenie jest stosunkowo drogie i możesz sobie pozwolić na koszty (a klienci dbają o aktualizacje), możesz to zrobić ...
(generalnie ta technika wymaga zewnętrznego przechowywania lub przebiegłego użycia jtag ..)
Mają stały program mikro (jak mały PIC), który może zatrzymać system i przeprogramować go.
ponieważ nie można zmienić oprogramowania „procesora aktualizacji”, nigdy nie może się nie udać.
1) użytkownik może zaktualizować urządzenie
2) jeśli aktualizacja się nie powiedzie, zawsze mogą spróbować ponownie. Nie można go zamurować
3) nawet jeśli urządzenie docelowe nie obsługuje modułu ładującego (chce tylko uruchomić i uruchomić), możesz zrobić to, co chcesz.
działa dla FPGA, DSP i innych nieparzystych celów.
Może mieć naprawdę fajny interfejs użytkownika (nawet PIC może uruchomić serwer WWW ....)
źródło
Upewnij się, że twój produkt ma jakiś prosty interfejs szeregowy, najlepiej EIA232. Niestandardowe złącze jest OK, jeśli nie masz miejsca na DB-9. Na przykład złącze TRS jest wszystkim, czego potrzebujesz do TxD, RxD i uziemienia.
Podczas programowania urządzenia po raz pierwszy, dołącz bootloader . Powinno to być tak proste, jak to możliwe , ponieważ wcześniej czy później będziesz chciał uaktualnić sam program ładujący, jeśli będzie potrzebował nowych funkcji. (Prawdopodobnie nie możesz go nawet uaktualnić)
Następnie złącze TRS. Użyj wtyczki z przełącznikiem, aby można było wykryć obecność złącza. Po prostu sprawdź zaraz po zresetowaniu i uruchom bootloader, jeśli wtyczka jest obecna, w przeciwnym razie uruchom aplikację. W ten sposób bootloader i aplikacja użytkownika pozostają dobrze oddzielone. (Sprawdzenie jest w rzeczywistości częścią bootloadera; będziemy go potrzebować niezależnie od wersji aplikacji, w przeciwnym razie nie będziemy mogli wejść do bootloadera!)
źródło
Jakie wyposażenie będzie dostępne „ulepszenie”? Komputer, pamięć USB, karta micro SD?
Jednym ze sposobów byłoby umieszczenie aplikacji w wyjmowanym elemencie (pamięć USB, karta SD itp.). Chip ładuje swoją aplikację z przedmiotu. Twój ulepszenie po prostu zamienia przedmiot i uruchamia się ponownie.
Znane mi układy mikrokontrolera ARM i Cortex (NXP, Atmel) mają wbudowany program ładujący szeregowy, więc jeśli twój program aktualizacyjny przyjedzie z komputerem i kablem szeregowym (i masz skonfigurowany interfejs portu COM), może po prostu pobrać twój aktualizacja.
źródło