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).

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.

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.

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.

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ł?

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;)

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.

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;)

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...