Jak działa bootloader?

Aktualizacja oprogramowania bez programatora

Co to jest bootloader? Bootloader to mały program istniejący obok głównego softu. Nie różni się niczym specjalnym od programów pisanych na mikrokontroler, jedynie przeznaczeniem. Jest to więc zwykły program pisany na mikroprocesor z tym, że jest umieszczony obok programu głównego. Mikroprocesor startując zaczyna wykonywać kod bootloadera i w zależności od intejcji programisty i uzytkownika może np zaaktualizować główny soft, sprawdzić, czy hardware działa poprawnie lub zrobić kopie bezpieczeństwa danych.

Gdzie tu więc jest magia? Bootloader w określonym momencie przekazuje mikroprocesorowi nową tablicę wektorów przerwań, ustawia nowy wskaźnik stosu i skacze do miejsca w którym zaczyna się główny kod. Skok odbywa się bezpowrotnie, więc mikroprocesor zajmuje się już tylko wykonywaniem głównego programu.

W jaki sposób więc można aktualizować firmware? Skoro boodloader to "zwykły" program, to może robić tak "zwyczajną" rzecz jak transmisja danych, np przez port szeregowy. Oprócz tego może robić jeszcze tak "zwyczajną" rzecz jak zapis do pamięci flash procesora (tak! w trakcie działania programu nie musimy ograniczać się tylko do RAMu!). Do tego wszystkiego bootloader może wpisać do kilku rejestrów swoje dane (również nic nie zwykłego) i... skoczyć do obsługi resetu głównej aplikacji by wywołać funkcję main drugiej (głównej) aplikacji.

Jak format pliku wynikowego można wysłać jako aktualizację softu? Najwygodniej jest wysłać po prostu plik binarny (*.bin). Zawiera on "surowe" dane które mają być ładowane do kolejnych obszarów pamięci. Jest jakby (upraszczając) bezpośrednią kopią pamięci mikroprocesora. Inaczej ma się sprawa w przypadku plikóœ ELF - standardowy plików wynikowych kompilacji dla ARM - oprócz danych binarnych zawierają również dodatkowe symbole i opisy, pomagające m.in w debugowaniu. Wykorzystanie plikow ELF wymaga umieszczenia parsera w programie bootloadera, więc dużo prościej jest wysyłać gotowe pliki binarne. Konwersji na komputerze z pliku ELF do BIN można dokonać za pomocą toolchainowej komendy: arm-none-eabi-objcopy -O binary soft.elf soft.bin

Jak najprościej wysłać plik zawierający firmware? W tej roli świetnie sprawdzi się stary, dobry xmodem. Jest to protokół wymiany plików, który powstał w 1977 roku. Plik jest wysyłany w 133-bajtowych ramkach zawierających typ ramki, kolejny numer, dane i sumę kontrolną. Każda ramka jest potwierdzona (ACK) lub odrzucona (NAK) przez stronę odbierająca. Odbierający również inicjuje transmisje, wysyłając znak chęci pobrania pliku. Aby nie marnować miejsca w pamięci mikroprocesora na bufor pliku programu dużo oszczędniej jest zapisywać dane odebrane z UART do bufora wielkości strony pamięci i kiedy się on zapełni zaprogramować wewnętrznie kolejną stronę pamięci flash.


Poniżej przykładowa implementacja bootloadera dla stm32F103


--main.c--


--uart.c--


--xmodem.c--


--mem.ld--

Uwaga! To plik pojektu ładowanej aplikacji, nie programu bootloadera! Jak widać zmianie uległ adres początkowy 'ORIGIN = 0x08004000' oraz wielkość ladowanego programu zostala zmniejszona o rozmiar bootloadera


TAGS: DMA, FreeRTOS start, FreeRTOS pliki, Unit testy