Skocz do zawartości
Zaloguj się, aby obserwować  
Wojtek

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

Udostępnij ten post


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.

Udostępnij ten post


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.

Udostępnij ten post


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.

Udostępnij ten post


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

Udostępnij ten post


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

Udostępnij ten post


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.

Udostępnij ten post


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

Udostępnij ten post


Link to post
Share on other sites

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.

Zaloguj się, aby obserwować  

×
×
  • Utwórz nowe...