logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Botloader, dwa różne programy w jednej pamięci programu.

Dexu 07 Cze 2011 22:39 1287 9
REKLAMA
  • #1 9587913
    Dexu
    Poziom 13  
    Witam

    Mam pytanie do doświadczonych programistów AVRków.
    Nie znam się na bootloaderach dlatego proszę was o pomoc.
    Potrzebuję się dowiedzieć czy przy użyciu ATmegi np. 128 można uzyskać następującą funkcjonalność.

    Pamięć programu miała by zostać podzielona na dwa niezależne segmenty, w które przeznaczone by były na różne wersje programu, można przyjąć, że są ta 2 różne programy.
    Modem GSM z Java odpowiedzialny byłby za aktualizację oprogramowania
    Bootloader miał by za zadanie zaktualizować program znajdujący się w aktualnie nie używanej części pamięci i dopiero aktualnie wybrany program zadecydował by o "przełączeniu" na nowy.

    Bardzo bym prosił o naprowadzenie na rozwiązanie .

    Pozdrawiam
    Dexx
  • REKLAMA
  • #2 9587955
    y0yster
    Poziom 19  
    Byłby pewien problem.
    Pewnym rozwiązaniem było by zapisanie od razu dwóch programów przy aktualizacji: starego i nowego. Następnie zamknięcie owych programów w odpowiednich funkcjach.

    Tak jak Ty chcesz to zrobić mogło by się nie udać. Chociaż odpowiednie dostosowywanie rozmiarów pamięci (stałe rozmiary) mogło by rozwiązać ten problem. Wiąże się to w oczywisty sposób z sytuacją:
    Wymuszony reset układy (fizyczny). Do przerwania resetu masz jeden adres. Tam musiałbyś umieścić funkcję, która by na sztywne wskoczyła do odpowiedniego kodu pod odpowiedni adres.
  • #3 9588028
    GSM
    Poziom 25  
    Witam,

    ja to widzę dość jasno, nastawę określającą, który podprogram uruchomić możnaby przechowywać w EEPROM'ie.

    Pozdrawiam,
    GSM
  • REKLAMA
  • #4 9588037
    tmf
    VIP Zasłużony dla elektroda
    Ze względu na niemożność umieszczenia pod dowolnym adresem tablicy wektorów przerwań takie działanie jest praktycznie niemożliwe. Niezależnie od tego wymagałoby sporej żonglerki skryptami linkera. Napisz lepiej co chcesz osiągnąć, będzie łatwiej doradzić. Chodzi ci o to, aby się zabezpieczyć przed sytuacją, w której nadpisany program jest błędny i nie będzie poprawnie działał? Jeśli wykorzystujesz tylko 50% pamięci, to możesz tymczasowo zapisywać przesyłany kod w nieużywanej połowie, po kompletnym przesłaniu zweryfikować dane, po czym po pomyślnej weryfikacji przenieść go we właściwe miejsce w pamięci i odpalić. Zdecydowanie łatwiejsze do realizacji. Jeśli wykorzystujesz więcej niż 50% dostępnego FLASH to twoja metoda i tak ne zadziała. Wtedy łatwo wrzucić jaką małą zewnętrzną pamięć szeregową FLASH, do której przesyłasz tymczasowo odbierany kod i potem po weryfikacji z bootloadera fleszujesz procesor zawartością tej pamięci.
  • #5 9588090
    Dexu
    Poziom 13  
    Pamięć programu nie jest do końca problemem, można ją podzielić na dwie równe części minus część bootloadera.

    W sumie rozwiązanie, które proponujesz jest do przyjęcia.
    Program składał by się wtedy ze stałej części, która była by była powiedzmy systemem operacyjnym i w tym przypadku nie mógł by być zmieniany, i części która mogła by się zmieniać. Jedyny problem jaki w tym widzę, to konieczność przeładowania całej zawartości pamięci, więc w razie niepowodzenia nie ma jak wrócić do działającej wersji.

    Popraw mnie proszę, jeśli coś przekręciłem.

    Dzięki za odpowiedź
    Pozdrawiam
  • REKLAMA
  • #6 9588101
    GSM
    Poziom 25  
    A czy skrypt który będzie wgrywał program przez bootloader nie może wykonać weryfikacji i w razie błędu wgrać ponownie starej wersji?

    Pozdrawiam,
    GSM
  • #7 9588139
    Dexu
    Poziom 13  
    Hmm widać sam sobie nazbyt komplikuje problem. Wydawało mi się, że istniał jakiś problem, który wykluczał takie proste rozwiązania, ale w tej chwili nie jestem w stanie powiedzieć dlaczego. Muszę, się chyba z tym przespać.
    Na razie dziękuję wszystkim za pomoc.
  • REKLAMA
  • #8 9588260
    tmf
    VIP Zasłużony dla elektroda
    No jeśli to ma iść po GSM to jest problem, bo przecież transmisja w każdej chwili może zostać zerwana i zostajesz z częściowo uaktualnionym programem, czyli sieczką.
    W tym co zaproponowałem nie ma problemu, bo program jest kasowany dopiero w momencie kiedy w pamięci flash jest już kompletna nowa wersja, a na etapie jej przepisywania z "bufora" we FLASH pod właściwy adres nie ma co pójść źle. Nawet jak np. padnie zasilanie w trakcie tego procesu to można go bez problemu wznowić przy kolejnym uruchomieniu układu.
  • #9 9588307
    GSM
    Poziom 25  
    A ten modem GSM to nie ma własnej pamięci? :roll:
    Skoro ma VM Javy to będzie na nim uruchomiony jakiś program od aktualizacji, on mógłby te czynności przejąć, czyż nie?

    Pozdrawiam,
    GSM
  • #10 9588879
    asembler
    Poziom 32  
    Ja bym zaproponował może tak:

    Przed rozpoczecie ładowania programu istniejący sprawny program kopiujesz do pamieci obojętnie jakiej.
    Następnie ładujesz program w docelowe miejsce i oczywiscie po weryfikacji odpalasz.
    Dopisujesz funkcje w programie co ma sie dziac w przypadku błedu weryfikacji lub błednego działania programu - np zadziałanie ...doga
    Funkcja ta to oczywiscie powrót do porzedniej wersji czyli przekopiowanie zachowanej poprzedniej wersji.

    Tak jak pisze tmf masz jeden zestaw wektorów i nie sprawdzisz dzialania programu w innym miejscu bez nadpisania skokow.

    Oczywiscie mozna by przekierowc wszystkie wektory do obszaru bootloadera a tam w kazdym wektorze zrobić rozdzielacz która aktualnie wersja ma byc wykonywana - wtedy umieszczony relokowalny program w dowolnym miejscu pamieci bedzie też można odpalic a zmieniając jeden bit powrówcić do poprzedniej wersji
    Idąc dalej tym tropem to majac odpowiednio dużą pamiec mozna umiecic wiele programów korzystających z jednej tablicy wektorów.
    Dla programu układ taki bedzie przeźroczysty.
REKLAMA