Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 28 lut 2026, o 08:17


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 13 sie 2012, o 10:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 kwi 2012
Posty: 195
Pomógł: 0

Witam, mam takie pytanko czy dobrze zrozumiałem omawiany temat ?

Na stronie 136 napisano jak automatycznie można uzyskać efekt "przedstawienia się" mikrokontrolera używając dyrektyw :

Kod:
#define TOSTRING(a) STRINGX (a)
#define STRINGX(a)  #a


czy teraz odwołując się w programie np.

TOSTRING(MCU) uzyskam string np. "atmega32" ?? bo napisano, że "...makro TOSTRING najpierw pobierze parametr jaki się kryje się pod przekazywaną nazwą ( rozumiem że pod MCU ) i przekaże go do STRINGX(a). Wtedy zadziała rozwinięcie drugiej makrodefinicji która naszą nazwę procesora zamieni na string...."

Wydaje mi się że czegoś tu nie rozumiem wg mnie to zadziała tak samo jak
Kod:
#define TOSTRING(a) #a


Z góry dziękuję za pomoc



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 sie 2012, o 12:14 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

No nie rozumie kolega i nie jest to to samo ;) Tyle że ja bym na prawdę szczerze polecał zrobić sobie ćwiczenie praktyczne i wyświetlić efekt takich przypuszczeń np na LCD

a zobaczyłbyś wtedy że w wyniku tego co ci się wydaje zobaczysz MCU zamiast ATMEGA32

ale hmm dziwi mnie to co piszesz bo w książce dokładnie na tejże stronie wyjaśniam dlaczego tak się dzieje - nie doczytałeś ? czy nie zrozumiałeś tego co tam dalej jest napisane ?

jeśli masz

Kod:
#define TOSTRING(a) #a


i w kodzie napiszesz

Kod:
TOSTRING(MCU)


to jako wynikowy string dostaniesz MCU

a jeśli napiszesz tak:

Kod:
#define TOSTRING(a) STRINGX (a)
#define STRINGX(a)  #a


i w kodzie dasz

Kod:
TOSTRING(MCU)


to w pierwszej linii makra najpierw nazwa MCU zostanie rozwinięta do ATmega32 i przekazana jako parametr do STRINGX(a) dzięki czemu efektem końcowym będzie

ATmega32

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 sie 2012, o 13:16 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 kwi 2012
Posty: 195
Pomógł: 0

Mirku trafiłeś w sedno ! Doczytać doczytałem - problem ze zrozumieniem mam.

Jeśli założymy że zmienna nazwy procesora w pliku makefile ma następującą definicję:

Kod:
char MCU[]={"Atmega 32"};


To wtedy makro
Kod:
#define TOSTRING(a) STRINGX(a)

pobierze jak gdyby ciało zmiennej MCU ??
I wtedy
Kod:
#define STRINGX(a) #a

dokona podstawienia ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 sie 2012, o 13:25 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

Ale przecież ta "zmienna" jak o nie napisałeś z makefile nie ma żadnej takie postaci jak sobie tutaj wymyśliłeś ;)

char MCU[] ..... itd

zapomnij o tym ;)

MCU to stała tekstowa z makefile i jest to obrabiane na etapie kompilacji przez preprocesor a nie na etapie kodu programu ;) żeby jakieś tam char MCU[] się tworzyło

to tak samo jak stała F_CPU w makefile - rozumiesz ? tyle że F_CPU jest stałą dosłowną liczbową

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 sie 2012, o 13:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 kwi 2012
Posty: 195
Pomógł: 0

OK. ja chyba nie do końca rozumiem zapis :)
Kod:
#define TOSTRING(a) STRINGX(a)

Jak ..." pierwsze makro TOSTRING najpierw pobierze parametr jaki się kryje pod przekazywaną nazwą "...
bo zapis
Kod:
#define STRINGX(a) #a

jest dla mnie zrozumiały

P.S. Mam nadzieję że za mocno nie "truję" - po prostu jest to dla mnie niejasne a chciałbym zrozumieć. Jeśli gdzieś dalej w książce jest jakiś przykład, który mi to rozjaśni to ok - nie ma tematu . Po po prostu nie chcę się uczyć na zasadzie: "tak zrób bo tak jest i być musi"



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 sie 2012, o 14:02 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

Nie - nie trujesz ;) - pytaj śmiało do bólu

(ale przy okazji zajrzyj też tutaj bo tam mam prośbę do ciebie:

post12501.html#p12501)

----------------------

posłuchaj makro

Kod:
#define TOSTRING(a) STRINGX(a)


dostaje najpierw do obróbki nazwę MCU (bo pod taką zdefiniowana jest nazwa procka) .... Więc w tym kroku TOSTRING(a) trafia owa nazwa MCU i zostaje ona rozwinięta do nazwy ATmega32 żeby przekazać ją dopiero do STRINGX(a)

dopiero wtedy może się wykonać drugie makro STRINGX(a) #a ponieważ ma ono już to o co nam chodziło czyli nazwę ATmega32 a nie nazwę MCU

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 sie 2012, o 14:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 kwi 2012
Posty: 195
Pomógł: 0

Zrozumiałem :) bardzo dziękuję

P.S. Dane kontaktowe wysłałem na Państwa maila



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lut 2015, o 00:18 
Offline
Użytkownik

Dołączył(a): 26 kwi 2012
Posty: 67
Lokalizacja: Drawski / Gorzów
Pomógł: 0

Odgrzeję stary temat. Mam problem z podstawieniem przez preprocesor wartości zamiast MCU (czyli w moim przypadku atmega328p) - podstawia mi dosłownie MCU i wysyła na RSa. Z parametrem F_CPU nie ma problemu - to samo makro podstawi wartość kwarca. Spotkaliście się z takim przypadkiem?

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 maja 2015, o 19:06 
Offline
Nowy

Dołączył(a): 18 kwi 2015
Posty: 1
Pomógł: 0

Odpowiedz troche z poslizgiem ;) wiec pytanie pewnie juz nie aktualne. Zaryzykuje jednak...

....prawdopodobnie chodzi o ustawienienie Eclipsa bo kod jest ok. Mirek to wyjasnia na stronach 141/142 swojej niebieskiej ksiazki:

Project --> Properties --> drzewko C/C++Build --> Settings -->
dalej w zakladce Tool settings (kolejne drzewko) --> AVRCompiler --> Miscellaneous --> po prawej w "Other flags" wpisac: -DMCU=$(AVRTARGETMCU)

Mialem ten sam problem i pomoglo od razu.
Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 maja 2015, o 22:07 
Offline
Użytkownik

Dołączył(a): 26 kwi 2012
Posty: 67
Lokalizacja: Drawski / Gorzów
Pomógł: 0

Dziękuję za pomoc. To było to ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO