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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-08-11T12:00:05+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=15981&amp;mode</id>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-08-11T12:00:05+01:00</updated>
<published>2016-08-11T12:00:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15981&amp;p=165872#p165872</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15981&amp;p=165872#p165872"/>
<title type="html"><![CDATA[Re: Wskaźniki do funkcji współdzielone przez main() i przerw]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15981&amp;p=165872#p165872"><![CDATA[
<div class="quotetitle">JungleMan napisał(a):</div><div class="quotecontent"><br />[syntax=c]void set_fptr(void(*fptr)(void), void(*fun)(void)) {<br />        ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {<br />                fptr = fun;<br />        }<br />}<br /><br />set_fptr(main_executor, display_which_keypad_pressed);[/syntax]<br /></div><br /><br />W ten sposób nie zmienisz zawartości zmiennej (wskaźnika do funkcji) <em>main_executor</em>, zmienisz tylko wartość argumentu <em>fptr</em> wewnątrz funkcji <em>set_fptr()</em>. Powinieneś do funkcji <em>set_fptr()</em> przekazać wskaźnik do wskaźnika.<br /><br />Spróbuj tak:<br /><br />[syntax=c]typedef void( * f_ptr_t )( void );<br />volatile f_ptr_t main_executor;<br /><br />void set_fptr(volatile f_ptr_t *dest, f_ptr_t src) {<br />    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {<br />        *dest = src;<br />    }<br />}<br /><br /><br />// i wywołanie funkcji np. tak<br />    set_fptr(&amp;main_executor, display_some_lcd_data);[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 11 sie 2016, o 12:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[JungleMan]]></name></author>
<updated>2016-08-11T09:53:20+01:00</updated>
<published>2016-08-11T09:53:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15981&amp;p=165867#p165867</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15981&amp;p=165867#p165867"/>
<title type="html"><![CDATA[Wskaźniki do funkcji współdzielone przez main() i przerwania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15981&amp;p=165867#p165867"><![CDATA[
Otóż zgodnie z tym tematem: <!-- l --><a class="postlink-local" href="http://forum.atnel.pl/post164833.html#p164833" >post164833.html#p164833</a><!-- l --> uznałem, że skoro wskaźnik na funkcję to również zmienna dwubajtowa przerwanie może zajść w trakcie przetwarzania dwubajtowej zmiennej. Dlatego stworzyłem sobie funkcje:<br />[c]void set_fptr(void(*fptr)(void), void(*fun)(void)) {<br />        ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {<br />                fptr = fun;<br />        }<br />}<br /><br />bool check_fptr(void(*fptr)(void)) {<br />        bool check;<br />        ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {<br />                check = (fptr != NULL);<br />        }<br />        return check;<br />}[/c]<br /><br />Przy czym wskaźnik definiuję następująco:<br />[c]typedef void( * f_ptr_t )( void );<br />volatile f_ptr_t main_executor;[/c]<br /><br />Przypisanie i przykładowe działanie programu:<br />[c]main():<br />while(1) {<br />        if(check_fptr(main_executor)) {<br />                main_executor();<br />                set_fptr(main_executor, NULL);<br />        }<br />}<br /><br />ISR(INT0_vect) {<br />        set_fptr(main_executor, display_some_lcd_data);<br />}<br /><br />IST(TIMER0_COMPA_vect) {<br />        if(keypad_pressed) set_fptr(main_executor, display_which_keypad_pressed);<br />}[/C]<br /><br />Przy czym:<br />[c]void display_some_lcd_data();<br />void display_which_keypad_pressed();[/c]<br /><br />Blok atomowy wykonuje się poprawnie. Problem w tym, że gdy sprawdzam zawartość wskaźnika po przypisaniu funkcją set_fptr jest tam NULL. Zupełnie tego nie rozumiem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3945">JungleMan</a> — 11 sie 2016, o 09:53</p><hr />
]]></content>
</entry>
</feed>