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



Teraz jest 31 sty 2025, o 00:40


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 18 ] 
Autor Wiadomość
PostNapisane: 10 lut 2013, o 16:56 
Offline
Moderator
Avatar użytkownika

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

ale właśnie w niebieskiej książce masz przykład w jednym z ostatnich rozdziałów, bodajże o UDP. Czy możesz powiedzieć czego nie rozumiesz w tym przykładzie ?

może tak będzie łatwiej ?

_________________
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: 10 lut 2013, o 19:30 
Offline
Moderator
Avatar użytkownika

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

ENOS napisał(a):
Chodzi o sposób deklarowania i jak się odczytuje taka deklarację oraz jak to potem zastosować w praktyce.
Nie rozumiem jednej rzeczy. W niebieskiej książce podczas podczas wywoływania funkcji poprzez wskaźnik nie korzystamy z makra pgm_read_word() natomiast w zielonej już tak. Dlaczego. Pewnie odpowiedź jest prosta ale nie dostrzegam czegoś tutaj.


Byłoby mi dużo łatwiej gdybyś tu wkleił fragment czy linijkę kodu do której masz pytanie z pierwszej i drugiej książki - bo wiesz - ciężko mi się precyzyjnie odnieść - tym bardziej, że w drugiej rzeczywiście jest to robione na KILKA różnych sposobów i to przez wskaźniki w RAM do funkcji we Flash - więc jest to już troszkę hmmm zaawansowane .... wykorzystanie ... ale właśnie też przykład zastosowania

czekam więc na kod i od razu postaram się odnieść do tego co pytasz ok ?

_________________
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: 12 lut 2013, o 11:24 
Offline
Moderator
Avatar użytkownika

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

Aaaaa ;) no to teraz mogę się odnieść do tak precyzyjnego pytania:

ENOS napisał(a):
Przepraszam że dopiero teraz piszę ale nie mogłem wcześniej.
Na stronie 434 (cz 1) jest taki fragment kodu:
Kod:
void (*parse_funk[ILOSC_KOMEND])(char *buf) PROGMEM = {
                          parse_set_led,
                          parse_get_led,
                          parse_set_lcd};


To jest tablica wskaźników do funkcji, z tego co sie dowiedziałem. Ale teraz pytanie, czy ta tablica test w RAM czy Flash? Czy PROGMEM wskazuje że tablica jest we Flashu czy tylko wskaźniki są z Flasha?


Oczywiście że PROGMEM wskazuje (inaczej być NIGDY nie może) że ta zmienna (obojętnie jaka by nie była) .... będzie umieszczona w pamięci FLASH. Nie ma innego wyjścia. Więc jak widzisz jeden problem ci już odpada ;) jest to tablica wskaźników do funkcji i umieszczona jest ona w pamięci FLASH. OK ?

lecimy dalej:

ENOS napisał(a):
Natomiast wywołanie funkcji przy pomocy wskaźnika pokazane jest poniżej na tej samej stronie i ma postac:

Kod:
parse_fun[set_led](reszta)
;

co zrozumiałem że można to zastąpić czymś takim

Kod:
parse_fun[1](reszta)
;

Tak dokładnie jest - bo set_led to tylko typ wyliczeniowy żeby wygodniej patrzeć na kod - od razu widzę jaką funkcję wywołuję, niż gdybym widział z tą jedynką [1].


ENOS napisał(a):
ale dlaczego nie używamy tutaj makra pgm_read_word tak jak w drugiej książce przy okazji komend AT?


