Dzień dobry,
pozdrawiam ze Świnoujścia w nowym roku,
próbowałem ogarnąć to samemu ale tony kodu i żadnego efektu, już opisuję:
- mikrokontroler: Atmega 328P
- Atmel Studio 6.1
Robię menu i będzie więcej stringów niż by sie sensownie mogło pomieścić w pamieci RAM poczciwej Atmeżki dlatego zainteresowałem się mozliwością wrzucenia tego do pamięci programu Flash. Najprościej jesli pokażę to na krótkim kodzie:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
powyższe powoduje że dwie stałe tekstowe będą wpisane do pamięci programu
no to dalej:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
powyższe powoduje utworzenie ze zdefiniowanych stałych, tablicy dwuelementowej o nazwie TEST
poniższy przykład znalazłem na stronie:
http://www.nongnu.org/avr-libc/user-manual/pgmspace.htmljęzyk c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Tłumacząc opis (mniej/więcej) z podanej strony www wygląda to tak:
Tablica TEST jest przechowywana w pamięci programu. Pobieramy adres (&) który potrzebujemy i podajemy go do funkcji
pgm_read_word. Tego makra używa się do pobrania wskaźnika tablicy TEST. Pamiętać trza że wskaźnik jest 16-bitowy. Makro
pgm_read_word zwróci 16-bitową liczbę bez znaku czyli wskaźnik do naszego elementu w tablicy TEST. Następnie trzeba go przerobić na faktyczny wskaźnik używając PGM_P. Teraz ten wskaźnik to adres w pamięci programu wskazujący na interesujący Nas element tablicy TEST. Ten wskaźnik używa sie następnie na przykład w funkcjach str... czyli np. strcpy_P (
_P to funkcje specjalnie przygotowane do pracy z danymi zapisanymi w pamieci programu FLash a nie tradycyjnie w Ramie).
Teraz od siebie napiszę:
wszystko w porządku bo ten przykład akurat działa ale mi zależy na innych funkcjach str... np.
strstr_P czy
strcmp_P.
A te już nie działają.
Tak jak napisałem. Po przepisaniu ton kodu doszedłem do następującego wniosku:
Jeśli operuję na stałych czyli TEMP_0 oraz TEMP_1 to jest w porządku ale jeśli chcę robić to hurtowo w pętli for za pomocą tablicy TEST to już nie działa. Oto mój kod:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Proszę o pomoc. W skrócie. Kiedy korzystam ze stałych czyli TEMP_0 oraz TEMP_1 to jest dobrze ale jeśli korzystam z tablicy TEST[0] oraz TEST[1] to nie jest dobrze. A korzystam tylko z gotowych funkcji biblioteki pgmspace.h czyli z
pgm_read_word oraz z makra
PGM_P.
Jeszcze raz proszę o pomoc.
POZDRAWIAM
===========================================================================================================================
============================================================================================================================.
-----UWAGA----- ---KŁOPOT---ROZWIĄZANY---.
-----UWAGA----- ---KŁOPOT---ROZWIĄZANY---podaję przykład który działa:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
oraz w pętli głównej:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Dziękuje i pozdrawiam
Michał
.
-----UWAGA----- ---KŁOPOT---ROZWIĄZANY---.
-----UWAGA----- ---KŁOPOT---ROZWIĄZANY---