<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: pole bitového pole v C</title><style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@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'>Výhody unionu pro mcu jsou v&nbsp;tom,  že dokážu různým způsobem přinutit kompilátor aby šetřil paměti.<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><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>typedef union {<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>    unsigned char value;<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>    struct {<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>              unsigned CisloBitu : 6;<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>              unsigned SetClr : 1;<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>   } bits;<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>} _SetBitPole;<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Pokud chci vynulavat cely byt SetBitPole.value=0; // přeloží jako clrf …<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>SetBitPole.bits.SetClr=1; //přeloží jako bsf…<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Pokud to mám jenom jako char, a chci nastavitb jeden bit, tak automaticky používá <o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>movlw 0x01000000<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>andwf SetBitPole,f<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Prostě se snažím co nejvíc podstrkovat kompilátoru jak udělat co nejkratší kód. Ono se řekne, vždyť je to jeden byt navíc. U dospělých MCU to nevadí, ale já šetřím pamětí. Takových hle pár vychytávek a mám volných dalších 100 bytů.<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Prostě mám ve funkci vstupní hodnotu union, abych nemusel ve funkci použít<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>SetBitPole.value = VstupniHodnota;<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Potřeboval bych, abych mohl volat funkci  </span></b><b><span style='font-size:11.0pt;font-family:Wingdings;color:#1F497D'>à</span></b><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Void funkce(_SetBitPole SetBitPole);<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Tímto zápisem<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Funkce ((24 - CisloSekce) | 0x40;)<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Což samozřejmě nejde z&nbsp;pohledu C,  z&nbsp;pohledu ASM předávám jeden byt.<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Důvod proč. Zjistil jsem, pokud volám funkci jako char, tak se parametr předá ve W, ale pokud předávám parametr jednobytového unionu, tak to přeloží jako<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Movwf parametr<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Call Funkce<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>…….<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Funkce Movf parametr,w<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Kompilátor by si to měl umět optimalizovat, ale neumí. Ušetřil bych 2 byty. Snažím se to obejít. Uznávám, že to je, jako když si pes honí ocas. Míra<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Ps. Celkovou „mou optimalizací“ zápisu C kódu jsem již ušetřil 0,5kB paměti a stále jsou v&nbsp;zápisu rezervy. Nesmějte se vy, co používáte dospělé MCU. <o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>1/ na zařízení probíhá upgrade soft.<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>2/ cokoli předělávat na desce se mi nechce<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>3/ další výrobky nebudou<o:p></o:p></span></b></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> <o:p></o:p></span></b></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>Miroslav Šinko<br><b>Sent:</b> Saturday, January 12, 2013 11:32 PM<br><b>To:</b> HW-news<br><b>Subject:</b> Re: pole bitového pole v 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'>Mierne sa stracam v tom, co presne chcete robit. Union poskytuje rozny<br>pristup k tej istej oblasti pamati. Vas pripad by som asi riesil takto<br>(ale vravim, neviem, ci chapem zadanie):<br>union ostane, az na char -&gt; unsigned char<br>typedef union {<br>&nbsp;&nbsp;&nbsp; unsigned char value;<br>&nbsp;&nbsp;&nbsp; struct {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned CisloBitu : 6;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned SetClr : 1;<br>&nbsp;&nbsp; } bits;<br>} _SetBitPole;<br><br>ale funkcii by som dal ako vstupny parameter char, opat unsigned<br>void VentilSet (unsigned char CisloVentilu);<br>&nbsp;tmp bude typu union:<br>_SetBitPole tmp;<br><br>teraz si nastavim polozky, kedze mate CisloSekce a hodnotu, tak:<br>tmp.bits.CisloBitu=(24 - CisloSekce);<br>tmp.bits.SetClr=1;<br><br>funkcii predam value (vyuzivam ten rozny pristup k rovnakej pamati):<br>VentilSet(tmp.value);<br><br>Neviem, co vo funkcii potrebujete robit, ak potrebujete opat<br>pristupovat bitovo, tak Vas prototyp void VentilSet (_SetBitPole<br>CisloVentilu) bol OK, volanie jednoducho<br>VentilSet(tmp);<br>Len potom nechapem vyznam unionu, staci bitove pole:<br>typedef struct {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned CisloBitu : 6;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned SetClr : 1;<br>} _bits;<br>Premenna tmp, aj vstupny parameter do funkcie typu _bits.<br><br>Ak chcete zapis formou&nbsp; (24 - CisloSekce) | 0x40; tak je zase zbytocne<br>bitove pole a stacia vam vsetky typy char, lepsie unsigned char.<br><br>Pretypovavacie zapisy budu fungovat, ale vobec nerozumiem preco by ste<br>ich pouzivat, kedze pri nich vobec nevyuzivate vyhody unionu.<br><br>miro<br><br><br>2013/1/12 Miroslav Draxal &lt;<a href="mailto:evik@volny.cz">evik@volny.cz</a>&gt;:<br>&gt; Vlastně obklikou to dělám takhle<br>&gt;<br>&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;&nbsp;&nbsp;&nbsp; tmp.value = (24 - CisloSekce) | 0x40;<br>&gt;<br>&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;&nbsp;&nbsp;&nbsp; VentilSet (tmp);<br>&gt;<br>&gt;<br>&gt;<br>&gt; Chtěl bych<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; VentilSet ((24 - CisloSekce) | 0x40);<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 Jaroslav Buchta<br>&gt; Sent: Saturday, January 12, 2013 9:44 PM<br>&gt;<br>&gt;<br>&gt; To: HW-news<br>&gt; Subject: Re: pole bitového pole v C<br>&gt;<br>&gt;<br>&gt;<br>&gt; Ja proste na tyhle prevody jdu pres ukazatele, takze bych to udelal zase<br>&gt; takhle (nezkouseno)<br>&gt;<br>&gt; VentilSet (*((_SetBitPole*)&amp;TMP));<br>&gt;<br>&gt; Proste se vezme adresa promenne TMP operatorem &amp;, ukazatel na cokoli&nbsp; jde<br>&gt; pretypovat na ukazatel na cokoli jineho, cili i na union a pak se operatorem<br>&gt; dereference * zase ziska objekt na odkazovane adrese (uz pretypovany). Mozna<br>&gt; to jde i jednoduseji, ale ja takhle prevadim i typy z neznaminkovych na<br>&gt; znamenkove, napr. v komunikacnich paketech, kdyz UINT uvnitr obsahuje<br>&gt; hodnotu se znamenkem, napr.: float fTempSecIn =<br>&gt; (float)*(short*)&amp;ProcImgRO.r.tempSecInp100;<br>&gt;<br>&gt;<br>&gt; Dne 12.1.2013 21:34, Miroslav Draxal napsal(a):<br>&gt;<br>&gt; Hmm, přiznávám, že tomu nehovím, neumím to přečíst. Nic. Ráno se k tomu<br>&gt; vrátím, a budu se to snažit pochopit. Pro dnešek ještě jednu věc.<br>&gt;<br>&gt;<br>&gt;<br>&gt; Mějme podprogram<br>&gt;<br>&gt; void VentilSet (_SetBitPole CisloVentilu)<br>&gt;<br>&gt;<br>&gt;<br>&gt; kde<br>&gt;<br>&gt; typedef union {<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; char value;<br>&gt;<br>&gt;<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; struct {<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned CisloBitu : 6;<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned SetClr : 1;<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; } bits;<br>&gt;<br>&gt; } _SetBitPole;<br>&gt;<br>&gt;<br>&gt;<br>&gt; Pokud budu mí char TMP<br>&gt;<br>&gt; Jak to dostanu do volání toho podprogramu.<br>&gt;<br>&gt;<br>&gt;<br>&gt; VentilSet(TMP)<br>&gt;<br>&gt;<br>&gt;<br>&gt; Stále se jedná o 1byt.<br>&gt;<br>&gt; Je mi jasné že na začátku vytvořit TMP jako _ SetBitPole<br>&gt;<br>&gt; Přetypování char na union nejde. Jak na to? Míra<br>&gt;<br>&gt;<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 7887 (20130112) __________<br><br>Tuto zpravu proveril ESET NOD32 Antivirus.<br><br><a href="http://www.eset.cz">http://www.eset.cz</a><br><br><br>__________ Informace od ESET NOD32 Antivirus, verze databaze 7888 (20130113) __________<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 7888 (20130113) __________<BR>
<BR>
Tuto zpravu proveril ESET NOD32 Antivirus.<BR>
<BR>
<A HREF="http://www.eset.cz">http://www.eset.cz</A><BR>


 </body></html>