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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-09-05T20:56:21+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=21227&amp;mode</id>
<entry>
<author><name><![CDATA[Jarecki]]></name></author>
<updated>2018-09-05T20:56:21+01:00</updated>
<published>2018-09-05T20:56:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211436#p211436</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211436#p211436"/>
<title type="html"><![CDATA[Re: Volatile pytanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211436#p211436"><![CDATA[
Zgadza się, te funkcje są na wyrost trochę ale bardziej chodzi mi o zrozumienie istoty problemu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Rozbudowałem program o callbacka, możecie zerknąć i powiedzieć, czy teraz volatile jest też potrzebny? Jeśli tak to gdzie i dlaczego? <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> to tylko teoretyczne rozważanie. W przerwaniu wywołuję callbaka i w tym callbaku wywołuję dopiero funkcję set....<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br /><br /><br />static void (*intCb)(void);<br /><br /><br />void RegCb(void(*Cb)(void))<br />{<br />intCb = Cb;<br />}<br /><br />static void interruptCb(void)<br />{<br />setInteruptFlag(1);<br />}<br /><br />uint8_t GlobalnaFlaga;<br /><br /><br />void setInteruptFlag(uint8_t flaga)<br />{<br />        GlobalnaFlaga = flaga;<br />}<br /><br />uint8_t getInteruptFlag(void)<br />{<br />        return GlobalnaFlaga;<br />}<br /><br /><br /><br />int main(void)<br />{<br />RegCb(interruptCb);<br />        /*<br />         * Pomijam inicjalizacje peryferiow<br />         *<br />         */<br /><br /><br />        while(1)<br />        {<br />                if(Button_press)<br />                {<br />                        setInteruptFlag(1);<br />                }<br /><br /><br />                if(getInteruptFlag())<br />                {<br />                        /* Np. migaj dioda */<br />                }<br />        }<br /><br />}<br /><br />ISR(TIMER2_COMP_vect)<br />{<br />     if(intCb)<br />     {<br />     intCb();<br />     }<br />}[/syntax]<br /><br />czy to ma prawo działać?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2511">Jarecki</a> — 5 wrz 2018, o 20:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2018-09-05T06:41:46+01:00</updated>
<published>2018-09-05T06:41:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211396#p211396</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211396#p211396"/>
<title type="html"><![CDATA[Re: Volatile pytanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211396#p211396"><![CDATA[
czyli jak widzisz - jeśli zmienna ma specyfikator volatile to kompilator będzie się burzył jeśli taką zmienną będziesz chciał przekazać jako argument funkcji a będzie on (ten  argument) pozbawiony tegoż specyfikatora.<br /><br />Zwrócę jeszcze uwagę, że w przypadku tak prostego ustawiania flag - to troszkę hmmm nadmiarowym delikatnie mówiąc jest tworzenie funkcji set() do zapalania czy gaszenia tej flagi, zamiast tej funkcji wystarczy po prostu w przerwaniu i w kodzie przypisywać fladze wartość bezpośrednio - typu<br /><br />[syntax=c]flaga=0;[/syntax]<br /><br />albo <br /><br />[syntax=c]flaga=1;[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 5 wrz 2018, o 06:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jarecki]]></name></author>
<updated>2018-09-05T06:18:38+01:00</updated>
<published>2018-09-05T06:18:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211395#p211395</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211395#p211395"/>
<title type="html"><![CDATA[Re: Volatile pytanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211395#p211395"><![CDATA[
Ok, dzięki Panowie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2511">Jarecki</a> — 5 wrz 2018, o 06:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2018-09-04T15:30:48+01:00</updated>
<published>2018-09-04T15:30:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211340#p211340</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211340#p211340"/>
<title type="html"><![CDATA[Re: Volatile pytanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211340#p211340"><![CDATA[
a spróbuj dać &quot;bez volatile&quot; i sam sprawdź <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> zachęcam do takich testów ... bo to wiele więcej cię nauczy<br /><br />mówię ci skompiluj sobie to i zobacz co się stanie, sprawdź i z volatile i bez dla argumentu - a jak jeszcze nie będziesz wiedział o co chodzi to śmiało tu dopytaj<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 4 wrz 2018, o 15:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jarecki]]></name></author>
<updated>2018-09-04T15:22:18+01:00</updated>
<published>2018-09-04T15:22:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211339#p211339</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211339#p211339"/>
<title type="html"><![CDATA[Re: Volatile pytanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211339#p211339"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />Moim zdaniem kolega przekombinował pytanie na maxa - podczas gdy zasada użycia volatile jest prosta jak drut i krótka <br /><br /><strong><span style="color: #0080FF">ZAWSZE ale to ZAWSZE jeśli jakaś zmienna ma być wykorzystywana zarówno w przerwaniu jak i w innej części programu to MUSI BYĆ volatile, a jeśli nie będzie używana w przerwaniu to nie musi mieć volatile</span></strong><br /><br />Oczywiście to PODSTAWOWA zasada - bo generalnie volatile oznacza tylko tyle że mówisz kompilatorowi: &quot;ej ty nie optymalizuj mi dostępu do tej zmiennej&quot; - wiadomo, że w zaawansowanym programowaniu można jej używać również w innych przypadkach albo chociażby np do przekazywania portów jako argumenty funkcji itp - ale zanim do tego dojdziesz wystarczy ta podstawowa formułka.<br /></div><br /><br />Tak Mirku, pamiętam to z BB ale powiedz mi, czy argument funkcji &quot;set...&quot; również powinien być Volatile?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2511">Jarecki</a> — 4 wrz 2018, o 15:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[RybaSG]]></name></author>
<updated>2018-09-04T15:18:09+01:00</updated>
<published>2018-09-04T15:18:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211338#p211338</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211338#p211338"/>
<title type="html"><![CDATA[Re: Volatile pytanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211338#p211338"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />Moim zdaniem kolega przekombinował pytanie na maxa - podczas gdy zasada użycia volatile jest prosta jak drut i krótka <br /><br /><strong><span style="color: #0080FF">ZAWSZE ale to ZAWSZE jeśli jakaś zmienna ma być wykorzystywana zarówno w przerwaniu jak i w innej części programu to MUSI BYĆ volatile, a jeśli nie będzie używana w przerwaniu to nie musi mieć volatile</span></strong><br /><br />Oczywiście to PODSTAWOWA zasada - bo generalnie volatile oznacza tylko tyle że mówisz kompilatorowi: &quot;ej ty nie optymalizuj mi dostępu do tej zmiennej&quot; - wiadomo, że w zaawansowanym programowaniu można jej używać również w innych przypadkach albo chociażby np do przekazywania portów jako argumenty funkcji itp - ale zanim do tego dojdziesz wystarczy ta podstawowa formułka.<br /></div><br /><br />Dobrze też wiedzieć jak takie coś działa i po co się stosuje, a nie wykuć na blachę, że &quot; tam użyj i już, bo tam musi być&quot;.<br /><br /><br />Cytując wikipedię:<br /><em>volatile znaczy ulotny. Oznacza to, że kompilator wyłączy dla takiej zmiennej optymalizacje typu zastąpienia przez stałą lub zawartość rejestru, za to wygeneruje kod, który będzie odwoływał się zawsze do komórek pamięci danego obiektu. Zapobiegnie to błędowi, gdy obiekt zostaje zmieniony przez część programu, która nie ma zauważalnego dla kompilatora związku z danym fragmentem kodu lub nawet przez zupełnie inny proces. </em><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=15776">RybaSG</a> — 4 wrz 2018, o 15:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2018-09-04T14:19:19+01:00</updated>
<published>2018-09-04T14:19:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211330#p211330</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211330#p211330"/>
<title type="html"><![CDATA[Re: Volatile pytanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211330#p211330"><![CDATA[
Moim zdaniem kolega przekombinował pytanie na maxa - podczas gdy zasada użycia volatile jest prosta jak drut i krótka <br /><br /><strong><span style="color: #0080FF">ZAWSZE ale to ZAWSZE jeśli jakaś zmienna ma być wykorzystywana zarówno w przerwaniu jak i w innej części programu to MUSI BYĆ volatile, a jeśli nie będzie używana w przerwaniu to nie musi mieć volatile</span></strong><br /><br />Oczywiście to PODSTAWOWA zasada - bo generalnie volatile oznacza tylko tyle że mówisz kompilatorowi: &quot;ej ty nie optymalizuj mi dostępu do tej zmiennej&quot; - wiadomo, że w zaawansowanym programowaniu można jej używać również w innych przypadkach albo chociażby np do przekazywania portów jako argumenty funkcji itp - ale zanim do tego dojdziesz wystarczy ta podstawowa formułka.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 4 wrz 2018, o 14:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mczarny]]></name></author>
<updated>2018-09-04T12:49:10+01:00</updated>
<published>2018-09-04T12:49:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211325#p211325</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211325#p211325"/>
<title type="html"><![CDATA[Re: Volatile pytanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211325#p211325"><![CDATA[
Oczywiście trzecia wersja. Zawsze jak używasz zmiennej w programie głównym i w przerwaniu specyfikatorem <strong>Votatile</strong><br />Generalnie chodzi o to żeby kompilator nie optymalizował dostępu do takiej zmiennej.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4651">mczarny</a> — 4 wrz 2018, o 12:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jarecki]]></name></author>
<updated>2018-09-04T12:31:12+01:00</updated>
<published>2018-09-04T12:31:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211323#p211323</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211323#p211323"/>
<title type="html"><![CDATA[Volatile pytanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21227&amp;p=211323#p211323"><![CDATA[
Cześć,<br /><br />pisząc kod zacząłem zastanawiać się jak to jest z tym volatile w przypadku funkcji.....<br /><br />Wytłumaczę na podstawie poniższego kodu. <br /><br />Załóżmy, że mam dwie proste funkcję do ustawiania i odczytywania jakiejś flagi: set i get.<br /><br />Funkcja set będzie czasem ustawiana w przerwaniu a czasem w pętli głównej. Odczytywana będzie tylko w pętli głównej. <br /><br />Czy powinienem użyć tu volatile? Jesli tak, to w którym dokładnie miejscu? <br /><br />Przygotowałem kilka kodów, zerknijcie proszę i napiszcie, który jest prawidłowy? A może żaden z nich? <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Będę wdzieczny za każdą pomoc <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />1.<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br /><br />uint8_t GlobalnaFlaga;<br /><br /><br />void setInteruptFlag(uint8_t flaga)<br />{<br />GlobalnaFlaga = flaga;<br />}<br /><br />uint8_t getInteruptFlag(void)<br />{<br />return GlobalnaFlaga;<br />}<br /><br /><br /><br />int main(void)<br />{<br />/* <br /> * Pomijam inicjalizacje peryferiow<br /> *<br /> */<br /><br /><br />while(1)<br />{<br />if(Button_press)<br />{<br />setInteruptFlag(1);<br />}<br /><br /><br />if(getInteruptFlag())<br />{<br />/* Np. migaj dioda */<br />}<br />}<br /><br />}<br /><br />ISR(TIMER2_COMP_vect)<br />{<br />setInteruptFlag(1);<br />}[/syntax]<br /><br />2.<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br /><br />volatile uint8_t GlobalnaFlaga;<br /><br /><br />void setInteruptFlag(uint8_t flaga)<br />{<br />GlobalnaFlaga = flaga;<br />}<br /><br />uint8_t getInteruptFlag(void)<br />{<br />return GlobalnaFlaga;<br />}<br /><br /><br /><br />int main(void)<br />{<br />/* <br /> * Pomijam inicjalizacje peryferiow<br /> *<br /> */<br /><br /><br />while(1)<br />{<br />if(Button_press)<br />{<br />setInteruptFlag(1);<br />}<br /><br /><br />if(getInteruptFlag())<br />{<br />/* Np. migaj dioda */<br />}<br />}<br /><br />}<br /><br />ISR(TIMER2_COMP_vect)<br />{<br />setInteruptFlag(1);<br />}[/syntax]<br /><br />3.<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br /><br />volatile uint8_t GlobalnaFlaga;<br /><br /><br />void setInteruptFlag(volatile uint8_t flaga)<br />{<br />GlobalnaFlaga = flaga;<br />}<br /><br />volatile uint8_t getInteruptFlag(void)<br />{<br />return GlobalnaFlaga;<br />}<br /><br /><br /><br />int main(void)<br />{<br />/* <br /> * Pomijam inicjalizacje peryferiow<br /> *<br /> */<br /><br /><br />while(1)<br />{<br />if(Button_press)<br />{<br />setInteruptFlag(1);<br />}<br /><br /><br />if(getInteruptFlag())<br />{<br />/* Np. migaj dioda */<br />}<br />}<br /><br />}<br /><br />ISR(TIMER2_COMP_vect)<br />{<br />setInteruptFlag(1);<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2511">Jarecki</a> — 4 wrz 2018, o 12:31</p><hr />
]]></content>
</entry>
</feed>