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



Teraz jest 28 mar 2024, o 14:44


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 
Autor Wiadomość
PostNapisane: 22 kwi 2018, o 12:10 
Offline
Nowy

Dołączył(a): 18 lis 2017
Posty: 8
Pomógł: 1

Mam problem, którego kompletnie nie rozumiem.

Zdefiniowałem strukturę do menu oraz tablicę:

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



Po skompilowaniu i uruchomieniu na wyświetlaczu mam wszystko ok

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


Tak jak by się coś waliło z indeksem tablicy wskaźników po incrementacji:


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


w tym ostatnim przypadku draw_menu() działa (wyświetla teksty z const const char * menu_ptr i const char * sub_menu_ptr;) a menu_ptr->sub_menu_value_speed i inne wyświetlają jakieś bzdury.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 kwi 2018, o 19:12 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

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

Wskaźnik menu_ptr wskazuje na pamięć programu (FLASH), więc aby odczytać wartość sub_menu_value_speed należy użyć makra pgm_read_byte(), czyli powinno być:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Należy pamiętać, że do odczytu np. zmiennej 16-bitowej należy użyć makra pgm_read_word().


Dlaczego raz działa a raz nie?
wojtekr napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Zauważ, że w pierwszym i drugim przypadku wartość indeksu tablicy struktur jest znana na etapie kompilacji. Kompilator zna więc wartość wskaźnika do struktury (menu_ptr) i może w procesie optymalizacji zastąpić wyrażenie menu_ptr->sub_menu_value_speed jego wartością.
Przykładowo można przyjąć co następuje:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jeżeli natomiast do indeksowania tablicy użyjesz zmiennej, której wartość jest np. inkrementowana w pętli for(), to kompilator nie może zrobić tak jak powyżej. Musi wygenerować kod, który będzie dopiero w mikrokontrolerze docelowym realizował odczyt z odpowiedniej komórki pamięci. W tym przypadku zapis:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
spowoduje odczyt danych z pamięci RAM, a w rzeczywistości znajdują się przecież w pamięci FLASH.

Proponuję zapoznać się z kwalifikatorami __flash oraz __memx do definiowania danych w pamięci FLASH. Pozwoli to uniknąć tego typu kłopotów. ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 kwi 2018, o 20:10 
Offline
Nowy

Dołączył(a): 18 lis 2017
Posty: 8
Pomógł: 1

Dzięki, posprawdzam i dam znać

Po gapieniu się w kod tak coś przeczuwałem, że z tymi CONST'ami to tak jakoś jest - na razie chciałem ogarnąć PROGMEM, rozwiązywanie takich problemów jest rozwijające, dopiero w drugim kroku docelowym chciałem użyć __FLASH



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: 3 ] 

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