ATNEL tech-forum https://forum.atnel.pl/ |
|
Niepopawny odczyt elementów z tablicy? https://forum.atnel.pl/topic22363.html |
Strona 1 z 1 |
Autor: | main.c [ 24 cze 2019, o 23:15 ] |
Tytuł: | Niepopawny odczyt elementów z tablicy? |
Hej, Zdecydowałem się napisać ten post kiedy pszeszukawszy odpowiedzi w książce nt tablic nie poradziłem sobie z tym. Kiedy wywołam procedurę rozbij_liczbę z jakąś wartością to trzy pierwsze linijki poprawnie rozbiją liczbę na setki, dziesiątki i jednostki (wysyłałem na uarta te dane) ale już pozostała część nie odczyta z tablic już nic (cyfra1,cyfra2,cyfra3=0). Natomiast kiedy odkomentuję trzy linijki z przypisanymi wartościami d1, d2, d3 to z tablic wyciągane są poprawne dane i na wyświetlaczu pokazują się wartości które powinny. Typy danych moim zdaniem się zgadzają. Czego ja nie rozumiem? |
Autor: | Szofer [ 24 cze 2019, o 23:57 ] |
Tytuł: | Re: Niepopawny odczyt elementów z tablicy? |
d1, d2, d3 sa zainicjalizowane/zdefiniowane i sa stałymi dosłownymi gdzie kompilator podmienia w miejsce gdzie nazwa wystepuje d1, d2, d3 na to co zdefiniowałeś 1, 2, 3 Zmień w tablicy tab gdzie masz [d1][0]... na tab[1][0] Efekt ten sam |
Autor: | andrews [ 25 cze 2019, o 06:08 ] |
Tytuł: | Re: Niepopawny odczyt elementów z tablicy? |
main.c napisał(a): Nieprawidłowo odczytujesz elementy tablicy. Twoje tablice zapisane są w pamięci FLASH, więc do ich odczytania należy użyć makr: język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. Oczywiście analogicznie należy zrobić w pozostałych przypadkach, czyli dla d2 i d3. |
Autor: | mirekk36 [ 25 cze 2019, o 06:22 ] |
Tytuł: | Re: Niepopawny odczyt elementów z tablicy? |
Już miałem coś odpisywać ale kolega andrews mnie ubiegł main.c napisał(a): Zdecydowałem się napisać ten post kiedy pszeszukawszy odpowiedzi w książce nt tablic nie poradziłem sobie z tym Nadmienię, że oczywiście w Bluebooku jest o tym mowa i to niejednokrotnie |
Autor: | main.c [ 25 cze 2019, o 07:52 ] |
Tytuł: | Re: Niepopawny odczyt elementów z tablicy? |
Dziękuję, potwierdzam teraz sam dostrzegłem swój błąd. Szukałem w podstawach w zielonej, do niebieskiej nie dotarłem. Tak to jest jak się ma przerwę w programowaniu i niektóre oczywistości ulatują z głowy. |
Autor: | mirekk36 [ 25 cze 2019, o 08:11 ] |
Tytuł: | Re: Niepopawny odczyt elementów z tablicy? |
Cytuj: Tak to jest jak się ma przerwę w programowaniu i niektóre oczywistości ulatują z głowy. Spokojnie, ja często i bez żadnej przerwy - zapomnę o pgm_read ... i później siedzę i dumam dlaczego dostaję śmieci ... to się chyba każdemu zdarza |
Autor: | andrews [ 25 cze 2019, o 08:57 ] |
Tytuł: | Re: Niepopawny odczyt elementów z tablicy? |
A ja stosuję kwalifikator __flash zamiast atrybutu PROGMEM i nie muszę pamiętać o makrach pgm_read_xxx() |
Autor: | mirekk36 [ 25 cze 2019, o 09:16 ] |
Tytuł: | Re: Niepopawny odczyt elementów z tablicy? |
andrews napisał(a): A ja stosuję kwalifikator __flash zamiast atrybutu PROGMEM i nie muszę pamiętać o makrach pgm_read_xxx() Nie wiem próbowałem z tym __flash, ale no nie mogię jakieś obrzydzenie mnie bierze .. i zawsze na końcu działam z pgm_r/w ... lepiej wtedy widać co się dzieje w kodzie, chociaż jak widać częściej można się dziabnąć ... |
Autor: | Zealota [ 25 cze 2019, o 09:38 ] |
Tytuł: | Re: Niepopawny odczyt elementów z tablicy? |
andrews napisał(a): A ja stosuję kwalifikator __flash zamiast atrybutu PROGMEM i nie muszę pamiętać o makrach pgm_read_xxx() No właśnie Myślę, że najwyższa pora by Mirek "zmienił doktrynę" w tej kwestii Ma to dużą zaletę, szczególnie przy przenoszeniu kodu choćby na STM. Wystarczy kasować "__flash" Z drugiej strony i tak pozostanie ten sam "problem" z eemem, więc może to jeszcze nie czas... |
Autor: | andrews [ 25 cze 2019, o 10:03 ] |
Tytuł: | Re: Niepopawny odczyt elementów z tablicy? |
mirekk36 napisał(a): Nie wiem próbowałem z tym __flash, ale no nie mogię jakieś obrzydzenie mnie bierze .. i zawsze na końcu działam z pgm_r/w ... lepiej wtedy widać co się dzieje w kodzie Podejrzewam, że to bardziej siła przyzwyczajenia. Dla mnie __flash ma trzy podstawowe zalety:
|
Autor: | mirekk36 [ 25 cze 2019, o 10:39 ] |
Tytuł: | Re: Niepopawny odczyt elementów z tablicy? |
tak znam zalety ale też tak jak mówisz - siła przyzwyczajenia mimo to: andrews napisał(a): czytelność kodu - łatwiej jest zanalizować język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. niż day = (uint8_t)pgm_read_byte(&week[3]); nie powiesz mi, że na pierwszy rzut oka widać gdzie jest "week[]" po takim zapisie: język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. czy w RAM czy we FLASH, trzeba sięgać do definicji żeby zobaczyć specyfikator, a jeśli kod jest zarąbiaście pokręcony - to już w ogóle jego analiza robi się ... tzn ok może przesadzam, ale jak widzę nawet taki biedny zapis język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. to czuję się jak w domu I na koniec - ponieważ ja wolę po 100-kroć ECLIPSA niż Atmel Studio, to "uzdatnianie" Eclipsa żeby łykał specyfikatory typu "__flash" ... i to uzdatnianie dla każdego projektu z osobna to już się robi koszmarek. Nie wspominając już o tym, że jak np napisałbym swojego LIB'sa z użyciem __flash - to z marszu, nie małej - ale ogromnej większości ludzi zacznie się przez to jeszcze większy problem - przez brak "uzdatnienia" eclipsa - nie wspominając o braku przyzwyczajenia i szybszej moim zdaniem analizy kodu ... ... właśnie również z tych powodów wciąż używam PROGMEM Zealota napisał(a): Ma to dużą zaletę, szczególnie przy przenoszeniu kodu choćby na STM. Wystarczy kasować "__flash" Z drugiej strony i tak pozostanie ten sam "problem" z eemem, więc może to jeszcze nie czas... ileż tego kasowania i jak fajnie odpowiedziałeś sobie sam w drugim zdaniu Ale oczywiście Panowie - ja nie zapieram się nogami i rękami bo może w końcu jakoś się przemogę złamię - zobaczę |
Autor: | SylwekK [ 25 cze 2019, o 12:34 ] |
Tytuł: | Re: Niepopawny odczyt elementów z tablicy? |
A ja sobie robię w takim przypadku krótkie makro zastępujące ten nieco przydługawy zapis i też mam wygodnie Każdy robi jak mu pasuje |
Autor: | andrews [ 25 cze 2019, o 18:19 ] |
Tytuł: | Re: Niepopawny odczyt elementów z tablicy? |
Na wstępie chciałbym prosić wszystkich, aby nie traktowali moich słów jako złośliwą krytykę, czy też wymądrzanie się, bo naprawdę nie o to mi chodzi. @mirekk36 Myślę, że każdy potrafi znaleźć jakieś argumenty na poparcie swojej tezy, jak i kontrargumenty na obalenie argumentów strony (nazwijmy to) "inaczej myślącej" (aby nie użyć zaraz brzydkiego słowa "przeciwnej", bo to może zostać źle zrozumiane) mirekk36 napisał(a): nie powiesz mi, że na pierwszy rzut oka widać gdzie jest "week[]" po takim zapisie: Dla mnie profit z użycia __flash polega właśnie na tym, że nie muszę tego wiedzieć, ani się o to martwić. Ani o to, czy odczytać byte, czy word, czy dword. Po prostu stosuję zapis taki sam jak w przypadku odczytu z RAM i kompilator sam generuje odpowiedni kod, aby odczytać dane z właściwej pamięci. Gdyby ktoś usiłował z kolei wpisać tam jakąś wartość (co jest oczywiście niemożliwe, bo to dane tylko do odczytu), to zostanie "naprostowany" przez kompilator. W przypadku tworzenia funkcji z parametrem w postaci wskaźnika do pamięci FLASH, to niezależnie od tego czy użyjemy __flash czy PROGMEM, i tak musimy wiedzieć, gdzie są dane i uwzględnić to w definicji funkcji. Ewentualnie używając kwalifikatora __memx można stworzyć funkcję uniwersalną, która prawidłowo obsłuży wskaźnik zarówno do FLASH, jak i do RAM. mirekk36 napisał(a): I na koniec - ponieważ ja wolę po 100-kroć ECLIPSA niż Atmel Studio, to "uzdatnianie" Eclipsa żeby łykał specyfikatory typu "__flash" ... i to uzdatnianie dla każdego projektu z osobna to już się robi koszmarek. Odpowiem może podobnie jak Ty: ileż tego "uzdatniania"? Nowych projektów nie tworzy się raczej kilkadziesiąt na dobę... @SylwekK SylwekK napisał(a): A ja sobie robię w takim przypadku krótkie makro zastępujące ten nieco przydługawy zapis i też mam wygodnie Każdy robi jak mu pasuje Oczywiście, że makrami można sobie ułatwić życie i dobrze, że to potrafisz zrobić. Twoje makro odczytuje jednak tylko element z jakiejś tablicy. Gdybyś teraz chciał np. odczytać element jakiejś struktury zapisanej w pamięci FLASH, musiałbyś utworzyć inne makro. Gdyby ta struktura była elementem tablicy struktur zapisanej we FLASH, trzeba utworzyć kolejne makro itd. Użycie __flash zamiast PROGMEM zupełnie eliminuje konieczność użycia makr pgm_read_xxx(), bez konieczności definiowania kolejnych makr. Używasz po prostu zapisu, jak przy odczycie "zwykłej" zmiennej z RAM i to wszystko. I wcale nie chodzi mi o to, żeby skrytykować Twój pomysł (sposób) ani żebyś na siłę przyjął mój punkt widzenia. Chciałem tylko, żebyś dobrze zrozumiał różnicę. Właściwie chciałem tylko pokazać, jak ludzie mogą różnie interpretować i postrzegać te same fakty. Przykładowo to, co dla mnie jest bardziej czytelne, dla kogoś innego wcale takie być nie musi (i odwrotnie). Można by tak godzinami się spierać, rozpatrując różne aspekty użycia obu metod, ale to nie ma większego sensu. Nie mówimy tutaj przecież o tym, że jedna z metod jest błędna, a druga prawidłowa. Obie metody są poprawne i dają praktycznie ten sam efekt, więc każdy sobie może wybrać dowolną metodę, która mu lepiej pasuje. Oczywiście pod warunkiem, że nie pracuje w zespole. Praca zespołowa niestety siłą rzeczy wymusza stosowanie się do pewnych reguł. I tak jak wcześniej już chyba pisałem, nie chcę tutaj agitować za przejściem na __flash. Chcę tylko pokazać ewentualne korzyści z tego płynące i przekonać, że naprawdę "nie taki diabeł straszny". |
Autor: | SylwekK [ 25 cze 2019, o 20:13 ] |
Tytuł: | Re: Niepopawny odczyt elementów z tablicy? |
Akurat moim celem biło pokazanie tylko innego rozwiązania. Póki co nie było mi potrzebne to o czym wspomniałeś (w związku ze strukturami). Bardzo chętnie poznam ta metodę _flash. Mógłbyś naświetlić temat i jak to sobie zdefiniować? |
Autor: | mirekk36 [ 25 cze 2019, o 21:14 ] |
Tytuł: | Re: Niepopawny odczyt elementów z tablicy? |
andrews napisał(a): Na wstępie chciałbym prosić wszystkich, aby nie traktowali moich słów jako złośliwą krytykę, czy też wymądrzanie się, bo naprawdę nie o to mi chodzi. @mirekk36 Myślę, że każdy potrafi znaleźć jakieś argumenty na poparcie swojej tezy, jak i kontrargumenty na obalenie argumentów strony (nazwijmy to) "inaczej myślącej" Jeszcze raz powtórzę, bo może mnie troszkę źle zrozumiałeś: - po pierwsze wcale nie jestem przeciwny używaniu __flash - po drugie sam troszkę wspomniałeś o przyzwyczajeniu i wręcz to poparłem - po trzecie no może kilka argumentów mi się kręci w głowie przeciwko __flash - jak opisałem ale to tylko moje widzi-misię uważam, że zdecydowanie warto się zapoznawać z tą metodą i nie patrzeć na moje prywatne przyzwyczajenia i dlatego uważam za bardzo cenne twoje wskazówki w zakresie __flash a szczególnie jestem za tym aby to propagować - może wtedy i mi się coś w środku zmieni ... tyle, że jeśli pozwolisz, na razie po prostu pozostanę przy swoim zdaniu i to tylko tyle, a nie żebym moimi tekstami miał komuś broń Boże obrzydzać używanie _flash'a andrews napisał(a): I tak jak wcześniej już chyba pisałem, nie chcę tutaj agitować za przejściem na __flash. a ja uważam, że nawet jeśli chcesz agitować - to to jest słuszna droga ... i ja nie mam absolutnie nic przeciwko temu - bo sam wiem, że czasem taki upór przed nowościami nie ma najmniejszego sensu. Sam zwykle przekonuję ludzi do nowszych wersji różnego softu (chociażby windowsa) i innych rzeczy i tym bardziej mi głupio, że się jeszcze na tego __flasha nie przeflancowałem ... mam nadzieję zatem, że to wyjaśni już do końca moje zdanie ... jak to mawiał klasyk "jestem za a nawet przeciw" |
Strona 1 z 1 | Strefa czasowa: UTC + 1 |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |