Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

struktura w C

Sławek5
-
-
Posty: 485
Rejestracja: 15 sie 2003, o 16:40
Lokalizacja: Szczecin
Kontaktowanie:

struktura w C

Postautor: Sławek5 » 17 gru 2008, o 07:15

Cześć.
Chaiłem Was prosić o pomoc w interpretacji zapisu w języku C.
Spotkałem się z takim zapisem

Kod: Zaznacz cały

typedef struct S_TC { int dana1; int dana2; ... } *PS_TC;
potem jest napisane coś takiego

Kod: Zaznacz cały

#define TC ((PS_TC)0xAAA10)

Dowolna liczba w zapisie HEX


Co to oznacza, jak to odczytać?

tg3a
-
-
Posty: 243
Rejestracja: 26 maja 2008, o 19:46
Lokalizacja: Warszawa

Postautor: tg3a » 17 gru 2008, o 09:04

Witam.
Powyższy kod oznacza to, co następuje:
- najpierw został zdefiniowany typ PS_TC jako wskaźnik do określonej struktury (składającej się z pól int dana1, int dana2 ...).
- dyrektywa #define definiuje słowo TC (bardziej naukowe określenie to "literał") jako wartość 0xAAA10 rzutowaną na ten typ wskaźnikowy. Mówiąc bardziej "po ludzku", kompilator każde następne użycie tego "literału" TC będzie zamieniał na adres 0xAAA10 traktowany jako wskaźnik do struktury o polach int dana1, int dana2 ... , czyli będzie wiedział, że pod takim adresem jest zmienna zawierająca takie pola, i w związku z tym zajmująca określoną wielkość pamięci (a ogólniej przestrzeni adresowej). Gdyby to była pamięć RAM, nic w niej już dzięki temu nie umieści; podejrzewam jednak, że raczej jest to jakaś struktura rejestrów sterujących mikrokontrolera (pewnie Timer/Counter), mapowana na wspólną przestrzeń adresową, ale będąca poza zakresem przeznaczonym na RAM i inne rodzaje pamięci.
Mam nadzieję, że to, co napisałem jest w miarę zrozumiałe. Zresztą te moje ostatnie uwagi nie są już zbyt istotne dla samego problemu, miały tylko nieco poszerzyć zakres zrozumienia problemu w kontekście architektury procesora/mikrokontrolera.
Pozdrawiam, i życzę powodzenia w zmaganiach z językiem C oraz mikrokontrolerami.

Sławek5
-
-
Posty: 485
Rejestracja: 15 sie 2003, o 16:40
Lokalizacja: Szczecin
Kontaktowanie:

Postautor: Sławek5 » 17 gru 2008, o 09:45

A dlaczego podczas użycia ((PS_TC)0xAAA10)
nie jest zastosowana gwiazdka jako wskazanie że ma to być wskażnik?


Ja to rozumiem tak że każde wystąpienie jest zamieniane na cąg znaków ((PS_TC)0xAAA10).
Ja kiedys spotkałem się z takim zapisem (unsigned char*)0x38 podczas dostępu do portów.

tg3a
-
-
Posty: 243
Rejestracja: 26 maja 2008, o 19:46
Lokalizacja: Warszawa

Postautor: tg3a » 17 gru 2008, o 11:59

Bo gwiazdka stoi przed identyfikatorem deklarowanego typu, z czego wynika, że jest to typ wskaźnikowy. Gdyby tam nie było gwiazdki, to rzeczywiście rzutowanie wyglądałoby analogicznie jak w Twoim przykładzie, czyli (PS_TC*). Ze względu na praktyczne reguły dobierania nazw w taki sposób, by sam początek już coś mówił, nie zastosowanoby zresztą zapewne litery P na początku (bo nie byłby to typ wskaźnikowy, tylko strukturalny), i w takim wypadku nazywałby się on S_TC.
Jeśli porty są traktowane na zasadzie "każdy sobie", a nie tworzą określonej struktury (tzn. nie jest tak, że np. występują zawsze trójkami, i powiedzmy pierwszy daje możliwość odczytu stanu linii, drugi określa kierunek linii portu, a trzeci stan wyjścia dla kierunku wyjściowego), albo tę strukturę ignorujemy, to rzeczywiście wystarczy określać dostęp do portów w taki sposób, jaki podałeś. Jeśli natomiast zadeklarujemy strukturę, to wtedy możemy do poszczególnych rejestrów w ramach struktury odwoływać się poprzez nazwy pól, czyli powiedzmy w naszym wypadku TC->dana1 lub TC->dana2. Ma to swoje wady i zalety.
Pozdrawiam.

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 89 gości