1

Téma: Makra #define

Jsem překvapen, že makra fungují, i když ne asi úplně správně.

Např.:

  #define SYS_DEVICE_IP_ADDRESS 12
  #define SYS_GetIPAddress() SDS_get_u32(SYS_DEVICE_IP_ADDRESS)
  #define SYS_GetIPAddress1() SDS_get_u32(12)

   (1) unsigned int localAddress = SDS_get_u32(SYS_DEVICE_IP_ADDRESS);
   (2) unsigned int localAddress = SYS_GetIPAddress();
   (3) unsigned int localAddress = SYS_GetIPAddress1();

Řádek (1) správně přečte IP adresu, např. 192.168.88.88, řádky (2) a (3) jen její spodní část (vrací 0.169.88.88). Je vidět, že se správně dosadí první definovaná konstanta do makra ve druhém #define, protože obě varianty vracejí stejnou hodnotu. Možná něco dělám špatně, když tak vystačím s variantou (1).

Podobně se chovají i makra s parametry, pro každý parmetr je jiná hodnota výsledku, nicméně špatná:

#define HIBYTE(a) ((a >> 24) & 0x000000FF).

A ještě otázka: typedef kompilátor vezme, ale asi to není nijak implementováno, že?

2

Re: Makra #define

Na ty makra se musím podívat, ale jistá omezení v preprocesoru jsou - je navržen hlavně pro základní použití define/ifdef a podobných, neměl jsem tam cíl pro úplně hluboké kouzlení s preprocesorem, když se to většinou dá zapsat čistě (a čitelně). Nicméně makra jsou implementována a v potřebné (doufám že dobře určené) míře fungují.

Příklad s HIBYTE(a) by ale fungovat měl, musím se podívat co se tam děje a vyzkoušet to.
Nakonec i ty příklady výše by také měli být OK, musím si to projít.
Zkuste nejprve nadefinovat ty proměnné, a až pak jim přiřadit hodnoty.

typedef je zablokován jako klíčové slovo, ale definice nových typů není obecně povolena / implementována, pro tento embedded systém to nemělo velký význam vůči náročnosti implementace a rozsahu potřebných testů.

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

3 Naposledy upravil: absolonj (2022-09-07 14:34:42)

Re: Makra #define

No já jsem zvyklý na různé složité konstrukce, které pro tuto jednoduchou aplikaci nejsou třeba, takže to berte s rezervou. Jen zkoumám možnosti.


K těm makrům - chtěl jsem vypreparovat jednotlivé byty z IP adresy:

#define IP0(a) ((unsigned int)a & 0x000000FF)
...
unsigned char IP0(unsigned int a) { return (unsigned char)(a & 0x000000FF); }
unsigned char IP1(unsigned int a) { return (unsigned char)((a >> 8) & 0x000000FF); }
...

Funkce fungují, ale makra vracejí nějaké vysoké hodnoty - většinou v nejvyšším a nejnižším bytu.

4

Re: Makra #define

V pohodě, účel dáva smysl.
Problému bude nejspíše v implementaci u mě, tam se všude pracuje nativně s int32_t, musím se podívat jak se tam akceptuje to přetypování, ale mělo by, co si z paměti pamatuju (už jsem na tuto část dlouho nesahal), tak makra se interně prakticky interpretují stejně jako funkce, jen svůj zápis ve zdrojovém kódu mají (samozřejmě) jiný.
Jak se k tomu dostanu tak dám vědět.

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

5

Re: Makra #define

Chyba nalezena, opravena (natvrdo se to přetypovávalo na int32_t). Oprava bude v dalším vydání FW.

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

6

Re: Makra #define

Děkuji za rychlost opravy

7

Re: Makra #define

Ještě další dotaz: fungují makra se dvěma prametry? Například:

  #define TIMER_VALUE 16
  #define TIMER_start(t, s) t = s

  int timer;
  TIMER_start(timer, TIMER_VALUE);

neudělá nic, kdežto zápis

  #define TIMER_VALUE 16

  timer =  TIMER_VALUE;

funguje.

8

Re: Makra #define

Původní zápis, ač samozřejmě správný, v tomto případě nelze použít (jak jsem psal, lze se na to dívat tak, že makra s kódem jsou zpracována až za preprocesorem (téměř) jako funkce).

Je to potřeba zapsat takto:

  #define TIMER_VALUE 16
  #define TIMER_start(t, s)   *(t) = (s)

  int timer;
  TIMER_start( &timer, TIMER_VALUE );

Pozn. Závorky (t) a (s) jsou "safety best-practice", na princip (tzn. primárně zde jde o použití & a *) nemají vliv.

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

9

Re: Makra #define

Děkuji za vysvětlení, teď je mi to úplně jasné.