Scenariusz
Chcę zaktualizować niedrogie urządzenie IoT bezprzewodowo za pomocą nowego oprogramowania układowego aktualizującego mikrokontroler (y) urządzenia. Pamięć mikrokontrolera to pamięć flash w zakresie od 32 do 128 KB (liczy się każdy cent). Ta tania pamięć ma jedno główne ograniczenie: można ją usunąć tylko blokowo.
Pytanie
Czy to oznacza, że nie mogę dokonać aktualizacji różnicowych ( delta )? Czy zawsze muszę aktualizować całą pamięć kontrolera (lub przynajmniej istotne części)?
Chcę zmniejszyć potrzebę flashowania wszystkiego i zaryzykować zepsucie urządzenia tak bardzo, jak to możliwe. Czy istnieją jakieś strategie podczas flashowania mikrokontrolerów w powietrzu?
Odpowiedzi:
Prosta odpowiedź brzmi: tak - potrzebujesz dużej ilości bloków pamięci flash, aby obsłużyć bootloader i obrazy kodu A / B, jeśli chcesz wysokiej niezawodności. Przed aktywacją nowego obrazu możesz napisać całość, zweryfikować ją i potencjalnie spróbować ponownie.
Jednak to jest drogie / niezawodny strategia i są rzeczy, które można zrobić, aby zmniejszyć obciążenie. Wsparcie niskiego poziomu dla aktualizacji OTA może być również częścią oprogramowania układowego lub systemu operacyjnego urządzenia, więc możesz uniknąć samodzielnego tworzenia, chyba że chcesz się uczyć. Ta funkcja może być opisana jako
FOTA
.Partycjonowanie bazy kodu pozwala na przyrostowe aktualizacje, najlepiej, aby bootloader był w stanie nawiązać połączenie sieciowe, pobrać i zweryfikować kod bez potrzeby korzystania z zapasowego kodu użytkownika. Dzięki bramie lokalnej zarządzanie tym zadaniem może być delegowane z tanich punktów końcowych.
Wiele urządzeń ma niewielką ilość flashowania z wymazywaniem słów, a nawet w przypadku niepowodzenia można zwykle ustawić bity bez konieczności usuwania całego bloku. Tych funkcji można używać do manipulowania tabelami skoków i łączenia ze sobą kodu, który jest aktualizowany w blokach wielkości bloków. Nawet jeśli początkowo planowałeś pełną przestrzeń kodu A / B, być może będziesz musiał wrócić do bardziej złożonego schematu, gdy baza kodów wzrośnie za bardzo.
Aby wyjaśnić funkcjonalność, którą można osiągnąć dzięki wyrafinowanemu bezprzewodowemu oprogramowaniu sprzętowemu, moduł ładujący i potencjalnie główny stos komunikacyjny mogą pozostać rezydentne, podczas gdy pełna pozostała przestrzeń aplikacji użytkownika zostanie ponownie flashowana. Nie wymaga to narzutu (szczególnie, jeśli partycjonowanie bloków jest miękkie). W scenariuszu, w którym stos komunikacyjny wymaga aktualizacji, region ogólnie używany dla kodu aplikacji może być tymczasowo używany podczas pobierania i weryfikacji. Osiągnięcie tego wymaga pewnego wsparcia w SoC, ale urządzenia 2. i 3. generacji zaprojektowane z myślą o tym istnieją już.
źródło
Oprócz kodu, który wykonuje aktualizację, która byłaby względnie statyczna, musisz przechowywać dwa obrazy w pamięci: obraz aktywny i obraz zapasowy. Ilekroć musisz zaktualizować, zrób to w kopii zapasowej, a następnie przełącz ją na aktywną. Po stabilizacji zaktualizuj stary aktywny obraz, który powinien być twoją kopią zapasową.
Mając to na uwadze, można stosować algorytmy wyrównywania zużycia podczas aktualizacji obu obrazów. Kod takich algorytmów może zająć około 10-15% całkowitej pamięci, ale warto wydłużyć żywotność urządzenia.
( Techtarget.com: Wyrównanie zużycia )
źródło
Freescale Semiconductor opisuje niezawodny sposób bezprzewodowego uaktualnienia oprogramowania wewnętrznego dla swoich mikrokontrolerów Kinetis .
Nazywa się to: Program Flash Memory Swap .
Możesz aktualizować bloki, a następnie zamieniać je.
Powiązany dokument zawiera szczegółowy opis.
Zapewnia bezpieczniejsze aktualizacje oprogramowania, ale ponieważ wymaga więcej pamięci flash, z pewnością kosztuje więcej . Również nie ma zastosowania do każdego typu mikrokontrolera, tylko te, które obsługują wewnętrzne bloki Flash-swap.
źródło