<html xmlns:v="urn:schemas-microsoft-com:vml" 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 12 (filtered medium)"><title>Re: přístup na byty v int C</title><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;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
span.StylE-mailovZprvy18
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=CS link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Já se potřeboval dobelhat k&nbsp;tomuhle<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>                              pUkaz = (char*) &amp;Linear.Krok;<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>                              *pUkaz = eeprom_read (EEpromLinearKorekce + 1);<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>                              pUkaz++;<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>                              *pUkaz = eeprom_read (EEpromLinearKorekce);<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Děkuji panu Štanglovy. Ten poslední řádek mě nakopl. Vlastně děkuji všem. Míra<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> hw-list-bounces@list.hw.cz [mailto:hw-list-bounces@list.hw.cz] <b>On Behalf Of </b>Jaromir Sukuba<br><b>Sent:</b> Tuesday, October 29, 2013 9:39 AM<br><b>To:</b> HW-news<br><b>Subject:</b> Re: přístup na byty v int C<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p>&nbsp;</o:p></p><p><span style='font-size:10.0pt'>Trebars XC8 kompilator, derivat PICC od Hi-Techu, skompiluje tento kusok kodu:<br><br>unsigned char a,b;<br>unsigned int ab;<br>...<br>ab = (((unsigned int)(a))&lt;&lt;8)|b;<br><br>takto:<br><br>0xFFEE: MOVF a, W, ACCESS<br>0xFFF0: MOVWF 0x2, ACCESS<br>0xFFF2: MOVF b, W, ACCESS<br>0xFFF4: MOVWF ab, ACCESS<br><br>Teda fakt tie 4 riadky. Stary PICC od HiTechu nemam poruke.<br><br>2013/10/29 Miroslav Draxal &lt;<a href="mailto:evik@volny.cz">evik@volny.cz</a>&gt;:<br>&gt; Dobrý den,<br>&gt;<br>&gt; Tak konkrétně, vynechme načítání z eeprom, a dejme tomu, že do int potřebuji<br>&gt; zapsat 0xAA a 0xBB aby výsledek byl 0xAABB. Jde o PIC, hitech kompiler. V<br>&gt; asm jsou to 4 řádky, hitech si stím moc neporadí. Chci mu napovědět. Ale<br>&gt; nějak nenapadá jak.<br>&gt;<br>&gt;<br>&gt;<br>&gt; From: <a href="mailto:hw-list-bounces@list.hw.cz">hw-list-bounces@list.hw.cz</a> [<a href="mailto:hw-list-bounces@list.hw.cz">mailto:hw-list-bounces@list.hw.cz</a>] On<br>&gt; Behalf Of Josef Štengl<br>&gt; Sent: Tuesday, October 29, 2013 8:35 AM<br>&gt; To: HW-news<br>&gt; Subject: Re: přístup na byty v int C<br>&gt;<br>&gt;<br>&gt;<br>&gt; Souhlasím, jen doplním.<br>&gt;<br>&gt; Pokud převádíte číslo z jedné velikosti typu do jiné a to oběma směry včetně<br>&gt; prohazování bytů (pro ten samý typ) zapomeňte<br>&gt; na na ukazatele a použijte bitové posuny:<br>&gt;&nbsp;&nbsp; · ukazatele jsou závislé na endianitě (litte endian je sice dominantní leč<br>&gt; ne jediný používaný)<br>&gt;&nbsp;&nbsp; · přistupování ke stejné oblasti paměti pomocí ukazatelů na rozdílné<br>&gt; velikosti je poněkud ošemetná věc, a je od C99<br>&gt; poněkud zpřísněna (viz&nbsp; strict aliasing rule), see níže.<br>&gt;&nbsp;&nbsp; · kompilátory většinou tyto konstrukce rozpoznávají a překládají<br>&gt; optimalizovaně. Je pak docela deprimující, že se píšete<br>&gt; se čtyřmi delšími řádkami a vypadne z toho jedna instrukce :-)<br>&gt;<br>&gt; Na union také pozapomeňte, protože u něj není zaručeno nic, kromě vnějšího<br>&gt; chování (viz norma). Když už je vhodné ho<br>&gt; nasadit, tak se nasazuje se znalostí implementace daného kompilátoru. Další<br>&gt; možný problém je při přístupu k proměnným<br>&gt; zarovnaným na hranici typu, ale to jsem nikdy neměl potřebu ověřovat.<br>&gt;<br>&gt; A máte to vyřešeno :-).<br>&gt;<br>&gt; Na ukazatele to chce vhodnější příklad.<br>&gt;<br>&gt; ced<br>&gt;<br>&gt;<br>&gt;<br>&gt;<br>&gt; ==================================================================<br>&gt;<br>&gt; Zpřísněná pravidla pro přistupování k datům různými typy (pro C99 z C90)<br>&gt;<br>&gt; – more precise aliasing rules via effective type<br>&gt;<br>&gt; Info: Tuto problematiku lze vyhledat pod heslem strict aliasing rule.<br>&gt;<br>&gt; Strict aliasing7) znamená, že kompilátor předpokládá, že dva objekty různého<br>&gt; typu neodkazují na stejnou oblast paměti. Při<br>&gt; nedodržení tohoto pravidla mohou po překladu vzniknout obtížně odhalitelné<br>&gt; chyby8).<br>&gt;<br>&gt; Důvodem zavedení tohoto pravidla je aby autoři kompilátoru mohly bezpečně<br>&gt; předpokládat, že změna jedné proměnné se<br>&gt; neprojeví změnou jiné. A naopak, kdy mají předpokládat, že proměnné mohou<br>&gt; ukazovat na stejnou oblast paměti.<br>&gt;<br>&gt; Například:<br>&gt;<br>&gt; typedef struct<br>&gt; {<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint16_t a;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint32_t b;<br>&gt; } sa_t;<br>&gt;<br>&gt; typedef struct<br>&gt; {<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint16_t a;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint32_t b;<br>&gt; } sb_t;<br>&gt;<br>&gt; sa_t *a;<br>&gt; sb_t *b;<br>&gt;<br>&gt; V tomto případě kompilátor předpokládá, že *a a *b neodkazují na stejnou<br>&gt; oblast paměti ačkoliv formát struktur je shodný.<br>&gt;<br>&gt; sa_t *c, *d;<br>&gt;<br>&gt; int16_t i;<br>&gt; int16_t *p = &amp;i;<br>&gt;<br>&gt; Kompilátor předpokládá, že *c a *d resp i a *p mohou respektive odkazují na<br>&gt; stejnou oblast paměti a nebude používat<br>&gt; příslušné optimalizace.<br>&gt;<br>&gt; Nebo.<br>&gt;<br>&gt; int16_t i;<br>&gt; void fce(int16_t *j, int16_t *k);<br>&gt;<br>&gt; fce(&amp;i, &amp;i);<br>&gt;<br>&gt; Pokud je funkce fce() volána tímto stylem (stejné typy parametrů, resp<br>&gt; hodnota parametru), tak se předpokládá, žej a k<br>&gt; ukazují na stejnou oblast paměti.<br>&gt;<br>&gt; Převedení a dereference neshodných ukazatelů obvykle znamená porušení tohoto<br>&gt; pravidla. Striktní aliasing je předpokládán C<br>&gt; kompilátorem, kterýžto předpokládá, že dereference ukazatelů na objekty<br>&gt; rozdílného typu nebudou odkazovat na shodnou<br>&gt; oblast paměti9)<br>&gt;<br>&gt; Pravidla pro aliasing určují okolnosti za kterých objekt může mít alias10)<br>&gt; jsou definovány v kapitole 6.5 bod 7 standardu C99.<br>&gt; Možné vytváření aliasů<br>&gt;<br>&gt; Vytváření aliasů je možné jen pro objekt k němuž je přistupováno pouze<br>&gt; výrazem odkazujícím do oblasti paměti (lvalue) v<br>&gt; těchto případech.<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Efektivní typ nebo kvalifikovaná verze typu je shodná nebo kompatibilní<br>&gt; s efektivním typem objektu.<br>&gt;<br>&gt; Prakticky to znamená, že typy jsou kompatibilní pokud nejsou rozdílné datové<br>&gt; typy, modifikátory mohou být různé.<br>&gt;<br>&gt; uint32_t var;<br>&gt; uint32_t* const&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a = &amp;var;<br>&gt; uint32_t* volatile&nbsp;&nbsp;&nbsp; b = &amp;var;<br>&gt;<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Typ celých nebo přirozených čísel kompatibilní s typem (efektivní nebo<br>&gt; s kvalifikovanou verzí) objektu.<br>&gt;<br>&gt; int32_t*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c = (int32_t*)&amp;var;<br>&gt; int32_t* const&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d = (int32_t*)&amp;var;<br>&gt; int32_t* volatile&nbsp;&nbsp;&nbsp;&nbsp; e = (int32_t*)&amp;var;<br>&gt; const int32_t* const&nbsp; f = (int32_t*)&amp;var;<br>&gt;<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Jednotlivé členy agregovaného typu (stuct) a typu union splňující<br>&gt; předchozí podmínky (včetně vnořených členů).<br>&gt;<br>&gt; struct s<br>&gt; {<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int32_t j;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int32_t i;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; union u<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint32_t u;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double d;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&gt; };<br>&gt;<br>&gt; double *f = &amp;s.u.d;<br>&gt;<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typ char Datové typy char*, signed char*, nebo unsigned char* mohou<br>&gt; ukazovat kamkoliv na platnou adresu paměti bez<br>&gt; omezení.<br>&gt;<br>&gt; uint64_t long;<br>&gt; int8_t* malej = (int8_t *)&amp;long;<br>&gt;<br>&gt;<br>&gt;<br>&gt;<br>&gt; Dne 29.10.2013 01:17, Radek Benedikt napsal(a):<br>&gt;&gt; Miroslav Draxal píše v Po 28. 10. 2013 v 23:10 +0100:<br>&gt;&gt;&gt; Samozřejmě, tudy cesta vede. Mě vrtá spíš jak to udělat přes ukazatele.<br>&gt;&gt;&gt; Určitě to nějak jde. Abych se něco naučil. Míra<br>&gt;&gt;<br>&gt;&gt;&gt;&gt; Ještě jsem zapomněl přidat jak to dělám do teď. Ale moc se mi to<br>&gt;&gt;&gt;&gt; nelíbí.**<br>&gt;&gt;&gt;&gt; **<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Linear.Krok = eeprom_read<br>&gt;&gt;&gt;&gt; (EEpromLinearKorekce);****<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Linear.Krok &lt;&lt;= 8;****<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Linear.Krok |= eeprom_read<br>&gt;&gt;&gt;&gt; (EEpromLinearKorekce+1);****<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt; ** **<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt; Jak přistoupit přes ukazatele na int Linear.krok (byt1 ; byt2)?****<br>&gt;&gt;<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Slo by pretypovat pointer na Linear.krok na typ pointer na byte,<br>&gt;&gt; protoze inkrement ukazatele je o delku typu, nikoliv o byte. Nicmene je<br>&gt;&gt; to trochu drbani levou rukou za pravym uchem.<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ukazatele bych nechal na pokoji a napsal bych to nacteni na jeden<br>&gt;&gt; radek, misto na tri.Usnadni se tim kompilatoru prace s optimalizaci.<br>&gt;&gt; Tohle je zrovna dost bezna konstrukce a kompilatory ji obvykle umi.<br>&gt;&gt; Nesmi v ni byt ale neco co zavisi na poradi cteni te korekce z EEprom.<br>&gt;&gt; Pak se ale neda spolehnout ani na to rozepsani na tri<br>&gt;&gt; radky.Optimalizatory pri agresivnim nastaveni umi sahnout i do takoveto<br>&gt;&gt; konstrukce. Optimalizace pointrove aritmetiky v prekladaci uz obvykle<br>&gt;&gt; tak slusna neni, je to spis o rucni optimalizaci. Jenze pri ni se do<br>&gt;&gt; toho zacinaji michat strojove zavisle veci a je pak sranda ten zdrojak<br>&gt;&gt; portovat jinam. Objevi se napr. problem little/big endian.<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Navic na vyse popsane konstrukci je videt, ze v podstate prirazeni<br>&gt;&gt; int<br>&gt;&gt; do int muze byt zpracovavane na nekolik kroku a neni proto atomicke. Je<br>&gt;&gt; to docela sranda pri preruseni, kdyz by se cela ta korekce jednou za cas<br>&gt;&gt; doladovala a skocila napr. z&nbsp; 0x3FF na 0x400. To ale jen na okraj.<br>&gt;&gt;<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Radek (bendikt2hw.cz)<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt; _______________________________________________<br>&gt;&gt; HW-list mailing list&nbsp; -&nbsp; sponsored by <a href="http://www.HW.cz">www.HW.cz</a><br>&gt;&gt; <a href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a><br>&gt;&gt; <a href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a><br>&gt;&gt;<br>&gt; _______________________________________________<br>&gt; HW-list mailing list&nbsp; -&nbsp; sponsored by <a href="http://www.HW.cz">www.HW.cz</a><br>&gt; <a href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a><br>&gt; <a href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a><br>&gt;<br>&gt;<br>&gt;<br>&gt; __________ Informace od ESET NOD32 Antivirus, verze databaze 8978 (20131028)<br>&gt; __________<br>&gt;<br>&gt;<br>&gt;<br>&gt; Tuto zpravu proveril ESET NOD32 Antivirus.<br>&gt;<br>&gt; <a href="http://www.eset.cz">http://www.eset.cz</a><br>&gt;<br>&gt;<br>&gt;<br>&gt; __________ Informace od ESET NOD32 Antivirus, verze databaze 8978 (20131028)<br>&gt; __________<br>&gt;<br>&gt;<br>&gt; Tuto zpravu proveril ESET NOD32 Antivirus.<br>&gt;<br>&gt; <a href="http://www.eset.cz">http://www.eset.cz</a><br>&gt;<br>&gt; _______________________________________________<br>&gt; HW-list mailing list&nbsp; -&nbsp; sponsored by <a href="http://www.HW.cz">www.HW.cz</a><br>&gt; <a href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a><br>&gt; <a href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a><br>&gt;<br>_______________________________________________<br>HW-list mailing list&nbsp; -&nbsp; sponsored by <a href="http://www.HW.cz">www.HW.cz</a><br><a href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a><br><a href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a></span><o:p></o:p></p><p class=MsoNormal><br><br>__________ Informace od ESET NOD32 Antivirus, verze databaze 8978 (20131028) __________<br><br>Tuto zpravu proveril ESET NOD32 Antivirus.<br><br><a href="http://www.eset.cz">http://www.eset.cz</a><o:p></o:p></p></div> <BR>
<BR>
__________ Informace od ESET NOD32 Antivirus, verze databaze 8978 (20131028) __________<BR>
<BR>
Tuto zpravu proveril ESET NOD32 Antivirus.<BR>
<BR>
<A HREF="http://www.eset.cz">http://www.eset.cz</A><BR>


 </body></html>