a bo ci się teraz pomieszało troszkę - w tej książce zrobiłem prostszą rzecz, czyli tablicę wskaźników do funkcji we FLASH dlatego możemy się odwołać do wskaźnika wprost jak wyżej. Przykładu z drugiej książki teraz nie pokazałeś a szkoda bo znowu ciężko mi się odwołać i ci wytłumaczyć .... bo tam są inne przykłady - tam zdaje się korzystamy z tablicy wskaźników w RAM, i w tej tablicy mamy wskaźnik do Flash - chyba (tak zgaduję bo nie wiem o którym konkretnie przykładzie myślisz) i wtedy nie możemy się odwołać wprost do wskaźnika umieszczonego w RAM ponieważ w ogóle funkcja nie mogłaby być wywołana z RAM - to nie jest pamięć programu przede wszystkim. Dlatego wczytujemy tamten wskaźnik dopiero pgm_read_word() ... ale mówię - lepiej bym podpowiedział gdybyś podał konkretny przykład bo też jest ich w drugiej książce kilka i jak widzisz pokazuję tam hmmm no takie jakby coraz bardziej zaawansowane przypadki korzystania ze wskaźników.

ENOS napisał(a):
I przy okazji czy zapis
Kod:
char (*ptr_funk)(void);
oznacza deklaracje wskaźnika do funkcji czy definicję wskaźnika do funkcji?


oczywiście jest to DEFINICJA ale jednocześnie przez to Deklaracja wskaźnika do funkcji. To jest coś takiego jak definicja zmiennej wskaźnikowej

char *wsk;

tyle że zamiast wskaźnika na typ char mamy tu wskaźnik na funkcję.

------------------------ [ Dodano po: kilkunastu sekundach ]

Lubię takie pytania bo widać jak mocno i fajnie wchodzisz w świat wskaźników ;)

_________________
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: 15 lut 2013, o 13:34 
Offline
Moderator
Avatar użytkownika

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

A oglądałeś lekcje VIDEO z płyty DVD dołączonej do pierwszej książki ? przecież tam wszystko jest - ładnie pokazane na VIDEO...

Szczerze mówiąc to nawet nie za bardzo wiem o co tobie chodzi z tego opisu ale spróbuję zgadnąć, jeśli nie zgadnę to mnie popraw albo dopytaj:

Projekt otwierasz klikając na jego nazwę w okienku po lewej stronie EXPLORER .... przecież tam widać istniejące projekty i się w nie po prostu klika a nie wchodzi w Open Project ok?

Chyba że chcesz stworzyć nowy to używać Create new project

Można także przepięknie importować dowolne projekty z innego workspace nawet tego z DVD ... ale jak mówię no wszystko starałem się pięknie pokazać w 4-5 pierwszych lekcjach VIDEO na tym DVD - więc napisz mi najpierw czy to oglądałeś ok?

a jeśli nie to zajrzyj do prawie dowolnego z moich poradników VIDEO na moim blogu

www.mirekk36.blogspot.com

prawie w każdym wykonuję takie podstawowe operacje

jak to pooglądasz to nawet będzie ci łatwiej i precyzyjniej pytania zadać - dobrze ?

_________________
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: 19 lut 2013, o 10:50 
Offline
Moderator
Avatar użytkownika

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

ENOS ---> pytasz o dwie bardzo RÓŻNE rzeczy z pierwszej i drugiej książki ale w końcu podałeś konkretny przykład z drugiej więc łatwiej jest mi się odnieść teraz, bo troszkę mocno mieszają ci się na razie pojęcia więc podpowiedź ;)

najpierw sam sobie odpowiedz - CO TO JEST ?

Kod:
void (*parse_funk[ILOSC_KOMEND])(char *buf) PROGMEM;


- to jest tablica wskaźników do funkcji w pamięci FLASH (a nie RAM) czy z tym się zgadzasz ? widzisz to ?

a CO TO JEST?

Kod:
TATCMD polecenia_at[6] PROGMEM


- to jest z kolei tablica 6-cio elementowa, w której każdy element jest typu strukturalnego TATCMD i jest ona także umieszczona w pamięci FLASH - widzisz to? zgadzasz się z tym ?

widzisz teraz różnicę w tych tablicach ???

więc skąd pytanie twoje?:

Cytuj:
Pytanie.
Skoro zarówno tablica wskaźników jak i tablica struktur sa umieszczone w pamięci RAM natomiast w pamięci FLASH


