Chum_A (14.01.2010 13:25, просмотров: 142) ответил Vladimir Ljaschko на Если про смещение, то так #define OFFSET(type,field) ((char *)&(((type *)0)->field) - (char *)0)
Такая ерня, это без меня сочинили и преумножать не хотелось бы:
typedef struct
{
vu32 DATA;
vu32 OE;
vu32 FUNC;
vu32 ANALOG;
vu32 PULL;
vu32 PD;
vu32 PWR;
vu32 GFEN;
} GPIO_TypeDef;
#define GPIOA_BASE (PERIPH_BASE + 0xA8000)
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
Теперь мне надо банально устроить bit-band посредством макроса, подставив вместо Port GPIOA->DATA
#define PERIPH_BB_BASE 0x42000000
#define SetBit(Port, BitNumber) \
(*(vu32 *) (PERIPH_BB_BASE | ((Port - PERIPH_BASE) << 5) | ((BitNumber) << 2)) = 1)
Если написать SetBit(&GPIOA->DATA, 1) "Кайло" генерит бредятину, пытаясь (безуспешно) почти десятком asm команд подсчитать значение Port