C: #define, XC8

Miroslav Draxal evik na volny.cz
Pondělí Červen 18 14:10:24 CEST 2018


Dobrý den, ve spolek.
Takže tohle funguje, díky za rozšíření obzorů. 
Trochu jsem si s tím hrál a nakonec jsem z toho udělal makro s výsledkem 
#    define delay_ms(value) if (value < 256) \
                                delay_ms_uint8_t(value); \
                            else  \
                                delay_ms_uint16_t(value);

No a to tu už psal jako druhý mail pan Šinko. Mě tam nedošlo, že se o zbytek postará optimalizace. Díky.
Míra

-----Original Message-----
From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Tomáš Hamouz
Sent: Monday, June 18, 2018 10:20 AM
To: HW-news
Subject: Re: C: #define, XC8

Celá inline konstrukce bude fungovat jen při zadání zpoždění
konstantou a zapnuté optimalizaci.


Mějmež tento kód (inline funkce je definovaná v headeru):

// delay.h
static inline __attribute__((always_inline)) void delay_universal(uint16_t value) {
  if (value < 256) {
    delay_8((uint8_t)value);
  }
  else {
    delay_16(value);
  }
}



Při překladu se stane toto:

// mujkod.c
delay_universal(25);

se rozvine 

if (25 < 256) {
  delay_8(25);
}
else {
  delay_16(25);
}

Warning: constant expression ..., dead code at ...

A optimalizátor se rozhodne nevyužitý kód vyházet

if (25 < 256) {   // konstantní výraz, není třeba větvit
  delay_8(25);    // tohle zůstane
}
else {            // žádné else nemá smysl, porovnání je už teď hotové
  delay_16(25);   // sem se to nikdy nedostane,
}


Takže zbyde jen

delay_8(25);


Obdobně pro konstanty větší než >= 256.

Tomáš





To je mi jasné, ale není mi jasné, jak inline funkci předhodím parametr funkce buď uint8_t nebo uint16_t
 
Static online void delay_ms(????? DelayTime)
 
Míra 
 
From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Tomáš Hamouz
Sent: Friday, June 15, 2018 4:26 PM
To: HW-news
Subject: Re: C: #define, XC8
 
inline funkce je taková která se nevolá CALLem, ale místo toho se rozvine místo toho volání. V praxi pak máte tutéž funkci implementovanou na mnoho místech.
Ve Vašem případě pokud byste volal příslušnou rozhodovací funkci s konstantním parametrem, optimalizátor pozná že podmínka je konstantní a nevyužitý kód vyhází pryč.

Tedy rozhodování zda se zavolá uint8_t či uint16_t verze se ponechá na optimalizátoru. Je možné že bude generovat warningy že se rozhodujete podle konstantího výrazu.

Tomáš



> Můžeme to trochu rozvést? 
> Mám dvě funkce, které provádějí totéž, jedna ovšem s uint8_t a druhá s uint16_t.
> Čili
> void xx1(uint8_t);
> void xx2(uint16_t);
> Chtěl jsem, aby preprocesor si podle hodnoty při volání funkce sám rozhodl, kterou funkci použije.

> Jak jste to myslel s tím static inline?
> Musím se přiznat, že o tom inline jsem slyšel poprvé. Ale co jsem
> se o tom přečetl v pdf k XC8, tak podle mě to můj problém neřeší.
> Míra

> -----Original Message-----
> From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Jan Waclawek
> Sent: Thursday, June 14, 2018 9:14 PM
> To: HW-news
> Subject: Re: C: #define, XC8

> Nie:
> 1. ak to mate napisane tak, ako vidime, t.j. medzi jednotlivymi riadkami je
> prazdny riadok, tak tie spatne lomitka su neucinne - tie "zozeru" vzdy len
> jedno zariadkovanie
> 2. ak tam tie prazdne riadky nemate, tak v 2. faze prekladu (C99 5.1.1.2)
> sa vyhadzu spatne lomitka na konci riadkov a pripoja sa k nim riadky za
> nimi nasledujuce. Ale to znamena, ze vo faze 4, ked sa maju vykonavat tie
> preprocesorove direktivy, tak to #if uz nie je preprocesorova direktiva,
> lebo nie je na zaciatku riadku (6.10#2)

> Ale nerobte si vrasky, napiste pokojne funkciu s tymto istym obsahom,
> oznacte static inline, a kazdy slusny (a polovica tych neslusnych)
> prekladac urobi to co chcete. 

> Ledazeby ste mali vypnutu optimalizaciu, co je blbost.

> wek


> ----- Original Message ---------------

> Subject: C: #define, XC8
>    From: "Miroslav Draxal" <evik na volny.cz>
>    Date: Thu, 14 Jun 2018 19:51:24 +0200
>      To: "'HW-news'" <hw-list na list.hw.cz>

> Dobrý den,

> Existuje nìjaká mo¾nost, rozchodit následující?

>  

> void delay_ms_uint16_t(uint16_t DelayTime);

> void delay_ms_uint8_t(uint8_t DelayTime);

>  

> #    define delay_ms(DelayTime) \

>         #if DelayTime < 256 \

>             delay_ms_uint8_t(DelayTime) \

>         #else \

>             delay_ms_uint16_t(DelayTime) \

>         #endif

>  

> Ztrozkotá to na  "illegal "#" directive" 

> Díky za nápady.

> Míra


> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list

> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list


_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list



Další informace o konferenci Hw-list