Skąd pomysł że tu coś w RAM jest umieszczone - gdzie ty to widzisz ? bo ja nie widzę :(

i teraz tak - skoro masz pierwszy przypadek - tablicę wskaźników do funkcji, to przecież każdy element tej tablicy jest niejako wskaźnikiem na funkcję czyli funkcją

Kod:
(*parse_funk[2])( zmienna );


i tak mogę ją wywołać, bo za pomocą indeksu = 2 od razu odwołuję się do adresu funkcji (wskaźnika funkcji)

tymczasem w drugim przypadku mamy tablicę struktur .... i to gdzieś w tej strukturze jest wskaźnik do funkcji - trzeba więc go wyjąć bo przecież za pomocą indeksu

Kod:
polecenia_at[2]


otrzymujesz jedynie pojedynczy element tej tablicy czyli jakąś strukturę tak? i teraz to z niej trzeba wyjąć adres funkcji, co więcej ten adres jest we FLASH stąd konieczność użycia pgm_read_word() ponieważ wskaźnik jest zawsze 16-bitowy

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

kiedyś pisało się tak w AVR GCC,

Kod:
prog_char *wsk1  ="teks2";


i nie trzeba było nawet PROGMEM dodawać tak jak to ty zrobiłeś, jednak taki zapis nie jest już wspierany i zalecany a znaczył dokładnie to samo co:

Kod:
char *wsk PROGMEM="tekst"


tyle że najnowszy toolchain atmelowski WYMAGA abyś w takim przypadku użył jeszcze specyfikatora const czyli

Kod:
const char *wsk PROGMEM="tekst"


teraz jaśniej ?

_________________
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: 19 lut 2013, o 14:47 
Offline
Moderator zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 18 lip 2012
Posty: 3210
Lokalizacja: Kraków - obok FAB5 ATMEL'a
Pomógł: 91

ENOS napisał(a):
Nie do końca, ale podstawowa spraw dla mnie to czy tu w ogóle można o coś zapytać?
Jeśli tak to podrążę temat ale jeśli nie to po prostu powiem dziękuje.
Skąd wrażenie że nie do końca można? Z odpowiedzi typu: CO TO JEST ? czy z tym się zgadzasz ? widzisz to ? a CO TO JEST? itd.

Właśnie nie widzę tego w jaki sposób ja Ty! Ale czy to od razu oznacza że należy mnie skreślić, dlaczego skreślić zapytasz, więc odpowiedz jest w akapicie wyżej.

?


Oj, nie zwracaj na to uwagi. Po prostu Mirek ma taki specyficzny sposób pisania.
Nie należy się tym zrażać.

Pytaj o co chcesz, nie zwracaj uwagi na formę tylko na treść. :lol:

_________________
http://www.jaglarz.info



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lut 2013, o 17:16 
Offline
Moderator
Avatar użytkownika

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

Po pierwsze - na prawdę posłuchaj Jaglarza powyżej ;) .... ja jestem zszokowany że tak można odbierać moje wypowiedzi :( .... ja się tam nie znam na netykiecie i tym co znaczą jakieś duże litery albo za duża ilość znaków zapytania - za stary już jestem i nie będę się uczył - więc darujmy sobie tutaj domyślania że ja coś tam, że czy ty możesz coś tam - daj pan spokój ;) pisz śmiało i pytaj - toż gdybym zaraz SKREŚLAŁ jak piszesz - to przecież bym chyba nie odpowiadał ... czy jak ... dobra bo marnuję czas.....
------------------------

Kod:
char *wsk;


Cytuj:
Jest to przecież zmienna w RAM, która przechowuje adres czegoś, na razie nie wiem czego bo jest bez przypisania.


no więc widzisz w niebieskiej książce masz to opisane i to nawet z rysunkami ....

zajrzyj proszę do książki hmmm sam muszę poszukać..... chwila ... mam - str 154

toż przecież masz tam od góry IDENTYCZNY przykład praktycznie

Kod:
int *w;


i zaraz na kolejnych stronach masz rysunki ... tzn pytam, bo może przeoczyłeś ? a nie chciałbym od nowa tego tutaj przepisywać więc daj znać proszę OK ?

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

