<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>(Zajímavé je, jak se v těch mailech množí řádky a taky kde se berou ty hvězdičky… Mě to přišlo nenamnožené a bez přidaných hvězdiček, jako je to vidět v archivu na webu. Jen tečky jsou moje, dal jsem je na začátky řádků, abych zabránil zrušení odsazení.)</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>adSync je definováno v souboru deklarace.c:</p><p class=MsoNormal>volatile uint8_t msSync=0, sekSync=0, adSync=0; // =1 po int</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>a potom v deklarace.h:</p><p class=MsoNormal>extern volatile uint8_t    msSync, sekSync, adSync; // =1 po int</p><p class=MsoNormal>a ten se includuje všude.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Myslel jsem si, že volatile právě onen problém řeší.</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 a vždycky to fungovalo (a msSync+Seksync tady funguje). Čímž netvrdím, že jsem si 100% jist správností a adSync je asi 37x rychlejší než msSync.</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 všechno nalezené je jen pro C++, ne C.</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 co to má kopírovat.</p><p class=MsoNormal>Po vypnutí optimalizace je výpis krásně 0/0 … 6/6, akorát občas je 65539/3 místo 3/3.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Zkusil jsem při kpírování zakázat int:</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>__asm__("cli");</p><p class=MsoNormal>for (i=0; i<AD_chCount; i++) adData[i]=adDataRaw[i];</p><p class=MsoNormal>__asm__("nop");</p><p class=MsoNormal>__asm__("sei");</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Kupodivu 65539/3 podstatně přibylo:-)</p><p class=MsoNormal>Na nop jsem dal breakpoint a výsledkem je, že v adDataRaw jsou normálně čísla 0-6 a v adData je namícháno 0010203.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></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></p></div><p class=MsoNormal>ISR (ADC0_RESRDY_vect) { // 37,1 kHz / 16 ======</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>         if (adSync) return; // nejaky problem zpracovani</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>.              static uint8_t     ind=0;</p><p class=MsoNormal>.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>.              //adDataRaw[ind]=(uint32_t)ADC0_RES;</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>.              adDataRaw[ind]=(uint32_t)ind;</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>.              if (++ind>=AD_chCount) ind=0;</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>.              ADC0_MUXPOS=AD_chFirst+ind;</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>.              adSync=1;</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>.              ADC0_INTFLAGS=1;</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>}</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Ve funkci cekej je mj. (i je lokální int):</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>if (adSync==1) { // -------------------------</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>.              for (i=0; i<AD_chCount; i++) adData[i]=adDataRaw[i];</p><p class=MsoNormal>.</p><p class=MsoNormal>.              adSync=0;   // az zde</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>}</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>adSync by mělo být něco jako C ekvivalent std::atomic, nechce se mi to </p><p class=MsoNormal>hledat.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Mrazík</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Dne 23. 01. 21 v 20:14 Pavel Hudecek napsal(a):</p><p class=MsoNormal>> Dobrý den všem,</p><p class=MsoNormal>> </p><p class=MsoNormal>> ATtiny816, Atmel Studio</p><p class=MsoNormal>> </p><p class=MsoNormal>> volatile uint32_t               adDataRaw[AD_chCount];</p><p class=MsoNormal>> </p><p class=MsoNormal>> uint32_t                              adData[AD_chCount];</p><p class=MsoNormal>> </p><p class=MsoNormal>> ISR (ADC0_RESRDY_vect) { // 37,1 kHz / 16 ======</p><p class=MsoNormal>> </p><p class=MsoNormal>> .              static uint8_t     ind=0;</p><p class=MsoNormal>> </p><p class=MsoNormal>> .</p><p class=MsoNormal>> </p><p class=MsoNormal>> .              //adDataRaw[ind]=(uint32_t)ADC0_RES;</p><p class=MsoNormal>> </p><p class=MsoNormal>> . *adDataRaw[ind]=(uint32_t)ind;*</p><p class=MsoNormal>> </p><p class=MsoNormal>> .</p><p class=MsoNormal>> </p><p class=MsoNormal>> . *if (++ind>=AD_chCount) ind=0;*</p><p class=MsoNormal>> </p><p class=MsoNormal>> .              ADC0_MUXPOS=AD_chFirst+ind;</p><p class=MsoNormal>> </p><p class=MsoNormal>> .</p><p class=MsoNormal>> </p><p class=MsoNormal>> .              adSync=1;</p><p class=MsoNormal>> </p><p class=MsoNormal>> .              ADC0_INTFLAGS=1;</p><p class=MsoNormal>> </p><p class=MsoNormal>> }</p><p class=MsoNormal>> </p><p class=MsoNormal>> Ve funkci cekej je mj. (i je lokální int):</p><p class=MsoNormal>> </p><p class=MsoNormal>> if (adSync==1) { // -------------------------</p><p class=MsoNormal>> </p><p class=MsoNormal>> .              adSync=0;</p><p class=MsoNormal>> </p><p class=MsoNormal>> .</p><p class=MsoNormal>> </p><p class=MsoNormal>> . *for (i=0; i<AD_chCount; i++) adData[i]=adDataRaw[i];*</p><p class=MsoNormal>> </p><p class=MsoNormal>> }</p><p class=MsoNormal>> </p><p class=MsoNormal>> V mainu je while(1) a tam mj. (n je lokální uint32_t):</p><p class=MsoNormal>> </p><p class=MsoNormal>> cekej(1000);</p><p class=MsoNormal>> </p><p class=MsoNormal>> for (n=0; n<AD_chCount; n++) {</p><p class=MsoNormal>> </p><p class=MsoNormal>> .              cislo((uint32_t)adData[n]); text("/");</p><p class=MsoNormal>> </p><p class=MsoNormal>> .              cislo((uint32_t)adDataRaw[n]); text(" ");</p><p class=MsoNormal>> </p><p class=MsoNormal>> }</p><p class=MsoNormal>> </p><p class=MsoNormal>> UART_crlf;</p><p class=MsoNormal>> </p><p class=MsoNormal>> A z terminálu leze:</p><p class=MsoNormal>> </p><p class=MsoNormal>> 5/5 6/1 2/2 3/3 4/4 0/5 1/6</p><p class=MsoNormal>> </p><p class=MsoNormal>> 5/5 6/1 2/2 3/3 4/4 0/5 1/6</p><p class=MsoNormal>> </p><p class=MsoNormal>> 0/5 6/1 2/2 3/3 4/4 0/5 1/6</p><p class=MsoNormal>> </p><p class=MsoNormal>> 5/5 1/1 2/2 3/3 4/4 0/5 1/6</p><p class=MsoNormal>> </p><p class=MsoNormal>> Proč z terminálu neleze</p><p class=MsoNormal>> </p><p class=MsoNormal>> 0/0 1/1 2/2 3/3 4/4 5/5 6/6</p><p class=MsoNormal>> </p><p class=MsoNormal>> ???</p></div></body></html>