<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 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*) &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> </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> </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> </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))<<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 <<a href="mailto:evik@volny.cz">evik@volny.cz</a>>:<br>> Dobrý den,<br>><br>> Tak konkrétně, vynechme načítání z eeprom, a dejme tomu, že do int potřebuji<br>> zapsat 0xAA a 0xBB aby výsledek byl 0xAABB. Jde o PIC, hitech kompiler. V<br>> asm jsou to 4 řádky, hitech si stím moc neporadí. Chci mu napovědět. Ale<br>> nějak nenapadá jak.<br>><br>><br>><br>> 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>> Behalf Of Josef Štengl<br>> Sent: Tuesday, October 29, 2013 8:35 AM<br>> To: HW-news<br>> Subject: Re: přístup na byty v int C<br>><br>><br>><br>> Souhlasím, jen doplním.<br>><br>> Pokud převádíte číslo z jedné velikosti typu do jiné a to oběma směry včetně<br>> prohazování bytů (pro ten samý typ) zapomeňte<br>> na na ukazatele a použijte bitové posuny:<br>> · ukazatele jsou závislé na endianitě (litte endian je sice dominantní leč<br>> ne jediný používaný)<br>> · přistupování ke stejné oblasti paměti pomocí ukazatelů na rozdílné<br>> velikosti je poněkud ošemetná věc, a je od C99<br>> poněkud zpřísněna (viz strict aliasing rule), see níže.<br>> · kompilátory většinou tyto konstrukce rozpoznávají a překládají<br>> optimalizovaně. Je pak docela deprimující, že se píšete<br>> se čtyřmi delšími řádkami a vypadne z toho jedna instrukce :-)<br>><br>> Na union také pozapomeňte, protože u něj není zaručeno nic, kromě vnějšího<br>> chování (viz norma). Když už je vhodné ho<br>> nasadit, tak se nasazuje se znalostí implementace daného kompilátoru. Další<br>> možný problém je při přístupu k proměnným<br>> zarovnaným na hranici typu, ale to jsem nikdy neměl potřebu ověřovat.<br>><br>> A máte to vyřešeno :-).<br>><br>> Na ukazatele to chce vhodnější příklad.<br>><br>> ced<br>><br>><br>><br>><br>> ==================================================================<br>><br>> Zpřísněná pravidla pro přistupování k datům různými typy (pro C99 z C90)<br>><br>> – more precise aliasing rules via effective type<br>><br>> Info: Tuto problematiku lze vyhledat pod heslem strict aliasing rule.<br>><br>> Strict aliasing7) znamená, že kompilátor předpokládá, že dva objekty různého<br>> typu neodkazují na stejnou oblast paměti. Při<br>> nedodržení tohoto pravidla mohou po překladu vzniknout obtížně odhalitelné<br>> chyby8).<br>><br>> Důvodem zavedení tohoto pravidla je aby autoři kompilátoru mohly bezpečně<br>> předpokládat, že změna jedné proměnné se<br>> neprojeví změnou jiné. A naopak, kdy mají předpokládat, že proměnné mohou<br>> ukazovat na stejnou oblast paměti.<br>><br>> Například:<br>><br>> typedef struct<br>> {<br>> uint16_t a;<br>> uint32_t b;<br>> } sa_t;<br>><br>> typedef struct<br>> {<br>> uint16_t a;<br>> uint32_t b;<br>> } sb_t;<br>><br>> sa_t *a;<br>> sb_t *b;<br>><br>> V tomto případě kompilátor předpokládá, že *a a *b neodkazují na stejnou<br>> oblast paměti ačkoliv formát struktur je shodný.<br>><br>> sa_t *c, *d;<br>><br>> int16_t i;<br>> int16_t *p = &i;<br>><br>> Kompilátor předpokládá, že *c a *d resp i a *p mohou respektive odkazují na<br>> stejnou oblast paměti a nebude používat<br>> příslušné optimalizace.<br>><br>> Nebo.<br>><br>> int16_t i;<br>> void fce(int16_t *j, int16_t *k);<br>><br>> fce(&i, &i);<br>><br>> Pokud je funkce fce() volána tímto stylem (stejné typy parametrů, resp<br>> hodnota parametru), tak se předpokládá, žej a k<br>> ukazují na stejnou oblast paměti.<br>><br>> Převedení a dereference neshodných ukazatelů obvykle znamená porušení tohoto<br>> pravidla. Striktní aliasing je předpokládán C<br>> kompilátorem, kterýžto předpokládá, že dereference ukazatelů na objekty<br>> rozdílného typu nebudou odkazovat na shodnou<br>> oblast paměti9)<br>><br>> Pravidla pro aliasing určují okolnosti za kterých objekt může mít alias10)<br>> jsou definovány v kapitole 6.5 bod 7 standardu C99.<br>> Možné vytváření aliasů<br>><br>> Vytváření aliasů je možné jen pro objekt k němuž je přistupováno pouze<br>> výrazem odkazujícím do oblasti paměti (lvalue) v<br>> těchto případech.<br>><br>> Efektivní typ nebo kvalifikovaná verze typu je shodná nebo kompatibilní<br>> s efektivním typem objektu.<br>><br>> Prakticky to znamená, že typy jsou kompatibilní pokud nejsou rozdílné datové<br>> typy, modifikátory mohou být různé.<br>><br>> uint32_t var;<br>> uint32_t* const a = &var;<br>> uint32_t* volatile b = &var;<br>><br>><br>> Typ celých nebo přirozených čísel kompatibilní s typem (efektivní nebo<br>> s kvalifikovanou verzí) objektu.<br>><br>> int32_t* c = (int32_t*)&var;<br>> int32_t* const d = (int32_t*)&var;<br>> int32_t* volatile e = (int32_t*)&var;<br>> const int32_t* const f = (int32_t*)&var;<br>><br>><br>> Jednotlivé členy agregovaného typu (stuct) a typu union splňující<br>> předchozí podmínky (včetně vnořených členů).<br>><br>> struct s<br>> {<br>> int32_t j;<br>> int32_t i;<br>> union u<br>> {<br>> uint32_t u;<br>> double d;<br>> }<br>> };<br>><br>> double *f = &s.u.d;<br>><br>><br>> typ char Datové typy char*, signed char*, nebo unsigned char* mohou<br>> ukazovat kamkoliv na platnou adresu paměti bez<br>> omezení.<br>><br>> uint64_t long;<br>> int8_t* malej = (int8_t *)&long;<br>><br>><br>><br>><br>> Dne 29.10.2013 01:17, Radek Benedikt napsal(a):<br>>> Miroslav Draxal píše v Po 28. 10. 2013 v 23:10 +0100:<br>>>> Samozřejmě, tudy cesta vede. Mě vrtá spíš jak to udělat přes ukazatele.<br>>>> Určitě to nějak jde. Abych se něco naučil. Míra<br>>><br>>>>> Ještě jsem zapomněl přidat jak to dělám do teď. Ale moc se mi to<br>>>>> nelíbí.**<br>>>>> **<br>>>>><br>>>>> Linear.Krok = eeprom_read<br>>>>> (EEpromLinearKorekce);****<br>>>>><br>>>>> Linear.Krok <<= 8;****<br>>>>><br>>>>> Linear.Krok |= eeprom_read<br>>>>> (EEpromLinearKorekce+1);****<br>>>>><br>>>>> ** **<br>>>>><br>>>>> Jak přistoupit přes ukazatele na int Linear.krok (byt1 ; byt2)?****<br>>><br>>> Slo by pretypovat pointer na Linear.krok na typ pointer na byte,<br>>> protoze inkrement ukazatele je o delku typu, nikoliv o byte. Nicmene je<br>>> to trochu drbani levou rukou za pravym uchem.<br>>> Ukazatele bych nechal na pokoji a napsal bych to nacteni na jeden<br>>> radek, misto na tri.Usnadni se tim kompilatoru prace s optimalizaci.<br>>> Tohle je zrovna dost bezna konstrukce a kompilatory ji obvykle umi.<br>>> Nesmi v ni byt ale neco co zavisi na poradi cteni te korekce z EEprom.<br>>> Pak se ale neda spolehnout ani na to rozepsani na tri<br>>> radky.Optimalizatory pri agresivnim nastaveni umi sahnout i do takoveto<br>>> konstrukce. Optimalizace pointrove aritmetiky v prekladaci uz obvykle<br>>> tak slusna neni, je to spis o rucni optimalizaci. Jenze pri ni se do<br>>> toho zacinaji michat strojove zavisle veci a je pak sranda ten zdrojak<br>>> portovat jinam. Objevi se napr. problem little/big endian.<br>>> Navic na vyse popsane konstrukci je videt, ze v podstate prirazeni<br>>> int<br>>> do int muze byt zpracovavane na nekolik kroku a neni proto atomicke. Je<br>>> to docela sranda pri preruseni, kdyz by se cela ta korekce jednou za cas<br>>> doladovala a skocila napr. z 0x3FF na 0x400. To ale jen na okraj.<br>>><br>>> Radek (bendikt2hw.cz)<br>>><br>>><br>>> _______________________________________________<br>>> HW-list mailing list - 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><br>>><br>> _______________________________________________<br>> HW-list mailing list - 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><br>><br>><br>><br>> __________ Informace od ESET NOD32 Antivirus, verze databaze 8978 (20131028)<br>> __________<br>><br>><br>><br>> Tuto zpravu proveril ESET NOD32 Antivirus.<br>><br>> <a href="http://www.eset.cz">http://www.eset.cz</a><br>><br>><br>><br>> __________ Informace od ESET NOD32 Antivirus, verze databaze 8978 (20131028)<br>> __________<br>><br>><br>> Tuto zpravu proveril ESET NOD32 Antivirus.<br>><br>> <a href="http://www.eset.cz">http://www.eset.cz</a><br>><br>> _______________________________________________<br>> HW-list mailing list - 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><br>><br>_______________________________________________<br>HW-list mailing list - 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>