Kod:
char *wsk PROGMEM="tekst";


Cytuj:
i znów sama zmienna przechowująca wskaźnik jest w RAM, ale jest zainicjowana adresem we flash, czy tak? czy nie?


no niestety to nie jest zmienna w RAM zainicalizowana we flash

PAMIĘTAJ, zawsze jak widzisz PROGMEM to oznacza to że zmienna jest w pamięci FLASH nigdy inaczej. A jak to przeczytać pewnie się zastanawiasz?

jest to: wskaźnik o nazwie wsk, na tablicę znaków zainicjalizowaną napisem "tekst", przy czym wskaźnik ten umieszczony zostanie zgodnie z DEFINICJĄ w pamięci FLASH ponieważ widzisz tu PROGMEM.

------------------------ [ Dodano po: 5 minutach ]

ENOS napisał(a):
PS
void (*parse_funk[ILOSC_KOMEND])(char *buf);
A dlaczego pisałeś że we FLASH? Przecież to jest wskaźnik do funkcji z możliwością przypisania więc w RAM.
W czasie pracy programu mogę do niego przypisać rożne (zgodne parametrami) funkcje. Fakt jest tam PROGMEM, ale ważne do czego on się tyczy? Tego właśnie nie wiem?


No i tu to samo ci się plącze - co z tego że wskaźnik ma możliwość życia w RAM ale ma możliwość też życia we FLASH ;) więc skoro było w kodzie słówko PROGMEM to znaczy że tablica tych wskaźników byłaby umieszczona we FLASH a nie w pamięci RAM.

W trakcie pracy nic nie przypiszesz jeśli jest we FLASH, powiem więcej - ponieważ jest we FLASH to przypisania wskaźników z tego powodu TRZEBA dokonać już na etapie DEFINICJI.

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

coś ci powiem, widzę że na razie nie rozumiesz podstaw wskaźników więc troszkę na tym etapie rzucasz się na zbyt głęboką wodę jednak z tymi pytaniami.

A ja już widzę gdzie masz problem - po prostu na razie nie wiesz nawet co oznacza typ wskaźnika .... jeśli wiesz to napisz , a jeśli nie wiesz to w dziale zagadki i łamigłówki na forum kiedyś prezentowałem taką fajną łamigłówkę pomagającą w zrozumieniu do czego odnosi się TYP wskaźnika - bo tu wszyscy pierwsze zęby zjadają na wskaźnikach

aha no i obejrzyj proszę te rysunki w książce gdzie ci podałem - spróbuj się do nich odnieść i ew zadać kolejne pytania żeby zaczynać rozumieć podstawy wskaźników - a dopiero później przejdziemy do wskaźników do funkcji itp ok?

_________________
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: 21 lut 2013, o 10:42 
Offline
Moderator
Avatar użytkownika

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

ale pisałem wyżej że w starszych wersjach AVR GCC używało się prog_char a teraz używa się PROGMEM a nie że mieszasz ;)

To co piszesz wyżej o tym żeby zrozumieć zmienne we flash, że w innych prockach pamięć jest jednolita itp .... to właśnie pisałem w książce że tu jest inaczej i nawet rysunki pokazałem. Najważniejsza różnica od tych innych procków jest taka że adresowanie każdej pamięci zaczyna się od adresu ZERO

więc jak byś chciał odróżnić czy zmienna pod adresem np 0x100 jest we FLASH, RAM czy może EEPROM ????

no tu właśnie leży pies pogrzebany że wprowadzono specjalne metody odczytu i zapisu do różnych pamięci. Tzn gdy się odwołamy tak

Kod:
uint8_t zmienna;


bez żadnego specyfikatora to oznacza to pamięć RAM,

ale jeśli chcesz umieścić ją we FLASH to musisz napisać w najnowszym toolchainie tak:

Kod:
const uint8_t zmienna PROGMEM = 44;


