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



Teraz jest 20 kwi 2024, o 13:45


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 41 ]  Przejdź na stronę Poprzednia strona  1, 2
Autor Wiadomość
PostNapisane: 21 maja 2020, o 21:33 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

Trochę namieszałeś.
W funkcji main wywołujesz bezpośrednio display_init();
w pętli while ponownie ją wywołujesz ale przez callback, po czym dopiero ją rejestrujesz,
Funkcja display_init jest bez argumentów a w callbacku masz argument typu uint8_t
To powinno wyglądać mniej więcej tak:
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: 22 maja 2020, o 11:50 
Offline
Użytkownik

Dołączył(a): 05 gru 2017
Posty: 408
Lokalizacja: Puck
Pomógł: 7

Czy dobrze dedukuję że te dwa collbacki będą na przemian wywoływane ?

auers napisał(a):

while(1) {

register_start_screen_callback( display_init ); // najpierw rejestracja callback'a
if( start_screen_callback ) start_screen_callback(); //dopiero póżniej jego wywołanie

register_start_screen_callback( inny_display ); // teraz rejestracja innego callback'a
if( start_screen_callback ) start_screen_callback(); //dopiero póżniej jego wywołanie

}

}


a displeye będą przełączane z prędkością wykonywanej pętli ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 maja 2020, o 12:01 
Offline
Użytkownik

Dołączył(a): 14 sie 2016
Posty: 905
Pomógł: 39

Dobrze myślisz, ekrany będą się zmieniać z prędkością światła. W oryginale taka konstrukcja jest przy okazji sterowania menu z pilota.

Wysłane ze srajfona

_________________
Moje porady są błędne,nie czytać,zbanować od razu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 maja 2020, o 13:15 
Offline
Moderator
Avatar użytkownika

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

miki53 napisał(a):
Czy dobrze dedukuję że te dwa collbacki będą na przemian wywoływane ?

auers napisał(a):

while(1) {

register_start_screen_callback( display_init ); // najpierw rejestracja callback'a
if( start_screen_callback ) start_screen_callback(); //dopiero póżniej jego wywołanie

register_start_screen_callback( inny_display ); // teraz rejestracja innego callback'a
if( start_screen_callback ) start_screen_callback(); //dopiero póżniej jego wywołanie

}

}




a displeye będą przełączane z prędkością wykonywanej pętli ?


ale to jest nonsens - tzn szczególnie te dwie linie na czerwono - to się robi REJESTRACJĘ TYLKO RAZ przed pętlą główną. A w pętli oczywiście na upartego można tak wywoływać te callbacki ale jednak lepiej je wywoływać TYLKO wtedy gdy trzeba a nie jak pisał Harry miliard razy na sekundę i najczęściej niepotrzebnie.

_________________
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 maja 2020, o 14:37 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

Nie będą przelatywały z prędkością światła bo w samych procedurach display są delaye.
Natomiast zastosowanie jest bez sensu, ale tu nie chodziło o sens tego programu tylko pokazanie jak podmienić callback ( funkcję ).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 maja 2020, o 15:17 
Offline
Użytkownik

Dołączył(a): 14 sie 2016
Posty: 905
Pomógł: 39

Nie zauważyłem delayi :P
Ale i tak wiadomo o co chodzi.

Wysłane ze srajfona

_________________
Moje porady są błędne,nie czytać,zbanować od razu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 maja 2020, o 17:21 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

miki53 napisał(a):
Czy dobrze dedukuję że te dwa collbacki będą na przemian wywoływane ?

Tak, bo taki był cel.
Cytuj:
ale to jest nonsens - tzn szczególnie te dwie linie na czerwono - to się robi REJESTRACJĘ TYLKO RAZ przed pętlą główną. A w pętli oczywiście na upartego można tak wywoływać te callbacki ale jednak lepiej je wywoływać TYLKO wtedy gdy trzeba a nie jak pisał Harry miliard razy na sekundę i najczęściej niepotrzebnie.

Akurat w tym przykładzie te czerwone linie są potrzebne, inaczej funkcje nie będą się wywoływać naprzemiennie, a o to tu chodziło.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 maja 2020, o 19:18 
Offline
Użytkownik

Dołączył(a): 05 gru 2017
Posty: 408
Lokalizacja: Puck
Pomógł: 7

Myślę że załapałem jak to z tymi callbackami jest
Ale poprawcie mnie jeśli się mylę

callbackem nazywamy komórkę w pamięci do której jest zapisywany i odczytywany adres funkcji

ZASADA DZIAŁANIA
---------------------
ustawiamy callbacka czyli komórkę pamięci do której będziemy zapisywać i odczytywać adres funkcji
void (*funkcja)(void);
----------------------------------
deklarujemy funkcję

