Re: pole bitového pole v C

Andrej Jancura aj.hwlist na gmail.com
Neděle Leden 13 14:47:49 CET 2013


Dobry den,

Len par poznamok ku Vasim postrehom. Mam par verzii HiTechu pre PIC a
stravil som aj par noci tym, ako pisat v C najkratsi kod, porovnatelny
s asemblerom.

Ako prvu poznamku by som si dovolil na adresu sposobu programovania.
Snazil by som sa na Vasom mieste pisat kod inak, t.j. hladal sposoby
ako setrit pamatou tym, ze by som vyuzival vlastnosti, ktore ma
prekladac pri roznych ceckovskych konstrukciach integrovane v sebe,
alebo si pred navrhom hw sadnut a skusit odhadnut, kolko riadkov kodu
sa vmesti do tej ktorej pamati flash. Mozete to urobit tak, ze na
riadok kodu v C poviete ze to zaberie povedzme 16-24-32 instrukcnych
slov v asembleri. Z toho Vam vyjde nejaky minimalny pocet riadkov kodu
v C. A ak sa nevmestite do pamati, pouzit typ s vacsou. Usetri Vam to
dost casu a sprijemni programovanie. Na Vasom mieste by som sa snazil
navrhnut si aj schemu rozdelenia pamati RAM na softverovy stack pre
parametre, globalne premenne a premenne pouzivane kompilatorom. Tie
posledne su cca. 16bytov, teda treba tuto hodnotu odcitat od celkovej
velkosti RAM.

Co sa tyka kompilatorov, zdaleka nie su pisane tak, aby generovali
najkratsi kod. Mam rozne verzie, v ktorych je badat vyvoj, ale v
kazdej je cosi vzdy inak... Takze to co platilo v jednej verzii
neplati v dalsej. Zial XC8 nemam, lebo vaham nad tym, ci to ma vobec
este zmysel investovat do 8-bitov a vyraznym faktorom je aj to, ze
Mchip neplanuje ponukat option restart HPA. Ale zase na druhej strane
sa mi uz nechce ucit nieco nove, ked viem, ze si sadnem a mozem rovno
programovat. Pri ARM by som musel riesit vsetky otazky vyvojovych
prostriedkov a ucit sa ich od zaciatku. Takze neviem, dost vaham.

Dalsia vec, co sa tyka sposobu kompilovania, mchip ma pravdepodobne
pristup aj k nestadartnym normam a podla toho potom zrejme pise
kompilatory. To su tie rozne vychytavky, ktore sa snazite najst a
integrovat ich do Vasho kodu. Nechcem to moc rozvadzat, ale aby ste
aspon tusil preco to je tak, tusim v knizocke emc for product designer
je kapitola venovana emc a programovaniu. Su tam rozne aspekty a je
tam aj poznamka o vyzarovani a imunite. Pokial napisete zly software,
mozete mat tiez problemy, co moze zniet paradoxne, ale faktura a par
tyzdnov stravenych v skusobni Vam to potvrdi.

Takze neviem Vam nic viac poradit, akurat to, aby ste to skusil
prepisat cez lokalne premenne, kedze sa automaticky alokuju a urcite
ich pouzivate v programe na viacerych miestach. Navonok Vam to
nezozerie ziadnu RAM. S kodom to je tazsie, ale to by som riesil, az
ked budete pri nejakom zaplneni pamati, povedzme na 70%.

A.

2013/1/13 Miroslav Draxal <evik na volny.cz>:
> 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.
>
>
>
> typedef union {
>
>     unsigned char value;
>
>     struct {
>
>               unsigned CisloBitu : 6;
>
>               unsigned SetClr : 1;
>
>    } bits;
>
> } _SetBitPole;
>
>
>
> Pokud chci vynulavat cely byt SetBitPole.value=0; // přeloží jako clrf …
>
> SetBitPole.bits.SetClr=1; //přeloží jako bsf…
>
>
>
> Pokud to mám jenom jako char, a chci nastavitb jeden bit, tak automaticky
> používá
>
> movlw 0x01000000
>
> andwf SetBitPole,f
>
> 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ů.
>
>
>
> Prostě mám ve funkci vstupní hodnotu union, abych nemusel ve funkci použít
>
> SetBitPole.value = VstupniHodnota;
>
>
>
> Potřeboval bych, abych mohl volat funkci  àVoid funkce(_SetBitPole
> SetBitPole);
>
> Tímto zápisem
>
> Funkce ((24 - CisloSekce) | 0x40;)
>
> Což samozřejmě nejde z pohledu C,  z pohledu ASM předávám jeden byt.
>
>
>
> 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
>
> Movwf parametr
>
> Call Funkce
>
> …….
>
> Funkce Movf parametr,w
>
>
>
> 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
>
>
>
> 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.
>
> 1/ na zařízení probíhá upgrade soft.
>
> 2/ cokoli předělávat na desce se mi nechce
>
> 3/ další výrobky nebudou
>


Další informace o konferenci Hw-list