<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style></head><body lang=CS link=blue vlink="#954F72" style='word-wrap:break-word'><div class=WordSection1><p class=MsoNormal>Od začátku mi bylo jasný, že je to nějaká blbina vzniklá při nějakém zmatkování:-)</p><p class=MsoNormal>Celá tahle část byla zkopírovaná z funkčního projektu, ale tady jsem se navíc rozhod použít HW akumulaci hodnot ADC. Tak jsem typ dat v poli změnil na uint32_t, aby se to tam vešlo. Jenže jsem ho změnil v extern deklaraci v .h, ale ne v tý hlavní v .c. A to způsobilo všechny následující problémy. Normálně při podobných rozdílech překladač protestuje, není mi jasné, proč tentokrát neprotestoval.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>A stejně by mě zajímalo, jak je to tedy s tím volatile, mějme:</p><p class=MsoNormal><b>volatile uint8_t prom1=0, prom2=0, prom3=0</b>;</p><p class=MsoNormal>Budou volatile všechny 3, nebo jenom ta první?</p><p class=MsoNormal><b>volatile uint8_t pole</b><b><span lang=EN-US>[]</span> = </b><b><span lang=EN-US>{0, 0, 0};</span><o:p></o:p></b></p><p class=MsoNormal>Bude volatile <span lang=EN-US>cel</span>ý pole, nebo jen ukazatel na něj?</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>A jak je to s tou atomicitou v C?</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>PH</p><p class=MsoNormal><o:p> </o:p></p><div style='mso-element:para-border-div;border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal style='border:none;padding:0cm'><b>Od: </b><a href="mailto:edizon@seznam.cz">Pavel Hudecek</a><o:p></o:p></p></div><p class=MsoNormal>Preventivně jsem to zkusil oddělit, ale nepomohlo. Po zapnutí optimalizace stejné nesmysly. Na druhou stranu jsem ještě víc debutoval a zavěr je ještě šílenější:<o:p></o:p></p><p class=MsoNormal>Rozdíl mezi výpisem pole v debugu a v memory view:-)<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Najedu myší na adData, ukáže mi to 0x3e00 a po rozbalení data 0010203<o:p></o:p></p><p class=MsoNormal>V memory view je na 0x3e00:<o:p></o:p></p><p class=MsoNormal>00 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 06 00 00 00<o:p></o:p></p><p class=MsoNormal>Tedy to co by tam mělo bejt, ne co ukazuje debug, ani co leze z terminálu.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Najedu na adDataRaw: 0x3e14 a data 5623456<o:p></o:p></p><p class=MsoNormal>V memory view je na 0x3e14:<o:p></o:p></p><p class=MsoNormal>05 00 00 00 06 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 06 00 00 00<o:p></o:p></p><p class=MsoNormal>Tentokrát souhlasí se zobrazeným výčtem v debugu, ale zase nesouhlasí s terminálem.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Z terminálu leze (data/raw):<o:p></o:p></p><p class=MsoNormal>0/0  1/1  2/2  3/3  4/4  0/5  1/6  <o:p></o:p></p><p class=MsoNormal>0/0  1/1  2/2  3/3  4/4  0/5  1/6  <o:p></o:p></p><p class=MsoNormal>0/0  1/1  2/2  3/3  4/4  0/5  1/6  <o:p></o:p></p><p class=MsoNormal>0/5  1/1  2/2  3/3  4/4  0/5  1/6  <o:p></o:p></p><p class=MsoNormal>0/0  1/1  2/2  3/3  4/4  0/5  1/6  <o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>WTF?<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>PH<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><div style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal><b>Od: </b><a href="mailto:sinkomiro@gmail.com">Miroslav Šinko</a><o:p></o:p></p></div><p class=MsoNormal>Nechce sa mi to hladat v norme, ale co si pamatam, tak volatile sa <o:p></o:p></p><p class=MsoNormal>vztahuje na jednu premennu. T.j. (podla mna) v tomto riadku je ako <o:p></o:p></p><p class=MsoNormal>volatile definovana iba premenna msSync:<o:p></o:p></p><p class=MsoNormal>> volatile uint8_t msSync=0, sekSync=0, adSync=0; // =1 po int<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>miro<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>On 23.1.2021 22:08, Pavel Hudecek wrote:<o:p></o:p></p><p class=MsoNormal>> (Zajímavé je, jak se v těch mailech množí řádky a taky kde se berou ty<o:p></o:p></p><p class=MsoNormal>> hvězdičky… Mě to přišlo nenamnožené a bez přidaných hvězdiček, jako je<o:p></o:p></p><p class=MsoNormal>> to vidět v archivu na webu. Jen tečky jsou moje, dal jsem je na začátky<o:p></o:p></p><p class=MsoNormal>> řádků, abych zabránil zrušení odsazení.)<o:p></o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> adSync je definováno v souboru deklarace.c:<o:p></o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> volatile uint8_t msSync=0, sekSync=0, adSync=0; // =1 po int<o:p></o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> a potom v deklarace.h:<o:p></o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> extern volatile uint8_t   msSync, sekSync, adSync; // =1 po int<o:p></o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> a ten se includuje všude.<o:p></o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> Myslel jsem si, že volatile právě onen problém řeší.<o:p></o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> Kombinaci adSync, sekSyns, msSync používám běžně tímto stejným způsobem<o:p></o:p></p><p class=MsoNormal>> a vždycky to fungovalo (a msSync+Seksync tady funguje). Čímž netvrdím,<o:p></o:p></p><p class=MsoNormal>> že jsem si 100% jist správností a adSync je asi 37x rychlejší než msSync.<o:p></o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> Teď jsem zkoušel hledat atomic, atomic variables a pod, ale bohužel<o:p></o:p></p><p class=MsoNormal>> všechno nalezené je jen pro C++, ne C.<o:p></o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> Při debugu byl obsah obou polí odlišný, i když to zastavím hned za forem<o:p></o:p></p><p class=MsoNormal>> co to má kopírovat.<o:p></o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> Po vypnutí optimalizace je výpis krásně 0/0 … 6/6, akorát občas je<o:p></o:p></p><p class=MsoNormal>> 65539/3 místo 3/3.<o:p></o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> Zkusil jsem při kpírování zakázat int:<o:p></o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> __asm__("cli");<o:p></o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> for (i=0; i<AD_chCount; i++) adData[i]=adDataRaw[i];<o:p></o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> __asm__("nop");<o:p></o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> __asm__("sei");<o:p></o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> Kupodivu 65539/3 podstatně přibylo:-)<o:p></o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> Na nop jsem dal breakpoint a výsledkem je, že v adDataRaw jsou normálně<o:p></o:p></p><p class=MsoNormal>> čísla 0-6 a v adData je namícháno 0010203.<o:p></o:p></p></div></body></html>