<?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=14181&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-01-13T21:28:10+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=14181&amp;mode</id>
<entry>
<author><name><![CDATA[x-fly]]></name></author>
<updated>2016-01-13T21:28:10+01:00</updated>
<published>2016-01-13T21:28:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14181&amp;p=150523#p150523</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14181&amp;p=150523#p150523"/>
<title type="html"><![CDATA[Funkcje 'string' i stringi wpisane w pamięć Flash [AVR,GCC]]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14181&amp;p=150523#p150523"><![CDATA[
Dzień dobry,<br />pozdrawiam ze Świnoujścia w nowym roku,<br />próbowałem ogarnąć to samemu ale tony kodu i żadnego efektu, już opisuję:<br />- mikrokontroler: Atmega 328P<br />- Atmel Studio 6.1<br /><br />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:<br /><br />[syntax=c]constchar TEMP_0&#91;&#93; PROGMEM= &quot;Menu_1&quot;;<br />constchar TEMP_1&#91;&#93; PROGMEM= &quot;Menu_2&quot;;[/syntax]<br />powyższe powoduje że dwie stałe tekstowe będą wpisane do pamięci programu<br /><br />no to dalej:<br />[syntax=c]PGM_P const TEST&#91;&#93; PROGMEM=<br />{ TEMP_0, TEMP_1<br />};[/syntax]<br />powyższe powoduje utworzenie ze zdefiniowanych stałych, tablicy dwuelementowej o nazwie TEST<br /><br />poniższy przykład znalazłem na stronie:<br /><a href="http://www.nongnu.org/avr-libc/user-manual/pgmspace.html"  class="postlink">http://www.nongnu.org/avr-libc/user-manual/pgmspace.html</a><br />[syntax=c]char buffer&#91;20&#93;;<br />for (uint8_t licznik= 0; licznik &lt; 2; licznik++)<br />{ strcpy_P(buffer, (PGM_P)pgm_read_word(&amp;(TEST&#91;i&#93;)));<br />}[/syntax]<br /><br />Tłumacząc opis (mniej/więcej) z podanej strony www wygląda to tak:<br />Tablica TEST jest przechowywana w pamięci programu. Pobieramy adres (&amp;) który potrzebujemy i podajemy go do funkcji <strong>pgm_read_word</strong>. Tego makra używa się do pobrania wskaźnika tablicy TEST. Pamiętać trza że wskaźnik jest 16-bitowy. Makro <strong>pgm_read_word</strong> 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 (<strong>_P</strong> to funkcje specjalnie przygotowane do pracy z danymi zapisanymi w pamieci programu FLash a nie tradycyjnie w Ramie).<br /><br />Teraz od siebie napiszę:<br />wszystko w porządku bo ten przykład akurat działa ale mi zależy na innych funkcjach str... np. <strong>strstr_P</strong> czy <strong>strcmp_P</strong>.<br />A te już nie działają.<br /><br />Tak jak napisałem. Po przepisaniu ton kodu doszedłem do następującego wniosku:<br />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:<br />[syntax=c]for (uint8_t licznik = 0; licznik &lt; 2; licznik++)<br />{<br />if (strstr_P( (PGM_P)pgm_read_word(&amp;(TEST&#91;licznik&#93;)) , &quot;en&quot;) )  // szukam stringa &quot;en&quot; w wyrazach Menu_1 oraz Menu_2<br />  {  // zapal diodę LED_1, zgaś diodę LED_2<br />  } else<br />  {  // zapal diodę LED_2, zgaś diodę LED_1 (odwróć zapalenie diodek)<br />  }  <br />}[/syntax]<br />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 <strong>pgm_read_word</strong> oraz z makra <strong>PGM_P</strong>.<br /><br />Jeszcze raz proszę o pomoc.<br />POZDRAWIAM<br /><br /><strong>===========================================================================================================================<br />============================================================================================================================</strong><br /><br />.                                           <strong><span style="text-decoration: underline"><span style="color: #FF0000">-----UWAGA-----                           ---KŁOPOT---ROZWIĄZANY---</span></span></strong><br />.                                           <strong><span style="text-decoration: underline"><span style="color: #FF0000">-----UWAGA-----                           ---KŁOPOT---ROZWIĄZANY---</span></span></strong><br /><br /><br />podaję przykład który działa:<br />[syntax=c]const char m1&#91;&#93; PROGMEM = &quot;menu_1&quot;;<br />const char m2&#91;&#93; PROGMEM = &quot;menu_2&quot;;<br /><br />PGM_P const menu&#91;2&#93; PROGMEM =<br />{<br />m1,m2<br />};[/syntax]<br />oraz w pętli głównej:<br />[syntax=c]char bufor&#91;32&#93;;<br />uint8_t index= 0;<br />PGM_P p;<br />memcpy_P(&amp;p, &amp;menu&#91;index&#93;, sizeof(PGM_P));<br />strcpy_P(bufor, p);<br /><br />// teraz można już operować na funkcjach 'string' bez znacznika _P<br />if (strstr(bufor, &quot;_2&quot;) == NULL)<br />{<br />// nie znalazł &quot;_2&quot;<br />} else<br />{<br />// znalazł &quot;_2&quot;<br />}[/syntax]<br /><br />Dziękuje i pozdrawiam<br />Michał<br /><br />.                                           <strong><span style="text-decoration: underline"><span style="color: #FF0000">-----UWAGA-----                           ---KŁOPOT---ROZWIĄZANY---</span></span></strong><br />.                                           <strong><span style="text-decoration: underline"><span style="color: #FF0000">-----UWAGA-----                           ---KŁOPOT---ROZWIĄZANY---</span></span></strong><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4100">x-fly</a> — 13 sty 2016, o 21:28</p><hr />
]]></content>
</entry>
</feed>