<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>Díky.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Přesně takhle řeším atomicitu u čekání v tý funkci cekej() ze které byl ten kus co používá adSync. Tam se pracuje s proměnnou, kterou každou ms přičítá přerušení a čekací funkce podle toho čeká. Okolo jejího nulování a  testu se musí dát zákaz přerušení, jinak čekání občas čeká jinak dlouho. Což je celkem opruz, protože místo přímočarého</p><p class=MsoNormal>while(ms<span lang=EN-US><</span>n) cekani();</p><p class=MsoNormal>musí bejt while(1) <span lang=EN-US>{</span> a uvnitř asm … if … break … asm…, takže se z 1 řádku stane 6.</p><p class=MsoNormal>Tak jsem si při zmínce o atomic napřed myslel, že tý ms můžu dát nějakej atribut atomic a bude po starostech, škoda.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>U toho volatile pole byl záměr dotazu jednodušší, šlo jen o to, zda jsou jeho prvky volatile.</p><p class=MsoNormal><span lang=EN-US>>  </span>Všechny ukazatele ukazují na volatilní proměnnou typu uint8_t</p><p class=MsoNormal>Z toho usuzuji, že odpověď je ano. Občas někde právě píšou, že volatile je pak vlastně jenom pole, ale ne pole<span lang=EN-US>[n], což by bylo dost na ...</span></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:mrazik@volny.cz">Miroslav Mraz</a><o:p></o:p></p></div><p class=MsoNormal>V textu</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Dne 24. 01. 21 v 0:12 Pavel Hudecek napsal(a):</p><p class=MsoNormal>> Od začátku mi bylo jasný, že je to nějaká blbina vzniklá při nějakém </p><p class=MsoNormal>> zmatkování:-)</p><p class=MsoNormal>> </p><p class=MsoNormal>> Celá tahle část byla zkopírovaná z funkčního projektu, ale tady jsem se </p><p class=MsoNormal>> navíc rozhod použít HW akumulaci hodnot ADC. Tak jsem typ dat v poli </p><p class=MsoNormal>> změnil na uint32_t, aby se to tam vešlo. Jenže jsem ho změnil v extern </p><p class=MsoNormal>> deklaraci v .h, ale ne v tý hlavní v .c. A to způsobilo všechny </p><p class=MsoNormal>> následující problémy. Normálně při podobných rozdílech překladač </p><p class=MsoNormal>> protestuje, není mi jasné, proč tentokrát neprotestoval.</p><p class=MsoNormal>> </p><p class=MsoNormal>> A stejně by mě zajímalo, jak je to tedy s tím volatile, mějme:</p><p class=MsoNormal>> </p><p class=MsoNormal>> volatile uint8_t prom1=0, prom2=0, prom3=0;</p><p class=MsoNormal>> </p><p class=MsoNormal>> Budou volatile všechny 3, nebo jenom ta první?</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Všechny.</p><p class=MsoNormal>> </p><p class=MsoNormal>> volatile uint8_t pole[] = {0, 0, 0};</p><p class=MsoNormal>> </p><p class=MsoNormal>> Bude volatile celý pole, nebo jen ukazatel na něj?</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Celý pole. S ukazatelem je to složitější, můžete napsat</p><p class=MsoNormal>   volatile uint8_t * const ptr = pole, * volatile p1 = & prom1, * p2;</p><p class=MsoNormal>//ptr = & prom2; chyba - ukazatel je konstantní</p><p class=MsoNormal>   p1 = & prom2; // OK</p><p class=MsoNormal>   p2 = & prom3; // OK</p><p class=MsoNormal>Všechny ukazatele ukazují na volatilní proměnnou typu uint8_t ale ptr je </p><p class=MsoNormal>sám o sobě konstantní, p1 volatilní a p2 nemodifikovaný. Odtud patrně </p><p class=MsoNormal>pochází omyl, že modifikátor platí jen pro první položku. Syntaxe je to </p><p class=MsoNormal>podivná, ale lze si na to zvyknout - prostě se to čte odzadu.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>> </p><p class=MsoNormal>> A jak je to s tou atomicitou v C?</p><p class=MsoNormal>> </p><p class=MsoNormal>> PH</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>U AVR to bude patrně implementováno zákazem přerušení, pokud vůbec. </p><p class=MsoNormal>Atomický přístup potřebujete u proměnné sdílené mezi přerušením a hlavní </p><p class=MsoNormal>smyčkou pokud do této zapisují _oba_. Pokud jeden zapisuje a druhý pouze </p><p class=MsoNormal>čte, pak stačí volatile.</p></div></body></html>