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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2025-03-11T21:24:00+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=24784&amp;mode</id>
<entry>
<author><name><![CDATA[Nefarious32]]></name></author>
<updated>2025-03-11T21:24:00+01:00</updated>
<published>2025-03-11T21:24:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24784&amp;p=238923#p238923</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24784&amp;p=238923#p238923"/>
<title type="html"><![CDATA[Re: Ciekawe zachowanie kompilatora]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24784&amp;p=238923#p238923"><![CDATA[
<div class="quotetitle">Jarecki napisał(a):</div><div class="quotecontent"><br />Co o tym myślicie? Wygląda mi na to na niejednoznaczne zachowanie kompilatora. Nie sprawdzałem co by się stało po zmianie optymalizacji podczas kompilacji- mam ustawioną domyślną.<br /></div><br /><br />domyślną to znaczy jaką? Do debugu używaj -O0 a do release -O2 albo -Os. Mi się kiedyś zdarzyło że na -O3 kod działał jak chciał (kod na przerwaniach) natomiast na O2 już prawidłwo. Być może na O3 volatile było traktowane z przymrużeniem oka <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> nie mnie avr-gcc to średni kompilator i miewa błędy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=22214">Nefarious32</a> — 11 mar 2025, o 21:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Andrzej_Hils]]></name></author>
<updated>2025-02-17T21:18:11+01:00</updated>
<published>2025-02-17T21:18:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24784&amp;p=238874#p238874</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24784&amp;p=238874#p238874"/>
<title type="html"><![CDATA[Re: Ciekawe zachowanie kompilatora]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24784&amp;p=238874#p238874"><![CDATA[
Dodał bym jeszcze że volatile przy lcdError brakuje. Kompilator jeśli może zawsze stara się umieszczać dane i zmienne w rejestrach platformy jeśli ma do nich dostęp (czyli np. nie zostały wyczerpane w danym kontekście wykonania). Im bardziej rozbudowany program, tym więcej rejestrów konsumujesz i tym większa szansa że wszystko co konieczne, zostanie &quot;zsynchronizowane&quot;. Specyfikator volatile, powoduje zapis do pamięci bez względu na bieżącą gospodarkę rejestrami.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=22179">Andrzej_Hils</a> — 17 lut 2025, o 21:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jarecki]]></name></author>
<updated>2025-02-10T12:24:20+01:00</updated>
<published>2025-02-10T12:24:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24784&amp;p=238840#p238840</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24784&amp;p=238840#p238840"/>
<title type="html"><![CDATA[Re: Ciekawe zachowanie kompilatora]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24784&amp;p=238840#p238840"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />to wynik zbyt agresywnej optymalizacji AVR GCC ale też nie ma co się dziwić gdy stosuje się aż TAK dziwaczne przypadki kodu - sorki ale ta funkcja lcdrefresh twoja jest totalnie bez sensu (...)<br /><br />Niestety - moim zdaniem nie ma co testować kodów na TAK aż tak akademickich i nielogicznych przykładach - bo wystarczy że rozbudujesz tę funkcję lcdrferesh o jakieś warunki, sprawdzania, wykonania czegoś i już będzie dobrze się zachowywało w wyrażeniu warunkowym.<br /></div><br /><br />Funkcja nie jest pusta, jest tam obsługa LCD, ustawianie GPIO itd. ale nie umieszczałem tego wszystkiego bo jakby najważniejsza jest zwracana wartość, ale fakt, mogłem wpisać tam komentarz <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Co ciekawe, gdy w późniejszym czasie rozbudowałem bardziej program, newralgiczny element [syntax=c]if(LCD_refresh() != 0)[/syntax] zaczął działać znowu prawidło <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Post dodałem bardziej jako ciekawostkę/przestrogę dla tych, którzy też tak upraszczają kod jak ja <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> — 10 lut 2025, o 12:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2025-02-10T10:36:06+01:00</updated>
<published>2025-02-10T10:36:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24784&amp;p=238839#p238839</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24784&amp;p=238839#p238839"/>
<title type="html"><![CDATA[Re: Ciekawe zachowanie kompilatora]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24784&amp;p=238839#p238839"><![CDATA[
to wynik zbyt agresywnej optymalizacji AVR GCC ale też nie ma co się dziwić gdy stosuje się aż TAK dziwaczne przypadki kodu - sorki ale ta funkcja lcdrefresh twoja jest totalnie bez sensu - więc można się też spodziewać że szczególnie przy jej wykorzystaniu w IF albo w wyrażeniu warunkowym GCC zrobić coś głupiego. W drugim przypadku gdy dajesz jej wartość do zmiennej, wymusza to już na GCC inne wygenerowanie kodu ASM i przerzucenie właściwej wartości do zmiennej bez nadmiernej optymalizacji.<br /><br />Mógłbyś sobie sprawdzić - bo pewnie masz (i dobrze) ustawioną opytmalizację na -Os bo tak się stosuje dla AVR ale jak byś zmienił na np -O2 to już mógłby inaczej się zachowywać kod w tym pierwszym przypadku.<br /><br />Niestety - moim zdaniem nie ma co testować kodów na TAK aż tak akademickich i nielogicznych przykładach - bo wystarczy że rozbudujesz tę funkcję lcdrferesh o jakieś warunki, sprawdzania, wykonania czegoś i już będzie dobrze się zachowywało w wyrażeniu warunkowym.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 10 lut 2025, o 10:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jarecki]]></name></author>
<updated>2025-02-10T07:55:22+01:00</updated>
<published>2025-02-10T07:55:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24784&amp;p=238838#p238838</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24784&amp;p=238838#p238838"/>
<title type="html"><![CDATA[Ciekawe zachowanie kompilatora]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24784&amp;p=238838#p238838"><![CDATA[
Cześć, pisząc program na mikrokontroler AVR zauważyłem ciekawą rzecz.<br />Mam pewną funkcję o nazwie LCD_refresh, która realizuje operacje odświeżania wyświetlacza LCD,<br />po czym zwraca rezultat - zawsze 0 (tylko taki rezultat na ten moment jest obsłużony - nic innego nie może być zwrócone).<br /><br />W funkcji lcdRun wywoływana jest LCD_refresh - w wyrażeniu warunkowym sprawdzam rezultat, jeśli jest inny niż 0, to ustawiam flagę lcdError na 1.<br /><br />I ku mojemu zdziwieniu, po uruchmieniu programu zmienna lcdError przyjmuje wartość 1, pomimo że LCD_refresh &quot;na sztywno&quot; zwraca 0:<br /><br />[syntax=c]static uint8_t lcdError = 0;<br /><br />int8_t LCD_refresh(void)<br />{<br />    return 0;<br />}<br /><br />void lcdRun(void)<br />{<br />    static uint8_t div = 0;<br /><br />    div++;<br /><br />    if(div == 100)<br />    {<br />        if(LCD_refresh() != 0)<br />        {<br />            lcdError = 1;<br />        }<br />    }<br />}[/syntax]<br /><br />Jeżeli jednak lekko zmodyfikuję program, przez wołanie funkcji LCD_refresh przed wyrażeniem warunkowym, zapisując rezultat do zmiennej pomocniczej a następnie dokonuję sprawdzenia,<br />wtedy wszystko działa zgodnie z założeniami, czyli zmienna lcdError jest równa 0.<br /><br />[syntax=c]void lcdRun(void)<br />{<br />    static uint8_t div = 0;<br />    int8_t result;<br /><br />    div++;<br /><br />    if(div == 100)<br />    {<br />        div = 0;<br />        result = LCD_refresh();<br /><br />        if(result != 0)<br />        {<br />            lcdError = 1;<br />        }<br />    }<br />}[/syntax]<br /><br />Co o tym myślicie? Wygląda mi na to na niejednoznaczne zachowanie kompilatora. Nie sprawdzałem co by się stało po zmianie optymalizacji podczas kompilacji- mam ustawioną domyślną.<br /><br />Dodam że program nie jest wielowątkowy, nie ma tu nawet żadnych przerwań, czysty bare metal.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2511">Jarecki</a> — 10 lut 2025, o 07:55</p><hr />
]]></content>
</entry>
</feed>