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



Teraz jest 22 maja 2026, o 12:43


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
Autor Wiadomość
PostNapisane: 16 kwi 2015, o 21:39 
Offline
Nowy

Dołączył(a): 07 paź 2014
Posty: 9
Pomógł: 0

Witam forumowiczow

Mam następujące deklaracje:

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


Jezeli wpisze

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



I program bardzo ladnie w konsoli wypisuje mi

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


Jezeli natomiast bede chcial to samo zrobic w petli:

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



To w konsoli dostaje takie oto wyniki:

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


Strasznie do dla mnie dziwne, czy któryś z szanownych forumowiczow mógłby mi wytłumaczyć dlaczego tak się dzieje ?

Z gory dziekuje
Piotr

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

Dodam tylko ze dzieje sie tak z kazdą funkcą _P z biblioteki pgmspace.h



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 kwi 2015, o 13:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 kwi 2014
Posty: 438
Lokalizacja: Zambrów
Pomógł: 22

na blogu Mirka masz rozwiązanie problemu http://mirekk36.blogspot.com/2013/11/ta ... ogmem.html

Ogólnie, aby to działało musisz napisać swoją pętlę tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jest tak bo adres wskaźnika do naszych tekstów zapisanych we FLASHu jest również zapisany we FLASHu więc najpierw odczytujemy ten adres z tablicy string_table za pomocą funkcji co odczytuje z FLASHa czyli pgm_read_word bo adres jest 16 bitowy i dopiero potem przekazujemy ten adres do funkcji strlen_P, aby mogła sobie odczytać już z poprawnego adresu dane naszych tekstów z pamięci FLASH. Po drodze jest jeszcze robione jawne rzutowanie na char* po to aby typy się zgadzały i kompilator nie wyrzucał warninga.

Jak zamiast zmiennej i jest liczba, czyli zamiast i jest np. 0, czyli konkretny element tablicy to pewnie obliczany i podstawiany jest prawidłowy adres tablicy stringów już podczas samej kompilacji kodu. Tak mi się wydaje i gdybam sobie tylko :D

Na blogu jest również makro, które ułatwia sprawę w korzystaniu z tego rozwiązania :)

Pozdrawiam


Autor postu otrzymał pochwałę

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 kwi 2015, o 16:00 
Offline
Nowy

Dołączył(a): 07 paź 2014
Posty: 9
Pomógł: 0

Witam

Dzieki za odpowiedz, czytałem blog Mikra oczywiście i rozwiązanie jest jak najbardziej ok. Mnie osobiście najbardziej interesuje dlaczego podstawiajac kokretną liczbe program dziala bez uzycia funkcji pgm_read_word. Tak samo sprawa wyglada jezeli uzyje funkcji np. strncasecmp_P. NP.

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


Dziala poprawnie - natomiast w petli jezeli zamiast liczby przekaze zmienna to juz nie :|

No i ostateczne pytanie: Jezeli uzyje stalej jako indeksu czy jest to poprawne czy jest to raczej efekt uboczny i w innych okoliczonosciach funkcja zwroci nieokreslone rezultaty ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 kwi 2015, o 13:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 kwi 2014
Posty: 438
Lokalizacja: Zambrów
Pomógł: 22

slodkimieciu napisał(a):
Dziala poprawnie - natomiast w petli jezeli zamiast liczby przekaze zmienna to juz nie :|


No to jest tak jak Ci tłumaczyłem wcześniej. Wystarczy że z definicji tablicy wskaźników to tablic tekstowych:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

usuniesz słówko PROGMEM, czyli wtedy ta tablica będzie w RAMie, a nie we FLASHu, zacznie Ci działać wszystko poprawnie. Sprawdź!
Napisy oczywiście dalej pozostają we FLASHu.

Jeżeli natomiast chcesz zaoszczędzić dodatkowego RAMu na tej tablicy wskaźników to ją również dodajesz poprzez dopisanie PROGMEM do FLASHa.

Wtedy, aby odczytać taki wskaźnik z tej tablicy w pętli trzeba użyć funkcji z pgm_read, bo inaczej dostaje się krzaki. Dlatego po dodaniu tego cuda zaczyna działać.

A dlaczego działa bez tej funkcji pgm_read jeżeli nie ma pętli, a jest stała wpisana np. stały index, albo zmienna, ale z niezmienianą nigdzie wartością? No to już Ci właśnie też mówiłem, że prawdopodobnie kompilator, który jest nastawiony na optymalizację wielkości kodu podstawia dane adresy podczas kompilacji bo je już wtedy zna i dopiero je wgrywa do procka. Sam procek już podczas swojej pracy uruchamia funkcję strlen_P czy jakąś inną i sięga do adresu wpisanego przez kompilator, a nie faktycznie do zmiennej tablicowej string_table[].

W momencie kiedy mamy pętle to sam procesor musi w swoim kodzie pobrać dynamicznie w danym momencie z tablicy string_table[] odpowiedni wskaźnik i dlatego potrzebuje do tego funkcji pgm_read bo inaczej dostaje krzaki.

Ogólnie jeżeli za każdym razem użyjesz tej funkcji pgm_read, czy to w pętli, czy to bez niej to powinno być poprawnie bo kompilator sam to zoptymalizuje po swojemu. W momencie jednak jak w przypadku wyżej gdzie są pętle i musi procesor sam dynamicznie pobierać z FLASHa dane to ta funkcja pgm_read powinna być.

Oczywiście nie jestem na 100% pewny tego co piszę więc jak ktoś bardziej świadomy wie to niech potwierdzi lub poprawi :) Do takiego wniosku doszedłem na stan obecny mojej wiedzy czyli początkujący :D

_________________
.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 5 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