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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-09-14T08:37:59+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=30&amp;t=19168&amp;mode</id>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2017-09-14T08:37:59+01:00</updated>
<published>2017-09-14T08:37:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19168&amp;p=195075#p195075</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19168&amp;p=195075#p195075"/>
<title type="html"><![CDATA[Re: problem z funkcją w dwóch przerwaniach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19168&amp;p=195075#p195075"><![CDATA[
Nie wiem, czym sobie zasłużyłem na takie pochwały, niemniej <strong>dziękuję bardzo</strong>. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Prosiłbym jednak, żeby nie przesadzać, bo na tym forum jest wielu mądrzejszych ode mnie i mogą się poczuć urażeni.<br /><br />________________________<br /><a href="http://forum.atnel.pl/topic19149.html"  class="postlink">AVR-GCC - dane w pamięci FLASH</a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 14 wrz 2017, o 08:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[QuadMan]]></name></author>
<updated>2017-09-13T17:06:19+01:00</updated>
<published>2017-09-13T17:06:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19168&amp;p=195034#p195034</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19168&amp;p=195034#p195034"/>
<title type="html"><![CDATA[Re: problem z funkcją w dwóch przerwaniach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19168&amp;p=195034#p195034"><![CDATA[
Witam,<br /><br /><div class="quotetitle">andrews napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">QuadMan napisał(a):</div><div class="quotecontent">Może ktoś mądrzejszy na to odpowie?<br /></div><br />Nie wiem, czy w tej sytuacji odpowiadać <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Na wszelki wypadek zaznaczę, że wcale nie uważam się za mądrzejszego <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /></div><br /><br />szczerze, to właśnie Kol <strong>andrews</strong> miałem na myśli, no ale przecież nie mogłem Go tak po prostu &quot;wywołać do tablicy&quot; <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" />.<br /><br />Kolego <strong>andrews</strong> dzięki za, jak zwykle zresztą, &quot;kawał&quot; konkretnej i skondensowanej wiedzy. Twoje posty to zawsze perełki i skarbnica wiedzy. A ten pomysł z wywołaniem funkcji &quot;noreetrant()&quot; genialny w swej prostocie. Jeszcze raz dzięki!<br /><br />Pozdrawiam serdecznie, QuadMan.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5291">QuadMan</a> — 13 wrz 2017, o 17:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2017-09-13T12:40:03+01:00</updated>
<published>2017-09-13T12:40:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19168&amp;p=195018#p195018</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19168&amp;p=195018#p195018"/>
<title type="html"><![CDATA[Re: problem z funkcją w dwóch przerwaniach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19168&amp;p=195018#p195018"><![CDATA[
<div class="quotetitle">marpol1992 napisał(a):</div><div class="quotecontent"><br />Mimo wszystko, czysto technicznie może ktoś wie jak zaalokować funkcję tak aby były w pamięci dwie kopie tej samej funkcji ?<br /></div><br /><br />Samo skopiowanie i uruchomienie funkcji nie jest pewnie aż tak trudne, jak myślisz. Należałoby raczej zadać pytanie: <em>Jaką taka funkcja ma szansę, by działać prawidłowo?</em><br /><br />Przypuśćmy na przykład, że wewnątrz takiej kopiowanej funkcji masz wywołanie innej funkcji, tak jak jest w przedstawionym przez Ciebie kodzie. Podczas kompilacji kompilator może użyć do wywołania tej funkcji instrukcji RCALL. Jest to tzw. wywołanie relatywne, a operandem tej instrukcji jest wartość (stała, obliczona w trakcie budowania programu) będąca różnicą pomiędzy adresem tej instrukcji (ściśle zależnym od adresu wykonywanej aktualnie funkcji), a adresem wywoływanej funkcji. Jeśli teraz skopiujesz funkcję pod inny adres, to adres odniesienia się zmieni i wywołanie relatywne przekieruje program pod jakiś przypadkowy, błędny adres.<br /><br />Nie znam się za bardzo na mikrokontrolerach, których temat dotyczy, więc nie będę się wdawał w szczegóły działania kompilatora, ale pewnie znalazłoby się jeszcze kilka innych powodów zmniejszających szansę powodzenia takiej techniki.<br /><br />Nie twierdzę, że się nie da w ogóle, ale zapewne musi być spełnionych kilka warunków, niekoniecznie zależnych od programisty, aby taka operacja się powiodła, dlatego osobiście raczej tego sposobu bym nie polecał (nie tylko w tym konkretnym przypadku).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 13 wrz 2017, o 12:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marpol1992]]></name></author>
<updated>2017-09-13T06:54:40+01:00</updated>
<published>2017-09-13T06:54:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19168&amp;p=194996#p194996</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19168&amp;p=194996#p194996"/>
<title type="html"><![CDATA[Re: problem z funkcją w dwóch przerwaniach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19168&amp;p=194996#p194996"><![CDATA[
Dziękuje za podpowiedzi ostatecznie spróbuje skorzystać z rady  &quot;andrews&quot;. <br />Korzystam z uP PIC24FJ1024GA606. W przerwaniach od transmisji wykorzystuję tą samą funkcje, aby jakoś wywołania nie kolidowały ze sobą ustawione są różne priorytety mimo to nie koniecznie załatwia to sprawę. Umieszczam obiecany kod, jest to tylko część wysyłająca dane ale koncepcja odbioru jest podobna:<br /><br />[syntax=c]void __attribute__((interrupt, no_auto_psv)) _U3TXInterrupt(void)<br /> {<br />     LED_TX3_On;<br />     modbusTxInterrupt(&amp;U3TXREG,&amp;g_modbusCtx&#91;1&#93;);<br />     IFS5bits.U3TXIF = 0;<br />     <br /> }[/syntax]<br /><br />[syntax=c]void __attribute__((interrupt, no_auto_psv)) _U1TXInterrupt(void)<br />    {<br />    modbus_WDT = modbus_WDT;<br />    LED_TX1_On;<br />    modbusTxInterrupt(&amp;U1TXREG, &amp;g_modbusCtx&#91;0&#93;);<br />    IFS0bits.U1TXIF = 0; // Clear TX Interrupt flag<br />    }[/syntax]<br /><br />[syntax=c]void modbusTxInterrupt(volatile unsigned int *Ux_TXREG, struct ModbusCtx *ctx)<br />{<br />   static int bytesSent;<br /><br />    if (bytesSent &lt; ctx-&gt;txLength) ////dobrze<br />        {<br />        unsigned int debugSendingbyte = (*(ctx-&gt;txBufferBegin + bytesSent));<br />        *Ux_TXREG = debugSendingbyte; //(*(ctx-&gt;txBufferBegin + bytesSent));<br />        bytesSent++;<br />        }<br />    else<br />        {<br />        ctx-&gt;odbior();<br />        bytesSent = 0; //zeruj licznik przed nastepna odpowiedzia<br />        ctx-&gt;state = modbusCtx_state_idle;<br />        ctx-&gt;txLength = 0;<br />        ctx-&gt;txPtr = ctx-&gt;txBufferBegin;<br />        } <br />}[/syntax]<br /><br />Mimo wszystko, czysto technicznie może ktoś wie jak zaalokować funkcję tak aby były w pamięci dwie kopie tej samej funkcji ?  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3191">marpol1992</a> — 13 wrz 2017, o 06:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2017-09-12T18:19:23+01:00</updated>
<published>2017-09-12T18:19:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19168&amp;p=194950#p194950</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19168&amp;p=194950#p194950"/>
<title type="html"><![CDATA[Re: problem z funkcją w dwóch przerwaniach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19168&amp;p=194950#p194950"><![CDATA[
<div class="quotetitle">QuadMan napisał(a):</div><div class="quotecontent"><br />Może ktoś mądrzejszy na to odpowie?<br /></div><br />Nie wiem, czy w tej sytuacji odpowiadać <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Na wszelki wypadek zaznaczę, że wcale nie uważam się za mądrzejszego <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><div class="quotetitle">marpol1992 napisał(a):</div><div class="quotecontent"><br />Sprawa rozchodzi się o dostęp dwóch obiektów tej samej struktury do jednej funkcji która posiada zmienne typu static. Dokładnie jak poradzić sobie z tym, że opisywana funkcja jest wykorzystywana na przemian w dwóch przerwaniach<br /></div><br />Nie jestem pewien, czy dobrze rozumiem o co chodzi (przydałby się chociaż fragment kodu), ale jeśli funkcja nie jest reentrant ze względu na to, że wykorzystuje zmienne statyczne, które zachowują wartość pomiędzy wywołaniami funkcji, można to rozwiązać mniej więcej w taki sposób:<br /><br /><ul><strong><li>zamiast</strong></li></ul><br />[syntax=c]// funkcja wywołująca lub procedura obsługi przerwania<br />    void caller(void) {<br />        nonreentrant_func();<br />    }<br /><br />// funkcja wywoływana (non-reentrant ze względu na zmienną statyczną)<br />    void nonreentrant_func(void) {<br />        static int id = 0;<br />        // ...<br />        id++;<br />        // ...<br />    }[/syntax]<br /><br /><ul><strong><li>można</strong></li></ul><br />[syntax=c]// funkcje wywołujące lub procedury obsługi przerwania<br />    void thread1_caller(void) {<br />        static int i = 0;<br />        reentrant_func(&amp;i);<br />    }<br /><br />    void thread2_caller(void) {<br />        static int i = 0;<br />        reentrant_func(&amp;i);<br />    }<br /><br />// funkcja wywoływana (reentrant)<br />    void reentrant_func(int *id) {<br />        // ...<br />       (*id)++;<br />        // ...<br />    }[/syntax]<br /><br />W ten sposób każda funkcja wywołująca ma swój komplet zmiennych statycznych, więc jeśli funkcja wywoływana zostaje przerwana i ponownie wywołana przez inny wątek, operuje po prostu na innych danych.<br /><br />Oczywiście wszystko zależy od implementacji i powodu, dla którego funkcja jest non-reentrant (przyczyny mogą być różne). Trzeba też uważać na inne rzeczy - zmienne globalne, zwracanie wskaźników do zmiennych statycznych wewnątrz funkcji, funkcje wywoływane wewnątrz funkcji reentrant również muszą takie być...<br />Trochę można o tym poczytać np. <a href="https://www.ibm.com/support/knowledgecenter/en/ssw_aix_61/com.ibm.aix.genprogc/writing_reentrant_thread_safe_code.htm"  class="postlink"><strong>tutaj</strong></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 12 wrz 2017, o 18:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[QuadMan]]></name></author>
<updated>2017-09-12T15:30:29+01:00</updated>
<published>2017-09-12T15:30:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19168&amp;p=194934#p194934</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19168&amp;p=194934#p194934"/>
<title type="html"><![CDATA[Re: problem z funkcją w dwóch przerwaniach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19168&amp;p=194934#p194934"><![CDATA[
Witam,<br /><br />Jeśli chodzi o przechowywanie zmiennych na stosie - nie dotyczy to zmiennych static i globalnych. W ogólnym przypadku funkcja będzie reetrant jedynie wtedy, gdy nie korzysta w ogóle ze zmiennych static lub globalnych, inaczej jest to proszenie się o kłopoty. Można to rozwiązać na kilka sposobów, np. zastosować coś w rodzaju mutexa, ale to już niestety zależy od konkretnej implementacji.<br />Dopisane: poruszyłeś przy okazji w sumie ciekawy problem, nad którym się kiedyś też zastanawiałem, ale nie znalazłem rozwiązania: jak &quot;zaalokować&quot; 2 kopie tej samej funkcji w kodzie? Może ktoś mądrzejszy na to odpowie?<br /><br />Pozdrawiam, QuadMan.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5291">QuadMan</a> — 12 wrz 2017, o 15:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2017-09-12T09:11:08+01:00</updated>
<published>2017-09-12T09:11:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19168&amp;p=194918#p194918</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19168&amp;p=194918#p194918"/>
<title type="html"><![CDATA[Re: problem z funkcją w dwóch przerwaniach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19168&amp;p=194918#p194918"><![CDATA[
Za mało szczegółów. Nawet modelu procka nie podałeś. Wrzuć cały kod poza tymi, które pochodzą z książek Mirka<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 12 wrz 2017, o 09:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marpol1992]]></name></author>
<updated>2017-09-12T08:25:15+01:00</updated>
<published>2017-09-12T08:25:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19168&amp;p=194916#p194916</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19168&amp;p=194916#p194916"/>
<title type="html"><![CDATA[problem z funkcją w dwóch przerwaniach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19168&amp;p=194916#p194916"><![CDATA[
Witam.<br />Chciałbym prosić o pomoc odnośnie języka C w uP. Sprawa rozchodzi się o dostęp dwóch obiektów tej samej struktury do jednej funkcji która posiada zmienne typu static. Dokładnie jak poradzić sobie z tym, że opisywana funkcja jest wykorzystywana na przemian w dwóch przerwaniach, przez co nie do końca wiem co się dzieje ze zmiennymi kiedy podczas wykonywania tej funkcji program zostanie przerwany przez inne przerwanie i wskoczy do początku opisywanej funkcji a po skończeniu program wraca do ukończenia wcześniejszego przerwania. Przepraszam, że tak to pogmatwanie brzmi.<br />Nie jestem tego pewny ale domyślam się, że w chwili przerwania wykonywanej funkcji wartości zmiennych zostają wrzucone na stos i tam zapamiętane a gdy program wraca to wcześniejszego miejsca wartości zmiennych są przywracane. ?. Niestety tak to chyba nie działa i program się wywala. <br />Jeżeli sytuacja jest nie zrozumiana to mogę postarać się wrzucić program, lecz kodu jest dość sporo. Aby jeszcze bardziej przybliżyć problem, nadmienię że przerwania są od odbioru Uart'a parametry transmisji (115200, 8o1), Fcpu 32Mhz i jest to program który ma zaimplementowane na jednym procesorze dwa modbus slave przez co dla obydwu jest zaimplementowany ten sam kod, w większości przypadków w funkcjach są zmienne umieszczone w strukturze przez co tam problemów nie ma. Nie chcę tworzyć dwa razy tych samych funkcji bo to bez sensu dlatego myślałem nad takim tworem jak alokacja funkcji w pamięci lecz nic na ten temat w sieci nie znalazłem. Rozwiązanie polegało by na przekazaniu adresu zaalokowanej funkcji do wskaźnika funkcji w strukturze.  Chętnie usłyszę inne rozwiązania które zburzą pomysł alokacji.<br />Z góry dziękuje za pomoc,<br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3191">marpol1992</a> — 12 wrz 2017, o 08:25</p><hr />
]]></content>
</entry>
</feed>