Skocz do zawartości

Osobliwy wiersz kodu w języku C pochodzący z SDK Raspberry Pi Pico


VisualLab

Pomocna odpowiedź

Od kilku dni przeglądam SDK Raspberry Pi Pico. W pliku nagłówkowym o nazwie "address_mapped.h", który znajduje się w katalogu (ścieżka względna): "...\pico-sdk-master\src\rp2_common\hardware_base\include\hardware", natrafiłem na wiersz kodu, którego nie mogę rozgryźć. Oto on:

*(io_rw_32 *) hw_set_alias_untyped((volatile void *) addr) = mask;

Plik "address_mapped.h" jest dostępny pod adresem: https://raspberrypi.github.io/pico-sdk-doxygen/address__mapped_8h_source.html. Przytoczony wiersz pochodzi z funkcji: "hw_set_bits". Jej kod to:

__force_inline static void hw_set_bits(io_rw_32 *addr, uint32_t mask) {
    *(io_rw_32 *) hw_set_alias_untyped((volatile void *) addr) = mask;
}

W tym wierszu występuje "funkcja" o nazwie "hw_set_alias_untyped", która w rzeczywistości jest makrem (jest umieszczone w tym samym pliku). Pytanie jest następujące: do czego jest przypisywana wartość argumentu "mask"? Po lewej stronie występuje makro "hw_set_alias_untyped", które zostanie zastąpione przez: "((uintptr_t)(addr))". Po jego podstawieniu i rozwinięciu powstanie wyrażenie (o ile nie popełniłem błędu):

*(io_rw_32 *) ((uintptr_t)(volatile void *) addr) = mask;

Argument "addr" jest adresem rejestru RP2040, odwzorowanego w pamięci. Ten adres ("addr") jest rzutowany na wskaźnik amorficzny ("volatile void *") a następnie na wskaźnik  "uintptr_t" (znów: o ile nie popełniłem błędu). Żeby analiza była łatwiejsza można to uprościć do:

wynik_makra = ((uintptr_t)(volatile void *) addr) // uproszczenie, które mam na myśli
*(io_rw_32 *) wynik_makra = mask; // wynikowe wyrażenie po uproszczeniu

Czy wynik makra to jakaś zmienna anonimowa (bez nazwy)? Czy lewa część wyrażenia, to dereferencja wskaźnika typu "io_rw_32", którego zawartość jest wyliczana z tego wyrażenia? Czy oznacza to, że zawartość argumentu "mask" jest przypisywana do "tego czegoś", co powstaje po dereferencji? Czy ktoś potrafi to wyjaśnić? Bo ja chyba jednak błędnie wytłumaczyłem sobie ten wiersz kodu.

Link do komentarza
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.

×
×
  • 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.