void funkcja_LED_ON(void)
void funkcja_LED_OFF(void)
---------------------------------
wywołujemy docelową funkcję

funkcja w której zastosujemy callback czyli ON/OFF_LED na jednym klawiszu
void funkcja ON/OFF_LED(void){

wykonaj LED_ON zapal LED

zmień adres funkcji w callback ( w komórce pamięci z adresu funkcji void funkcja_LED_ON(void) na adres void funkcja_LED_OFF(void) )
funkcja= void funkcja_LED_OFF(void) -nasz callback
}
-----------------------------------------------------------------------
Ponowne wywołanie funkcji

funkcja w której zastosujemy callback czyli ON/OFF_LED na jednym klawiszu
void funkcja ON/OFF_LED(void){

wykonaj LED_OFF zgaś LED

teraz led jest zgaszony aby go ponownie zapalić musimy znowu zamienić w callback adres funkcji
która nam ją zapali czyli
funkcja= void funkcja_LED_ON(void) -nasz callback
}
--------------------------------------------------------------------------------------------
Czyli w CALLBACK (komórce pamięci wpisujemy adresy funkcji do której chcemy się dostać, potem
w tej funkcji wywołanej znowu w callback zmieniamy adres na inną funkcję i skaczemy do innej funkcji )

Mam nadzieję że zabardżo nie namieszałem



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 maja 2020, o 20:00 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

miki53 napisał(a):
callbackem nazywamy komórkę w pamięci do której jest zapisywany i odczytywany adres funkcji
Można tak powiedzieć. Jest to zmienna typu wskaźnik do której której jest zapisywany/odczytywany adres funkcji.
miki53 napisał(a):
ustawiamy callbacka czyli komórkę pamięci do której będziemy zapisywać i odczytywać adres funkcji
void (*funkcja)(void);
To jest deklaracja wskaźnika. Jeszcze nic nie ustawiamy, ale tak w pamięci jest rezerwowane miejsce na przechowywanie adresu funkcji.

Co do działania tego przykładu.
linia:
funkcja =funkcja_LED_ON; Rejestruje pierwszego callbacka. Jeszcze nie wywołuje funkcji tylko przekazuje adres która funkcja ma być wywołana.
Calback jest wywoływany w funkcji obsługi klawisza key_event().
miki53 napisał(a):
Czyli w CALLBACK (komórce pamięci wpisujemy adresy funkcji do której chcemy się dostać, potem
w tej funkcji wywołanej znowu w callback zmieniamy adres na inną funkcję i skaczemy do innej funkcji )
tylko zmieniamy adres, ustawiamy nową funkcję do kolejnego wykonanie, ale jeszcze jej nie wywołujemy Wywołanie następuje w zdarzeniu key_event w lini:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Tu podmiana callbacków jest zrealizowana w funkcjach LED_ON, LED_OFF ale, to jest tylko przykład.
W zależności od potrzeb callbeck może być np ustawiony/zarejestrowany np. tylko raz w programie przed pętlą główną while, ale może być zmieniany w dowolnym innych miejscu w programie.
Wszytko w zależności od ewentualnych potrzeb.

------------------------ [ Dodano po: 7 minutach ]

miki53 napisał(a):
Mam nadzieję że zabardżo nie namieszałem

Chyba nie namieszałeś i wygląda że załapałeś. Zwróć tylko uwagę, że w tym przykładzie callback jest przypisany bezpośrednio, natomiast Mirek w swoich bibliotekach i przykładach używa do tego funkcji rejestrującej, tak jak to jest w kolejnym przykładzie z tą pętlą która na przemian wywoływała dwie funkcje display.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 maja 2020, o 20:57 
Offline
Moderator
Avatar użytkownika

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

auers napisał(a):
To jest deklaracja wskaźnika. Jeszcze nic nie ustawiamy, ale tak w pamięci jest rezerwowane miejsce na przechowywanie adresu funkcji.

Pewnie przejęzyczył się po prostu kolega auers więc ja tylko tak dla porządku - żeby się później nie mieszało początkującym, to jest DEFINICJA wskaźnika a nie deklaracja.

_________________
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 maja 2020, o 21:22 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

mirekk36 napisał(a):
ja tylko tak dla porządku - żeby się później nie mieszało początkującym, to jest DEFINICJA wskaźnika a nie deklaracja.

I słusznie, porządek musi być. Skoro jest rezerwacja pamięci to jest to DEFINICJA.



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: 41 ]  Przejdź na stronę Poprzednia strona  1, 2

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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