czyli dodać specyfikator const, bo jak mówisz nie można jej modyfikować później ale też opatrzyć słówkiem PROGMEM żeby kompilator wiedział w której pamięci ją umieścić rozumiesz ? konkretnie we FLASH skoro progrem. I proszę już nie mieszaj tu tego starego oznaczenia prog_char - zapomnij o nim.

natomiast jeśli chcesz zmienną w EEPROM to

Kod:
uint8_t zmienna EEMEM;


czyli dodajesz słówko EEMEM .... no to tyle ... i każda ląduje czy jest umiejscawiana tam gdzie każesz kompilatorowi.

Oczywiście coś za coś - umiesz już je wkładać do pamięci z poziomu kompilacji ale okazuje się że także ich odczyt jest różny z każdej pamięci. Najmniej problemów jest z odczytem z RAM ot po prostu

Kod:
uint8_t zmienna1 = 10;

uint8_t zmienna2 = zmienna1;


nic nie trzeba kombinować. Za to aby odczytać zmienną (tak na prawdę stałą) z pamięci FLASH to musisz użyć poleceń typu:

Kod:
const uint8_t zmienna1 PROGMEM = 10;
zmienna2 = pgm_rad_byte( &zmienna1 );


i podobnie inne funkcje będą do odczytu z EEPROM - właśnie z tego względu wspólnej przestrzeni adresowej dla każdego rodzaju pamięci.

dlatego pytanie nie jest głupie i zarówno w książce (np rozdział o multipleskowaniu wyświetlaczy LED - pewnie sobie go nie przeczytałeś niestety :( ) ale także tu wyżej pokazuję ci jak sobie "zobaczyć" te zmienne z FLASH itp

------------------------ [ Dodano po: 3 minutach ]

aha ;) piszesz że jak zrozumiesz zmienną we FLASH .... ale pewnie wciąż ci chodzi po głowie że skoro posługujemy się nazwą zmienna to pewnie mamy na myśli fakt że można ją modyfikować w trakcie programu ? ;) .... ano normalnie nie można ... dlatego najnowszy toolchain nakazuje wręcz umieszczanie const jak pokazałem ci wyżej ... więc tak na prawdę to STAŁA...

ale za jakiś czas w poradniku VIDEO pokażę wszystkim że jednak można z pamięci FLASH w prockach AVR pisząc kody w języku C traktować tę pamięć także podobnie jak np EEPROM czyli że będzie można modyfikować zmienne we flash - no ale teraz nie będę o tym pisał żeby nie zrobić mętliku w głowie ;)

_________________
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: 21 lut 2013, o 14:10 
Offline
Moderator
Avatar użytkownika

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

Nie traktuj w razie czego moich wypowiedzi jakbym chciał ci coś dogadać czy wytykać, że nie dokładnie czytasz itp ... po prostu zwracam uwagę, że też jest trochę o tym i o tamtym w książce ... i zdaję sobie sprawę , że to nie łatwo tak od razu ogarnąć a tym bardziej jeśli jeszcze nie ma skorowidza :( moja wina .... ale zawsze można się posiłkować tym skorowidzem, który stworzył do pierwszej książki kolega Jaglarz .... w razie czego ;) ... któremu przy okazji dziękuję jeszcze raz za kawał dobrej roboty.

_________________
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: 22 lut 2013, o 08:21 
Offline
Moderator
Avatar użytkownika

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

No dobrze - skoro już pokazujesz fragment kodu asemblera to domniemuję że znasz asemblera, bo inaczej po co się na niego powoływać. Tymczasem nawet już nie patrząc na komentarze, które kompilator ci pięknie wstawił - widać rozkaz asemblerowy

ICALL

możesz sobie przeczytać do czego on służy ? na wszelki wypadek podam fajny link

http://elportal.pl/ea/asm_avr_jezyk.html

ale spójrz też na komentarze

Cytuj:
Load direct from data space


co to oznacza ? pobieranie adresu z FLASH ;) ... i teraz tylko zobacz co robi ICALL

i wyjaśnij dlaczego piszesz że niby funkcja w jakiś sposób wywoływana jest wg ciebie z RAM ??? zachodzę w głowę.

