eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronika[ARM] Obsługa peryferiów poprzez API (wskazniki do struktury)Re: Obsługa peryferiów poprzez API (wskazniki do struktury)
  • Data: 2012-05-28 21:52:19
    Temat: Re: Obsługa peryferiów poprzez API (wskazniki do struktury)
    Od: "J.F." <j...@p...onet.pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    Dnia Mon, 28 May 2012 11:13:59 -0700 (PDT), slawek7 napisał(a):
    > Chyba rozumiem. Bo czy to znaczy że jeśli jakiś rejestr 32 bitowy ma
    > możliwość zapisania go wartością 16 bitowa bo tak podaje dokumentacja
    > to chcąc dokonać takiego zapisu liczbą 16 bitową używam rzutowania 16
    > bitowego w postaci (*(uint16_t*)0x40010C10)=0x1234;
    > Natomiast jeśli rejestr musi byc zapisany tylko wartością 32 bitowa bo
    > tak każe dokumentacja to u zywam (*(uint32_t*)0x40010C10)=0x12345678;
    >
    > Ale mam wątpliwość, czy czasem to rzutowanie nie oznacza tylko

    Czyli chyba nie rozumiesz

    0x40010C10
    to liczba. a moze i adres.

    (uint32_t*)0x40010C10
    liczba, zasadniczo ta sama, ale juz typu "wskaznik na cos"

    *(uint32_t*)0x40010C10
    obiekt wskazywany przez ten wskaznik. A poniewaz wskaznik mial wskazywac
    na uint32, to obiekt jest uint32. Albo inny, jesli tak ustalisz.

    (*(uint32_t*)0x40010C10)=0x0000000f;
    a tu masz wpisanie wartosci do obiektu.

    Przy czym moze nastapic kolejna konwersja wyrazenia z prawej strony, na typ
    obiektu z lewej. Np

    (*(uint8_t*)0x40010C10)=0x00001234;
    to zapisze jeden bajt, 34

    (*(uint32_t*)0x40010C10)=0x9f;
    a to zapisze 0000009f, albo ffffff9f :-)

    > arytmetyki wskaźników?
    > Tzn za następny wskazywany obszar bęzie większy
    > albo o 2 bajty albo o 4, jak w przypadku zwykłej arytmetyki wskaźników

    A to oczywiscie tez. Tylko trzeba umiejetnie wykorzystywac.

    > np
    > uint16_t *ptr; // wskaźnik na liczbę 16 bitową
    > teraz zwiększamy adres o jeden ptr++; czyli tak naprawdę wskaźnik
    > skacze o dwa a nie o jeden adres?

    Tylko wiesz ze nie zapiszesz
    ((uint8_t*)0x40010C10)++)

    ani
    ((uint32_t *) ptr)++;

    Za to mozesz sprobowac
    *((uint32_t *)ptr+1)=1 ;

    A na koniec masz zadanie domowe
    (*((uint32_t **) &ptr))++;

    J.

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: