<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=11404&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-04-18T13:17:43+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=11404&amp;mode</id>
<entry>
<author><name><![CDATA[misiulu]]></name></author>
<updated>2015-04-18T13:17:43+01:00</updated>
<published>2015-04-18T13:17:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11404&amp;p=126835#p126835</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11404&amp;p=126835#p126835"/>
<title type="html"><![CDATA[Re: PROGMEM oraz dziwne dzialanie funkcji strlen_P]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11404&amp;p=126835#p126835"><![CDATA[
<div class="quotetitle">slodkimieciu napisał(a):</div><div class="quotecontent"><br />Dziala poprawnie - natomiast w petli jezeli zamiast liczby przekaze zmienna to juz nie <img src="https://forum.atnel.pl/images/smilies/icon_neutral.gif" alt=":|" title="Średnio zadowolony" /><br /></div><br /><br />No to jest tak jak Ci tłumaczyłem wcześniej. Wystarczy że z definicji tablicy wskaźników to tablic tekstowych:<br />[syntax=c]const char* const string_table&#91;&#93; PROGMEM = {string_0, string_1, string_2, string_3, string_4, string_5};[/syntax]<br />usuniesz słówko PROGMEM, czyli wtedy ta tablica będzie w RAMie, a nie we FLASHu, zacznie Ci działać wszystko poprawnie. Sprawdź!<br />Napisy oczywiście dalej pozostają we FLASHu.<br /><br />Jeżeli natomiast chcesz zaoszczędzić dodatkowego RAMu na tej tablicy wskaźników to ją również dodajesz poprzez dopisanie PROGMEM do FLASHa.<br /><br />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ć. <br /><br />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[]. <br /><br />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.<br /><br />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ć.<br /><br />Oczywiście nie jestem na 100% pewny tego co piszę więc jak ktoś bardziej świadomy wie to niech potwierdzi lub poprawi <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Do takiego wniosku doszedłem na stan obecny mojej wiedzy czyli początkujący <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4068">misiulu</a> — 18 kwi 2015, o 13:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[slodkimieciu]]></name></author>
<updated>2015-04-17T16:00:29+01:00</updated>
<published>2015-04-17T16:00:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11404&amp;p=126768#p126768</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11404&amp;p=126768#p126768"/>
<title type="html"><![CDATA[Re: PROGMEM oraz dziwne dzialanie funkcji strlen_P]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11404&amp;p=126768#p126768"><![CDATA[
Witam<br /><br />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.<br /><br />[syntax=c]strncasecmp_P (&quot;test&quot;, string_table&#91;2&#93;, 4 ); //pisze z pamieci prosze wybaczyc bledy :)[/syntax]<br /><br />Dziala poprawnie - natomiast w petli jezeli zamiast liczby przekaze zmienna to juz nie <img src="https://forum.atnel.pl/images/smilies/icon_neutral.gif" alt=":|" title="Średnio zadowolony" /><br /><br />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 ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6071">slodkimieciu</a> — 17 kwi 2015, o 16:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[misiulu]]></name></author>
<updated>2015-04-17T13:53:26+01:00</updated>
<published>2015-04-17T13:53:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11404&amp;p=126758#p126758</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11404&amp;p=126758#p126758"/>
<title type="html"><![CDATA[Re: PROGMEM oraz dziwne dzialanie funkcji strlen_P]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11404&amp;p=126758#p126758"><![CDATA[
na blogu Mirka masz rozwiązanie problemu <!-- m --><a class="postlink" href="http://mirekk36.blogspot.com/2013/11/tablica-wskaznikow-we-flash-progmem.html" >http://mirekk36.blogspot.com/2013/11/ta ... ogmem.html</a><!-- m --><br /><br />Ogólnie, aby to działało musisz napisać swoją pętlę tak:<br />[syntax=c]for ( i = 0 ; i &lt; 6 ; i++ ) {<br />   <br />             uart_puti( strlen_P( (char*)pgm_read_word( &amp;string_table&#91;i&#93; ) ) );<br />                    uart_puts_P(__NEW_LINE);<br />            }[/syntax]<br /><br />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.<br /><br />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 <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><br /><br />Na blogu jest również makro, które ułatwia sprawę w korzystaniu z tego rozwiązania <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4068">misiulu</a> — 17 kwi 2015, o 13:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[slodkimieciu]]></name></author>
<updated>2015-04-16T21:39:45+01:00</updated>
<published>2015-04-16T21:39:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11404&amp;p=126716#p126716</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11404&amp;p=126716#p126716"/>
<title type="html"><![CDATA[PROGMEM oraz dziwne dzialanie funkcji strlen_P]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11404&amp;p=126716#p126716"><![CDATA[
Witam forumowiczow<br /><br />Mam następujące deklaracje:<br /><br />[syntax=c]const char string_0&#91;&#93; PROGMEM = &quot;String 0&quot;;   <br />const char string_1&#91;&#93; PROGMEM = &quot;String 11&quot;;<br />const char string_2&#91;&#93; PROGMEM = &quot;String 222&quot;;<br />const char string_3&#91;&#93; PROGMEM = &quot;String 3333&quot;;<br />const char string_4&#91;&#93; PROGMEM = &quot;String 44444&quot;;<br />const char string_5&#91;&#93; PROGMEM = &quot;String 555555&quot;;<br /><br />const char* const string_table&#91;&#93; PROGMEM = {string_0, string_1, string_2, string_3, string_4, string_5};[/syntax]<br /><br />Jezeli wpisze <br /><br />[syntax=c]uart_puti(strlen_P(string_table&#91;0&#93;));<br />uart_puts_P(__NEW_LINE);<br />uart_puti(strlen_P(string_table&#91;1&#93;));<br />uart_puts_P(__NEW_LINE);<br />uart_puti(strlen_P(string_table&#91;2&#93;));<br />uart_puts_P(__NEW_LINE);<br />uart_puti(strlen_P(string_table&#91;3&#93;));<br />uart_puts_P(__NEW_LINE);<br />uart_puti(strlen_P(string_table&#91;4&#93;));<br />uart_puts_P(__NEW_LINE);<br />uart_puti(strlen_P(string_table&#91;5&#93;));<br />uart_puts_P(__NEW_LINE);[/syntax]<br /><br /><br />I program bardzo ladnie w konsoli wypisuje mi<br /><br />[syntax=c]8<br />9<br />10<br />11<br />12<br />13[/syntax]<br /><br />Jezeli natomiast bede chcial to samo zrobic w petli:<br /><br />[syntax=c]for ( i = 0 ; i &lt; 6 ; i++ ) {<br /><br />uart_puti(strlen_P(string_table&#91;i&#93;));<br />uart_puts_P(__NEW_LINE);<br />        }[/syntax]<br /><br /><br />To w konsoli dostaje takie oto wyniki:<br /><br />[syntax=c]3<br />0<br />3<br />3<br />3<br />1867[/syntax]<br /><br />Strasznie do dla mnie dziwne, czy któryś z szanownych forumowiczow mógłby mi wytłumaczyć dlaczego tak się dzieje ?<br /><br />Z gory dziekuje<br />Piotr<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 1 minucie ]</span></strong><br /><br />Dodam tylko ze dzieje sie tak z kazdą funkcą _P z biblioteki pgmspace.h<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6071">slodkimieciu</a> — 16 kwi 2015, o 21:39</p><hr />
]]></content>
</entry>
</feed>