<html>
<head>
<meta content="text/html; charset=ISO-8859-2"
http-equiv="Content-Type">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<div class="moz-cite-prefix">To asi prekladaci zbytecne komplikujete
zivot, dalo by se bez pomocne promenne:<br>
((char *)&Linear.Krok)[0] = eeprom...<br>
((char *)&Linear.Krok)[1] = eeprom...<br>
<br>
nebo <br>
*((char *)&Linear.Krok + 0) = eeprom...<br>
<br>
Dne 29.10.2013 9:52, Miroslav Draxal napsal(a):<br>
</div>
<blockquote cite="mid:003201ced484$393d3fd0$abb7bf70$@cz"
type="cite">
<meta http-equiv="Content-Type" content="text/html;
charset=ISO-8859-2">
<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]-->
<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"">
<a class="moz-txt-link-abbreviated" href="mailto:hw-list-bounces@list.hw.cz">hw-list-bounces@list.hw.cz</a>
[<a class="moz-txt-link-freetext" href="mailto:hw-list-bounces@list.hw.cz">mailto:hw-list-bounces@list.hw.cz</a>] <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 moz-do-not-send="true"
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 moz-do-not-send="true"
href="mailto:hw-list-bounces@list.hw.cz">hw-list-bounces@list.hw.cz</a>
[<a moz-do-not-send="true"
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
moz-do-not-send="true" href="http://www.HW.cz">www.HW.cz</a><br>
>> <a moz-do-not-send="true"
href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a><br>
>> <a moz-do-not-send="true"
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
moz-do-not-send="true" href="http://www.HW.cz">www.HW.cz</a><br>
> <a moz-do-not-send="true"
href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a><br>
> <a moz-do-not-send="true"
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 moz-do-not-send="true" 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 moz-do-not-send="true" href="http://www.eset.cz">http://www.eset.cz</a><br>
><br>
> _______________________________________________<br>
> HW-list mailing list - sponsored by <a
moz-do-not-send="true" href="http://www.HW.cz">www.HW.cz</a><br>
> <a moz-do-not-send="true"
href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a><br>
> <a moz-do-not-send="true"
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
moz-do-not-send="true" href="http://www.HW.cz">www.HW.cz</a><br>
<a moz-do-not-send="true" href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a><br>
<a moz-do-not-send="true"
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 moz-do-not-send="true" 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 moz-do-not-send="true" href="http://www.eset.cz">http://www.eset.cz</a><br>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">_______________________________________________
HW-list mailing list - sponsored by <a class="moz-txt-link-abbreviated" href="http://www.HW.cz">www.HW.cz</a>
<a class="moz-txt-link-abbreviated" href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a>
<a class="moz-txt-link-freetext" href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a>
</pre>
</blockquote>
<br>
</body>
</html>