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

[Atmega88] Bootloader, zerowanie pamięci oraz rejestrów

ADI-mistrzu 24 Kwi 2012 18:11 1365 6
  • #1 24 Kwi 2012 18:11
    ADI-mistrzu
    Poziom 30  

    Witam,

    Mam jak na razie dwa pytania na temat bootloadera:

    1. Jak wiadomo trzeba wyzerować rejestry takie jak np. SREG. Pytanie czy jest możliwość aby cały kod początkowy przez main wykonał bootloader tuż przed skokiem do aplikacji i przez to zwolnienie nieco miejsca dla aplikacji?

    2. Normalnie gdy wgrywa się program z poziomu bootloadera należy najpierw całą pamięć wykasować a potem wpisać program.
    Nie lepiej by było od razu wgrać program a resztę pamięci wykasować? Raz program mógł by być mniejszy a dwa oszczędzamy komórki pamięci, nie trzeba 2 razy ich zapisywać podczas jednego programowania.

    Pozdrawiam

    0 6
  • #2 24 Kwi 2012 18:24
    mirekk36
    Poziom 42  

    Niestety ale te dwa pytania świadczą , że kolega totalnie opatrznie zrozumiał działanie bootloadera i na takie pytania nie da się nawet odpowiedzieć. Może lepiej powiedz co chcesz osiągnąć - jaki cel to łatwiej będzie cię naprowadzić.....

    0
  • #3 24 Kwi 2012 18:31
    ADI-mistrzu
    Poziom 30  

    A to tylko z ciekawości :wink:
    O ile z zerowaniem rejestrów raczej wiem czemu nie wypali, o tyle z kasowaniem pamięci już nie.
    Chodzi o to "że się nie powinno" czy np. wgrywanie programu polega na operacji &, czyli obecny stan komórki jest iloczynem nowego stanu. Wtedy faktycznie trzeba by było pamięć kasować całkowicie.

    P.S.
    Jak bym niezrozumiale napisał:
    skasowana pamięć ma wartość 0xFF, iloczyn nowej wartości (0xAA) z nią to:
    0xFF & 0xAA = 0xAA
    Wtedy jeśli nie skasujemy pamięci to możemy otrzymać np. coś takiego:
    0x0F & 0xAA = 0x0A
    Czyli nie o to o co nam chodziło.

    0
  • Pomocny post
    #4 24 Kwi 2012 19:32
    tmf
    Moderator Mikrokontrolery Projektowanie

    No właśnie, skasowana pamięć FLASH ma same FF. Programowanie polega na zmianie jedynek na zera. Stąd też najpierw pamięć trzeba skasować, dopiero potem można zaprogramować (bo inaczej zer na jedynki nie da się zmienić).

    Dodano po 2 [minuty]:

    BTW. To ciągle jest tylko jedna operacja zapisu. Więc nie ma co kombinować. Co do twojego pierwszego pytania - SREG to ty w ogóle nie ruszaj skoro piszesz w C. Oczywiście jest możliwość, aby kod startowy wywołał bootloader, a ten potem wrócił do aplikacji, ale jest to udziwnienie wymagające dosyć głębokiej znajomości struktury kodu wynikowego programu w C i budowy kodu startowego (sekcji .ini). Jaki jest cel tych kombinacji?

    0
  • #5 24 Kwi 2012 19:37
    ADI-mistrzu
    Poziom 30  

    Kombinacja z rejestrami była taka, że zastanawiałem się czy skoro i tak najpierw wykonuje się bootloader to czy na jego końcu nie może być początek sekcji inicjalizacyjnej zamiast na początku aplikacji.
    Miejsca może niewiele by to dało, ale to tylko pomysł którego byłem ciekaw czy w rzeczywistości dał by radę.

    0
  • Pomocny post
    #6 24 Kwi 2012 20:01
    tmf
    Moderator Mikrokontrolery Projektowanie

    Może być, ale to kompletnie nie ma sensu, a i oszczędności z tego żadne lub niewielkie. Natomiast w\dy takiego rozwiązania są poważne - skomplikowany sposób budowy kodu aplikacji, czy współdzielenie obszaru bootloadera z częścią kodu aplikacji. W efekcie trzeba by to uwzględnić przy pisaniu samego bootloadera, uaktualnenie fragmentu kodu rezydujacego w sekcji bootloadera wymagałoby pewnych dodatkowych zabiegów.

    0
  • #7 11 Wrz 2012 10:16
    ADI-mistrzu
    Poziom 30  

    Dziękuję za pomoc, już wiem tyle ile potrzebuję :)

    Pozdrawiam

    0