•>
BOOTSZ |
Rozmiar pamięci |
11 |
256B |
10 |
512B |
01 |
1024B |
00 |
204 8B |
Tabela 9 Rozmiar sekcji BLS w procesorze ATmega162
BOOTSZ=01
BOOTSZ=10
BOOTSZ=11
Woktor rosołu |
Początek eokcji bootloadera | |
(start programu) |
(BSL, |
Rys. 50 Konfiguracja bootloadera
W dzisiejszym odcinku napiszemy własny program bootloadera. Przedstawię podstawowe informacje o sekcjach pamięci, ich wykorzystaniu oraz sposobie tworzenia. Aby nasz bootloader był jak najmniejszy, część funkcji będzie utworzona w pełnym asemblerze -pojawią się więc informacje, o które pytano mnie w listach od Czytelników.
Ponieważ dla wielu osób pisania bootloa-dera jest czymś nowym, a w ramach kursu BASCOM temat ten nie był omawiany, zanim przejdziemy do pisania aplikacji, przedstawię skrótowo sposób, w jaki nasz procesor wspiera pisanie takiego programu.
Aktualnie produkowane procesory AVR umożliwiają stworzenie własnej aplikacji ładującej. Producent nie umieszcza w nich żadnego domyślnego programu tego typu. Oznacza to, żc cały trud jego stworzenia spoczywa na programiście. Z drugiej strony, istnieje pełna dowolność jego działania. Do programowania możemy wykorzystać dowolny interfejs. Może to być zarówno interfejs już istniejący, jak i dowolny wymyślony przez nas samych.
Spójrz na rysunek 50. Pokazuje on pewne podstawowe możliwości konfiguracji boot-loadera oraz ideę jego działania. Pamięć programu jest podzielona na dwie części. Pierwsza z nich to sekcja RWW (Read-While-Write). Ten, nieco mylący, skrót w praktyce oznacza, że w chwili zapisywania sekcji RWW możemy wykonywać program z sekcji NRWW Jednak próba odczytu w tym czasie
Szczegóły techniczne Wsparcie dla Bootloadera a wsparcie dla samoprogramowania
W przypadku rodziny procesorów AVR spotkamy się z dwoma mechanizmami umożliwiającymi napisanie kodu programującego ich pamięć FLASH.
Wsparcie dla bootloadera (Boot Loader Support): Pamięć procesora podzielona jest na dwie części. Instrukcja zapisu do pamięci programu jest aktywna jedynie z poziomu sekcji bootloadera (BLS). Rozwiązanie to jest o tyle wygodne, że procesor można
z sekcji RWW może skończyć się zawieszeniem procesora. Druga sekcja nosi oznaczę nie NRWW (No-Read-While-Wnte), co jak łatwo się domyślić oznacza brak możliwości odczytu podczas zapisu. W praktyce oznacza to, żc na czas zapisu do tej części pamięci procesor jest zatrzymywany.
Podział na sekcje RWW i NRWW jest sztywny i skonstruowany w taki sposób, aby sekcja NRWW była w stanie zmieścić naj większy, możliwy dla danego procesora, program bootloadera. W przypadku naszego układu w ATmegal62 sekcja ta zajmuje ostatnie 2KB pamięci.
Kolejny podział pamięci jaki można przedstawić, to sekcja aplikacji oraz sekcja bootloadera (BLS). W odróżnieniu od podziału na sekcje RWW i NRWW, ten podział nie jest już sztywny. Ilość pamięci przeznaczonej na nasz program ładujący możemy ustawić jako 1/8,
1/4, 1/2 lub
całość sekcji NRWW. Związane z tym rozmiary sekcji BLS dla procesora ATine-gal62 pokazuje tabela 9.
W sekcji BLS znajdzie się nasz program ładujący. Istnieje możliwość zabezpieczenia przed zapisem lub odczytem oddzielnie sekcji BLS i aplikacji. Bootloader może wymienić nawet samego siebie. Wymaga to wielkiej ostrożności i jeśli możliwość taka nie jest konieczna, zaleca się ustawienie zabezpieczenia przed zapisem sekcji bootloadera.
skonfigurować w taki sposób, aby po rcsccic startował w trybie bootloadera. W takim przypadku możliwe jest zaprogramowanie procesora, w którym nic ma jeszcze aplikacji lub też w którym aplikacja została uszkodzona. co może się zdarzyć, jeśli podczas programowania zasilanie zostanie odłączone. W ten mechanizm wyposażone są wszystkie aktualnie produkowane „większe” procesory, w tym rodzina ATmega.
Wsparcie dla samoprogramowania (Self-Programming Support): W tym rozwiązaniu nie ma wydzielonej sekcji bootloadera. Instrukcja zapisu do pamięci programu
BOOTRST=1 -►
BOOTRST=0
NRWW | ||
boo rsz=oo
Uruchomienie programu ładującego może nastąpić na dwa sposoby:
1. Skok z aplikacji do programu ładującego znajdującego się w sekcji BLS.
2. Reset procesora, w którym zaprogramowano bit BOOTRST.
Szczególnie interesująca jest druga możliwość. Dzięki temu istnieje możliwość uruchomienia bootloadera, nawet jeśli aplikacja jest uszkodzona. Przy stosowaniu takiego rozwiązania umawiamy się zwykle, ze nasz program ładujący powinien być uruchomiony, jeśli zaraz po zerowaniu procesora wystąpi jakiś specjalny sygnał. Może to być przykładowo zwarcie jednego z wyprowadzeń do masy czy też wysłanie odpowiedniego znaku przez wybrany interfejs. Jeśli taka sytuacja nie ma miejsca, powinniśmy wykonać skok pod adres 0. To rozwiązanie jest wygodne także może być wywołuna z dowolnego miejsca programu. W takim przypadku to na nas spoczywa odpowiedzialność napisania bootloa dera w taki sposób, aby nie uszkodził on sam siebie. Z drugiej strony daje to oardzo wygodną możliwość wykorzystania pamięci FLASH jako dodatkowej, nieulotnej pamięci danych. Rozwiązanie to jest stosowane w procesorach, takich jak ATtiny23l3 czy ATtinv25.
Nasz procesor wyposażony jest w bardziej rozbudowane rozwiązanie i nim właśnie będziemy się dziś zajmować.
39