Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Bootloader w mikrokontrolerach Atmel 8-bit - podstawy podstaw

07 Lis 2019 16:13 174 5
  • Poziom 16  
    Witam.

    Domyślam się że mój temat zostanie przyjęty niezbyt chętnie bo w Internecie są już jakieś informacje na ten temat, ale ja niestety ciężko potrafię to zrozumieć.
    Z programowaniem procesorów 8-bitowych od Atmela mam już jakieś doświadczenie, jednak nigdy nie interesowałem się kwestią bootloaderów.

    Mam kilka pytań które chce zadać, ale najpierw napisze to co samemu się dowiedziałem. Wiem tylko tyle że bootloader to tak naprawdę jakąś część pamięci mikrokontrolera wydzielona z pamięci Flash, a więc tej do której wygrywamy nasze programy.
    Do tego obszaru wygrywa się osobny program który wykonuje się przed naszym programem głównym. Dodatkowo trzeba ustawić odpowiednie fuse bity.

    Tyle się dowiedziałem. Nie znalazłem jednak odpowiedzi na pytania które chce zadać. Jako przykładowy mikrokontrolery wybierzmy Atmega8.

    1. Wiem że należy fusebitami określić rozmiar pamięci jaki będzie dostępny dla bootloadera. Ale czy udostępniając tą pamięć, pomniejszamy tym samym pamięć Flash do której możemy wgrać nasz program główny? Atmega ma 8KB pamięci Flash, tworząc bootloader mam wtedy już mniej niż 8KB na swój główny program?

    2. Skoro bootloader to tak naprawdę podprogram to czy tworząc kod bootloadera mam do dyspozycji wszystkie instrukcje ze zwykłego programu? Np. Czy mogę stworzyć bootloader który będzie używał tunera aby przez np. 10 sekund migać diodą Led w odstępie 0,2 sekundy?

    3. Pytanie powiązane z poprzednim: Chcąc aby bootloader tak jak w przykładzie poprzednim migał jakąś diodą, trzeba tak samo konfigurować timer, jego przerwania, rejestry, itp jak to się robi normalnie?

    4. Czy program bootloadera pisze się w tym samym języku co główny kod? Ja programuję w C, więc w C też piszę program bootloadera?
  • Poziom 20  
    Kamil 1 napisał:
    Atmega ma 8KB pamięci Flash, tworząc bootloader mam wtedy już mniej niż 8KB na swój główny program?
    a czy pamięć może się rozrosnąć magicznie? Masz to narysowane w DS

    a2, 3, 4 - to jest normalny program programujesz w czym chcesz i jak chcesz, tak samo jak każdy inny program. Jedynie ma mrożąca krew w żyłach nazwę :}

    Pamiętać tylko musisz abyć przywrócił, stan taki jak po resecie przed skokiem do głównego programu.
  • Poziom 16  
    osctest1 napisał:
    a czy pamięć może się rozrosnąć magicznie? Masz to narysowane w DS


    Jasne, że nie może, ale się zastanawiałem czy włączając w fusebitach funkcję bootloadera przypadkiem nie odblokowuje się jakiejś dodatkowej małej pamięci. Może głupie rozumowanie, ale po protu chciałem się upewnić :)

    osctest1 napisał:
    a2, 3, 4 - to jest normalny program programujesz w czym chcesz i jak chcesz, tak samo jak każdy inny program. Jedynie ma mrożąca krew w żyłach nazwę :}


    Załóżmy, że piszę w języku C w Atmel Studio, chcę napisać program bootloadera i główny. Muszę tworzyć dwa osobne projekty i generować dwa osobne pliki .hex, a następnie wgrywać osobno plik bootloadera a później plik główny? Czy może piszę wszystko w jednym projekcie? Jeśli w jednym to w jaki sposób się "zaznacza" w kodzie, że to jest program bootloadera a to program główny?

    osctest1 napisał:
    Pamiętać tylko musisz abyć przywrócił, stan taki jak po resecie przed skokiem do głównego programu.


    Może kolejne głupie pytanie, ale jak to należy wtedy zrobić? Jest jakieś polecenie które należy wydać na końcu kodu bootloadera czy należy zerować na piechotę wszystkie rejestry?
  • Poziom 20  
    Kamil 1 napisał:
    Jest jakieś polecenie które należy wydać na końcu kodu bootloadera czy należy zerować na piechotę wszystkie rejestry?
    a skąd ktoś może wiedzieć co pozmieniałeś? To jak można napisać takie "magiczne" polecenie?
    Kamil 1 napisał:
    zy może piszę wszystko w jednym projekcie? Jeśli w jednym to w jaki sposób się "zaznacza" w kodzie, że to jest program bootloadera a to program główny?
    Patrz na poprzedni post - bootloader to zwykły program jak każdy inny. Jak to zrozumiesz to odpowiedź będzie jasna

    A to czy to będzie oddzielna Solution czy też dwa projekty w jednym Solution to już twoja sprawa jak wolisz i jaki to bootloader
  • Poziom 31  
    Kamil 1 napisał:
    Wiem tylko tyle że bootloader to tak naprawdę jakąś część pamięci mikrokontrolera wydzielona z pamięci Flash, a więc tej do której wygrywamy nasze programy.
    Do tego obszaru wygrywa się osobny program który wykonuje się przed naszym programem głównym. Dodatkowo trzeba ustawić odpowiednie fuse bity.

    Nie, bootloader to program który nazywa się tak ze względu na czynności jakie wykonuje. Może być w dowolnym miejscu pamięci.

    Jednak w wielu AVR można zarezerwować specjalnie przeznaczoną część pamięci na ten program, ponieważ dzięki temu ta część pamięci może być traktowana inaczej. Generalnie fusebity zabezpieczające są osobno dla sekcji bootloadera oraz sekcji aplikacji (tak to w nocie sie nazywa). Np. atmega48 nie ma specjalnie wydzielonego obszaru pamięci, ale też możesz program bootloadera w tej atmedze umieścić.
  • Pomocny post
    Moderator Mikrokontrolery Projektowanie
    osctest1 napisał:
    a czy pamięć może się rozrosnąć magicznie? Masz to narysowane w DS

    Poniekąd może. W klasycznych AVR bootloader jest wykrojony z FLASH dla programu, ale w XMEGA jest to dodatkowy obszar FLASH, poza FLASH dla programu.
    Kamil 1 napisał:
    Załóżmy, że piszę w języku C w Atmel Studio, chcę napisać program bootloadera i główny. Muszę tworzyć dwa osobne projekty i generować dwa osobne pliki .hex, a następnie wgrywać osobno plik bootloadera a później plik główny?

    To zależy od ciebie. Skoro bootloader umożliwia wgranie programu, to możesz najpierw wgrać bootloader, a potem za jego pomocą wgrać kod aplikacji. Możesz sobie też tak skonfigurować projekt, że wygeneruje ci jeden plik hex/elf zawierający jednocześnie kod bootloadera i aplikacji, do wgrania za jednym razem.
    Kamil 1 napisał:
    Jeśli w jednym to w jaki sposób się "zaznacza" w kodzie, że to jest program bootloadera a to program główny?

    Zależy od użytego środowiska. W większości nie ma magicznego przycisku "bootloader" i trzeba konfigurować opcje projektu. Najogólniej pisząc w C trzeba przesunąć sekcję .text kodu, aby wskazywała na początek bootloadera. Robi się to np. w AS w opcjach linkera.
    Kamil 1 napisał:
    Może kolejne głupie pytanie, ale jak to należy wtedy zrobić? Jest jakieś polecenie które należy wydać na końcu kodu bootloadera czy należy zerować na piechotę wszystkie rejestry?

    Problemem nie jest zerowanie rejestrów lecz przywrócenie układów peryferyjnych MCU do stanu wyjściowego. Tu jest kilka opcji, m.in. ogranicza się peryferia używane przez bootloader, a w kodzie aplikacji nie przyjmuje się ich stanu domyślnego, lecz konfiguruje wszystkie rejestry IO układów. Przy bootloaderze mieszającym w wielu peryferiach jest to niezbyt wygodne, chociaż dla tak prostych MCU jak M8 może być efektywne. Inną możliwością jest wykorzystanie np. WatchDoga, w ten sposób, że przejście z bootloadera do aplikacji realizuje się jako reset wywołany przez WD. To gwarantuje domyślny stan IO po odpaleniu aplikacji.
    Kamil 1 napisał:
    2. Skoro bootloader to tak naprawdę podprogram to czy tworząc kod bootloadera mam do dyspozycji wszystkie instrukcje ze zwykłego programu?

    Tak, boootloader dysponuje wszystkimi instrukcjami, czasami nawet dodatkowymi. W niektórych AVR (nie pamiętam czy w M8), użycie SPM jest możliwe wyłącznie z sekcji bootloadera.
    Kamil 1 napisał:
    3. Pytanie powiązane z poprzednim: Chcąc aby bootloader tak jak w przykładzie poprzednim migał jakąś diodą, trzeba tak samo konfigurować timer, jego przerwania, rejestry, itp jak to się robi normalnie?

    Tak, bootloader to fragment normalnego kodu programu, jedyne co go wyróżnia to fakt umieszczenia w specjalnym obszarze FLASH.
    Kamil 1 napisał:
    4. Czy program bootloadera pisze się w tym samym języku co główny kod? Ja programuję w C, więc w C też piszę program bootloadera?

    Tak, możesz go oprogramować w C. Jednak zwykle pisanie bootloadera wymaga głębszej znajomości struktury generowanego kodu, linkera itd. W M8 na bootloader nie ma za dużo miejsca, stąd np. może zajść konieczność modyfikacji tabeli wektorów przerwań, lub wręcz jej likwidacji jeśli kod bootloadera nie korzysta z przerwań, podobnie może zajść konieczność usunięcia kodu startowego C itd. Jeśli bootloader ma np. 512 bajtów max to może zajść konieczność użycia asemblera. Także podsumowując - kod pisze się podobnie, jednak porządny bootloader wymaga znacznie głębszej znajomości użytego mikrokontrolera, sposobu budowania kodu i często wielu specyficznych dla bootloadera tematów - np. zabezpieczania integralności kodu, jakiegoś protokołu wymiany danych, przemyślania kwestii wyjścia z sytuacji w której kod aplikacji jest błędny itd.