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

ATMEGA2560 SD bootloader - Modyfikacja kodu, problem z uruchomieniem

11111olo 14 Gru 2015 17:58 1563 6
REKLAMA
  • #1 15240488
    11111olo
    Poziom 42  
    Witam

    Chcę wykorzystać bootloader który minimalnie zmodyfikowałem. Oryginalnie może działać ze wszystkimi mikrokontrolerami które mają nie więcej niż 128kB flasha.

    To istotny fragment kodu:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    To co odznaczyłem zostało przez mnie dopisane.

    Aby ułatwić sprawę przedstawię jak ten bootloader działa. Po włączeniu/zresetowaniu jednokrotnie program sprawdza wszystkie pliki w głównym katalogu karty SD które mają odpowiednią długość. W tym przypadku są one krótsze o 4 lub 8kB od ilości flasha. Nazwa oraz rozszerzenie nie mają żadnego znaczenia. Jeśli taki plik bootloader znajdzie to zaczyna go "mielić" przez CRC. Jeśli wszystko się powiedzie sprawdza czy sygnatura pliku (4 znaki na końcu pliku) są zgodne oraz wersja pliku jest wyższa niż obecnie zapisana i zaczyna flashowanie, po czym uruchamia się wgrany wsad.

    Testowałem to na atmedze644 i 1284 i działa bez najmniejszego problemu. Tu jakby coś czytał ale po chwili znowu miga dioda jak by czekało na kartę SD i tak w kółko.

    Program do generowania CRC także dołączam. Plik testowy to zwykłe miganie diodą co 1s.
  • REKLAMA
  • Pomocny post
    #2 15241728
    vonar
    Poziom 28  
    Jeśli już koniecznie taka przeróbka, to:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Ale lepiej zastąpić cały początek funkcji:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #3 15242201
    11111olo
    Poziom 42  
    Tak też kombinowałem.
    Sądzę że problem jest gdzieś wcześniej, bo ten kod tylko weryfikuje zapis we flashu.
    Posiedzę trochę przy tym i odkryję w którym momencie przestaje działać.

    **************************************************************
    EDIT

    Po długiej walce doszedłem do bardzo zaawansowanej formy działania bootloadera czyli:
    -sprawdzane są poprawnie pliki o określonej długości
    -muszą mieś prawidłowe CRC oraz wyższy nr niż wgrany (jak nic nie było wgrane to nr nie ma znaczenia)
    -samo flashowanie przebiega bez problemu nawet powyżej 128k

    To tyle dobrych wiadomości. Bootloader nie może się skończyć. Nie wiem jak napisać aby z niego wyszedł.
    Jak po flashowaniu z SD odznaczę w FUSEBITS uruchamianie bootloadera to program się normalnie włącza.


    W kodzie jest taka linia:

    start_app();

    Nie do końca wiem co ma robić (wiem że wywołuje funkcję).

    Podejrzewam że resetować mikrokontroler a właściwie skoczyć pod 0x00000.
    Może trzeba ustawić EIND?

    ************************************************************
    EDIT

    Taki kod załatwia sprawę:
    Kod: AVR assembler
    Zaloguj się, aby zobaczyć kod


    Bootloader już prawie działa ale wciąż nie wiem co zrobić z weryfikowaniem flasha przez CRC.

    Napisałem sobie prostą funkcję migania ledem.

    migaj(7);

    W tym przypadku 7 mignięć.

    Tak wygląda istotny fragment kodu:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dioda miga 4 razy i program ciągle krąży i nie może się skończyć:(
  • REKLAMA
  • Pomocny post
    #4 15247414
    vonar
    Poziom 28  
    11111olo napisał:
    Dioda miga 4 razy i program ciągle krąży i nie może się skończyć:(

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    BINARY_LENGTH = 262144
    262144 - 196608 = 65536
    uint16_t addr przekręca się przy 65535.

    Nie kombinuj ;) tylko zastąp początek funkcji tym co napisałem w poprzednim poście:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Znacznie prostsze, a kod wynikowy jest o połowę krótszy.
  • REKLAMA
  • #5 15249785
    11111olo
    Poziom 42  
    Bootloader już działa ;)
    Chciałbym jeszcze usunąć generowanie pliku autoconf.f który jest kopią pliku config.
    Czy nie szło by tych definicji przepisać do pliku config.h i coś zmienić w makefile aby to działało?
  • Pomocny post
    #6 15250003
    vonar
    Poziom 28  
    Chyba autoconf.h? No można, ale w obecnej wersji konfiguracja jest wyraźnie wydzielona w jednym pliku i nie ma możliwości powstania niespójności pliku .h z makefile. Do tego można utworzyć więcej plików config i łatwo przełączać między nimi (make CONFIG=config2).
    I po co zmieniać coś co działa (i jeszcze na coś bardziej podatnego na błędy)?
  • #7 15250405
    11111olo
    Poziom 42  
    Każdy ma swoje zdanie. Dla mnie tak by było łatwiej ;)

    Oczywiście chodziło o autoconf.h. W makefile można co nieco usunąć i ten plik się nie będzie generował, a mimo to kompilacja przebiega poprawnie. Sam plik config jest niestety konieczny.
    Właściwie to nie tyle plik co definicja porocesora.
REKLAMA