Skocz do zawartości

USB, Bootloader AVR -pytań kilka


Pomocna odpowiedź

Jeżeli nie skoczysz pod adres wektora resetu, to nie zostanie wykonana inicjalizacja procka, a tym samym zerowanie i ustawianie zmiennych globalnych. Jeżeli obie aplikacje są napisane w takie sposób, że współdzielą pamięć RAM (a zapewne tak jest) to zwykły skok pod adres z funkcją main() bootloader'a może nie zadziałać.

Dlatego właśnie wykonuje się resety procka lub skacze, ale pod adres 0x00000000 (adres resetu).

Link to post
Share on other sites
Jeżeli nie skoczysz pod adres wektora resetu, to nie zostanie wykonana inicjalizacja procka, a tym samym zerowanie i ustawianie zmiennych globalnych. Jeżeli obie aplikacje są napisane w takie sposób, że współdzielą pamięć RAM (a zapewne tak jest) to zwykły skok pod adres z funkcją main() bootloader'a może nie zadziałać.

Dlatego właśnie wykonuje się resety procka lub skacze, ale pod adres 0x00000000 (adres resetu).

W jakim sensie ma nie zadziałać? Ja nie planuje powrotu z bootloadera do apliakcji więc mi to nie szkodzi że np. zmienne w pamięci RAM zostaną nadpisane. Po aktualizacji softa ma zostać wykonnay reset - choćby ręczny.

OldSkullSposób ze wskaźnikiem na funkcje jest o tyle fajny że można się do niego odnosić z wielu miejsc w programie choć ja takiej potrzeby nie mam.

Link to post
Share on other sites

kling, dobrze wiedzieć, ale ustawia się przecież gdzie ma skoczyć po resecie, a wiem, że 0x00 jest skokiem w kierunku main - tylko pytanie co się wykona przed tym. I nawet jeśli reset skacze do bootloadera na końcu flasha (jak w 8b AVRach) to 0x00 skacze do maina. Interesuje mnie jak to właściwie jest. Niestety nie mam pod ręką płytki, która by się nadawała do testowania czegoś takiego.

Link to post
Share on other sites

Pomiędzy resetem a main() jest jeszcze kawałek kodu inicjalizujący środowisko C.

Patrz: C Startup.

Nie wiem jak dokładnie działa to w AVR'ach, skoro ich bootloader jest na końcu, trzeba byłoby zajrzeć do dokumentacji;)

W jakim sensie ma nie zadziałać? Ja nie planuje powrotu z bootloadera do apliakcji więc mi to nie szkodzi że np. zmienne w pamięci RAM zostaną nadpisane. Po aktualizacji softa ma zostać wykonnay reset - choćby ręczny.

No ok, ale bootloader też ma swoje zmienne, które powinny zostać zaincjalizowane.

Istotne wydaje się być czy wykonasz skok do funkcji main w bootloaderze czy do adresu pod którym będzie inicjalizacja środowiska dla booloadera.

Link to post
Share on other sites

Skacze na początek sekcji bootloadera czyli wykonuje się wszystko. A poza tym inicjalizacja zmiennych to raczej mi się wydaje że jest związana tylko z językiem programowania i ma pomagać unikać pomyłek (chodzi np. o to żeby nie było sytuacji w której programista zrobi literówkę przy wpisywaniu po raz kolejny nazwy zmiennej w programie i kompilator potraktuje jedną zmienną jako dwie odrębne). Wydaje mi się że po przetłumaczeniu na assemblera nie ma żadnej inicjalizacji tylko po prostu wpisujemy coś pod fizyczne adresy pamięci RAM ?

edit:

O ile nie używasz zasilania z USB to Vusb możesz zostawić nieużywane.

Tak po prostu zostawić? Może chociaż kondensator do masy by się przydał?

Link to post
Share on other sites
Skacze na początek sekcji bootloadera czyli wykonuje się wszystko.

No to w takim razie powinno być ok;)

A poza tym inicjalizacja zmiennych to raczej mi się wydaje że jest związana tylko z językiem programowania i ma pomagać unikać pomyłek (chodzi np. o to żeby nie było sytuacji w której programista zrobi literówkę przy wpisywaniu po raz kolejny nazwy zmiennej w programie i kompilator potraktuje jedną zmienną jako dwie odrębne). Wydaje mi się że po przetłumaczeniu na assemblera nie ma żadnej inicjalizacji tylko po prostu wpisujemy coś pod fizyczne adresy pamięci RAM ?

Standard języka C określa, że niezdefiniowane zmienne globalne oraz statyczne mają wartość początkową równą '0'. W związku z tym, przypisując kolejne adresy zmiennym globalnym kompilator musi mieć pewność, że w te konkretne miejsca w pamięci będą zawierały zera.

O to między innymi dba c startup, wykonywany po resecie, a przed funkcją main;)

Link to post
Share on other sites

Jeśli chodzi o zmienne globalne to po resecie przecież i tak mają wartość 0 bo pamięć się zeruje.

Jeśli chodzi o zmienne lokalne to je trzeba(jeśli chcemy mieć wyzerowaną) zawsze ręcznie wyzerować zwykłą operacją przypisania. W przeciwnym razie może być tam jakaś inna wartość będąca pozostałością jakiejś zmiennej lokalnej używanej w innej funkcji.

Nie wiem. Może się mylę - nie mam jakiegoś wielkiego doświadczenia więc nie będę się kłócił ale mi się zawsze wydawało że jest tak jak napisałem w pierwszej części posta.

Link to post
Share on other sites

No ale przecież pamięci nie zerują krasnoludki;) Jakiś fragment kodu (c startup) musi o to zadbać😋

Jeżeli chodzi o zmienne lokalne to tu masz racje;)

Link to post
Share on other sites
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.