_________________
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: 22 lut 2013, o 11:53 
Offline
Moderator
Avatar użytkownika

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

;) a co ma nie mieć siły - nie przesadzaj ;)

więc jeszcze raz - bo widzę, że źle doczytałeś o tym rozkazie ICALL i rejestrach indeksowych. Panie kolego NIE jest pobierany adres z pamięci RAM, to jest REJESTR INDEKSOWY pobierający adres z FLASH ;) .... rozumiesz ... więc tu cię mam i sam się masz ;) Więc nie dość, że pobiera adres z FLASH to jeszcze skacze pod ten adres do FLASH ..... poczytaj sobie o rejestrach indeksowych w AVR są 3 i każdy ma nieco inną funkcjonalność. I właśnie może to że dawno nie używałeś asemblera sprowadza cię na złe tory .... poza tym w ogóle można tu pominąć rozważania asemblerowe bo po co w ogóle ? I tak funkcja nie MOŻE Być wywołana z pamięci RAM bo to nie pamięć programu ....

ale jak coś jeszcze nie jasne to wal śmiało aż wydrążysz ... ja tam mam cierpliwość.

_________________
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: 22 lut 2013, o 17:05 
Offline
Moderator
Avatar użytkownika

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

Jest to w asm "indirect call" ;) .... i poza WSZYSTKIM - oczywiście że adres funkcji z tablicy pamięci flash został skopiowany do rejestru indeksowego - można powiedzieć w pamięci RAM ale skok do FUNKCJI może się ODBYĆ TYLKO I WYŁĄCZNIE do FLASH, słyszałeś kiedyś aby kod można było w AVR'ach wykonywać z pamięci RAM???

Na prawdę jak tak by człowiek chciał rozpatrywać na co przetłumaczył C do asemblera to ...... szkoda gadać ;) na jednym procku przetłumaczy tak na innym inaczej, a nawet jak się zmieni kontekst programu to jeszcze inaczej. Być może - za bardzo masz na razie włączone myślenie asemblerowe i to ci przeszkadza ;)

Idąc tą drogą to można by zacząć próbować rozważać jeszcze głębiej co się dzieje w samej strukturze procka na tafli krzemowej - tylko PO CO ? ;)

strasznie sobie utrudniasz życie tak próbując podejść - to tak jak niedawno w innym wątku jeden kolega wszystko przyrównywał sobie do Bascoma bo to jego znał. Tak nie można , język C to całkiem inny język niż Bascom czy asembler ....

więc jeszcze raz - REASUMUJĄC - co z tego , że adres funkcji został wrzucony do rejestru indeksowego ???? a ty jeszcze się posuwasz dalej i twierdzisz że do RAM - bo przecież rejestry umieszczone są w obszarze pamięci RAM....

Z drugiej strony nawet jeśli programowałeś w asemblerze to troszkę się dziwię , że nie znasz ICALL .... hmm może inaczej - że dopuszczasz myśl że funkcja może być wywołana z pamięci RAM ???? (chyba że cię źle zrozumiałem - ale to poprawisz mnie)

przy okazji jeszcze raz - chociaż już dawałem ci linka:

Obrazek

_________________
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: 23 lut 2013, o 18:34 
Offline
Moderator
Avatar użytkownika

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

Nie wiem czy dobrze myślisz niestety - bo np nie zgodzę się z tłumaczeniem, że

Kod:
parse[1]();


to jakiś wskaźnik w RAM ... to akurat jest wskaźnik we FLASH i koniec ;) nie ma innej możliwości w tym konkretnym przypadku. To w drugiej książce właśnie pokazywałem za to mix gdzie tworzyłem wskaźnik w RAM zawierający tak na prawdę UWAGA wskaźnik do funkcji we Flash

a to że w kodzie asemblerowym wywołanie powyżeszej funkcji: parse[1](); jest realizowane przez ICALL - jeszcze raz powtórzę - nie ma nic wspólnego ze wskaźnikiem w RAM ;) dlatego że WYRAŹNIE widać że

