<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 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> </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> </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> </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> </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> </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 pohledu C, z 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> </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> </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> </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 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> </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 -> unsigned char<br>typedef union {<br> unsigned char value;<br> struct {<br> unsigned CisloBitu : 6;<br> unsigned SetClr : 1;<br> } bits;<br>} _SetBitPole;<br><br>ale funkcii by som dal ako vstupny parameter char, opat unsigned<br>void VentilSet (unsigned char CisloVentilu);<br> 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> unsigned CisloBitu : 6;<br> unsigned SetClr : 1;<br>} _bits;<br>Premenna tmp, aj vstupny parameter do funkcie typu _bits.<br><br>Ak chcete zapis formou (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 <<a href="mailto:evik@volny.cz">evik@volny.cz</a>>:<br>> Vlastně obklikou to dělám takhle<br>><br>> tmp.value = (24 - CisloSekce) | 0x40;<br>><br>> VentilSet (tmp);<br>><br>><br>><br>> Chtěl bych<br>><br>> VentilSet ((24 - CisloSekce) | 0x40);<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 Jaroslav Buchta<br>> Sent: Saturday, January 12, 2013 9:44 PM<br>><br>><br>> To: HW-news<br>> Subject: Re: pole bitového pole v C<br>><br>><br>><br>> Ja proste na tyhle prevody jdu pres ukazatele, takze bych to udelal zase<br>> takhle (nezkouseno)<br>><br>> VentilSet (*((_SetBitPole*)&TMP));<br>><br>> Proste se vezme adresa promenne TMP operatorem &, ukazatel na cokoli jde<br>> pretypovat na ukazatel na cokoli jineho, cili i na union a pak se operatorem<br>> dereference * zase ziska objekt na odkazovane adrese (uz pretypovany). Mozna<br>> to jde i jednoduseji, ale ja takhle prevadim i typy z neznaminkovych na<br>> znamenkove, napr. v komunikacnich paketech, kdyz UINT uvnitr obsahuje<br>> hodnotu se znamenkem, napr.: float fTempSecIn =<br>> (float)*(short*)&ProcImgRO.r.tempSecInp100;<br>><br>><br>> Dne 12.1.2013 21:34, Miroslav Draxal napsal(a):<br>><br>> Hmm, přiznávám, že tomu nehovím, neumím to přečíst. Nic. Ráno se k tomu<br>> vrátím, a budu se to snažit pochopit. Pro dnešek ještě jednu věc.<br>><br>><br>><br>> Mějme podprogram<br>><br>> void VentilSet (_SetBitPole CisloVentilu)<br>><br>><br>><br>> kde<br>><br>> typedef union {<br>><br>> char value;<br>><br>><br>><br>> struct {<br>><br>> unsigned CisloBitu : 6;<br>><br>> unsigned SetClr : 1;<br>><br>> } bits;<br>><br>> } _SetBitPole;<br>><br>><br>><br>> Pokud budu mí char TMP<br>><br>> Jak to dostanu do volání toho podprogramu.<br>><br>><br>><br>> VentilSet(TMP)<br>><br>><br>><br>> Stále se jedná o 1byt.<br>><br>> Je mi jasné že na začátku vytvořit TMP jako _ SetBitPole<br>><br>> Přetypování char na union nejde. Jak na to? Míra<br>><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></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>