wojtekr napisał(a):
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ć:
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):
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:
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:
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.