Kod:
void (*parse[])(void)PROGMEM...


to tablica wskaźników akurat w pamięci FLASH a nie RAM.

(no chyba że ja ciebie źle rozumiem? - ale trzymając się terminologii języka C - na pewno nie ma tu wskaźnika w RAM)

_________________
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: 25 lut 2013, o 15:24 
Offline
Moderator
Avatar użytkownika

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

No to jak chcesz wyjść z punktu wyjścia - to wystarczy zrobić maleńką rzecz - maleńką ;)

- przestań patrzeć na kod asemblera skoro i tak go nie znasz dokładnie dla AVR .... bo tak tylko sobie sam kłopot robisz tłumacząc że ICALL coś tam do RAMu wczytuje co niestety jest całkowicie oderwane od rzeczywistości języka C :(

_________________
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: 28 lut 2013, o 14:42 
Offline
Moderator
Avatar użytkownika

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

Proszę cię bardzo ;)

RAM FLASH
_____ ______
| ra1 | | fa1 |
--------- -------
| ra2 | | tablica wskaźników do funkcji void (*parse[])(void)PROGMEM |
--------- -------
| ra3 | | fa3 |
--------- -------
| ra4 | |funkcja1|
--------- --------
| ra5 | |funkcja2|
--------- --------

------------------------ [ Dodano po: 1 minucie ]

oczywiście strzelam sobie jak kulą w płot że to akurat w tym miejscu ;) ale to chyba rozumiesz ? że kompilator sam sobie ustala dokładne adresy zarówno tych funkcji jak i tablicy wskaźników.

_________________
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: 1 mar 2013, o 11:59 
Offline
Moderator
Avatar użytkownika

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

teraz to się, że tak powiem "przewskaźnikowałeś" ;)

jaki wskaźnik parse ??? przecież parse to TABLICA wskaźników - nie mamy tu do czynienia ze wskaźnikiem parese, po prostu źle czytasz

wskaźnik parse miałbyś przy takim zapisie

void * parse;

a to nie to samo co tablica wskaźników do funkcji

void (*parse[])( void );

Wywołujemy funkcję inaczej niż z tablicy struktur bo przecież tu MASZ tablicę wskaźników do funkcji konkretnego typu czyli WSKAŹNIKI WPROST do tych funkcji

a w tablicy struktur nie masz wprost tych wskaźników do funkcji tylko są one pochowane jeszcze w samych strukturach i dlatego trzeba je wyłuskać - owszem można byłoby je wyłuskiwać teoretycznie w jednej linii ale byłaby ona już bardzo karkołomna - i zagmatwana dlatego wolałem powołać do życia oddzielny wskaźnik do funkcji i wczytywać do niego adres funkcji z konkretnej struktury w konkretnym elemencie tablicy tych struktur. Właśnie za pomocą pgm_read.....

_________________
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: 11 mar 2014, o 23:24 
Offline
Użytkownik

Dołączył(a): 05 gru 2013
Posty: 246
Pomógł: 0

mirekk36 napisał(a):
tyle że najnowszy toolchain atmelowski WYMAGA abyś w takim przypadku użył jeszcze specyfikatora const czyli


Hmm... Czy w związku z tym da się w jakiś sposób umieścić tablicę wskaźników do funkcji w pamięci flash? Jeśli tak, to gdzie w tym przypadku powinien znajdować się specyfikator "const"?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 mar 2014, o 23:26 
Offline
Moderator
Avatar użytkownika

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

Atlantis napisał(a):
Hmm... Czy w związku z tym da się w jakiś sposób umieścić tablicę wskaźników do funkcji w pamięci flash? Jeśli tak, to gdzie w tym przypadku powinien znajdować się specyfikator "const"?


A może by tak warto zajrzeć czasem na mój blog ? ;) np tutaj:

http://mirekk36.blogspot.com/2013/11/ta ... ogmem.html

to pewnie kolega znajdzie odpowiedź na swoje pytanie ;)

_________________
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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 18 ] 

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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO