Genadi, даже если уйти от смещений и явно указывать регистры, то проблема остается. Ведь компилятор ругается не на это. Он не хочет принимать указатель как константу.
В теме с исходниками нашел такой файлик "avrio.hpp" от
Аlex312. Там эта задача реализована через enum-ы:
Код
enum __bits {__bit_0=0, __bit_1=1, __bit_2=2, __bit_3=3, __bit_4=4, __bit_5=5, __bit_6=6, __bit_7=7};
enum __ports{__port_A,__port_B,__port_C,__port_D,__port_E,__port_F,__port_G};
enum __ports_reg {__reg_PORT, __reg_DDR, __reg_PIN};
// Шаблон функции, определяющей требуемые адреса в пространстве В/В
template <__ports port, __ports_reg reg> volatile uint8_t& __ports_ref();
#define AVRLIB_SPECIALIZE_PORT_REF(_port_) \
template <> inline volatile uint8_t& __ports_ref<__port_##_port_, __reg_PORT>() { return PORT##_port_; } \
template <> inline volatile uint8_t& __ports_ref<__port_##_port_, __reg_DDR >() { return DDR##_port_; } \
template <> inline volatile uint8_t& __ports_ref<__port_##_port_, __reg_PIN >() { return PIN##_port_; }
#if defined (PORTA)
AVRLIB_SPECIALIZE_PORT_REF(A)
#endif
#if defined (PORTB)
AVRLIB_SPECIALIZE_PORT_REF(B)
#endif
.....
template <__ports port, __bits bit>
class __pin
{
public:
static inline void set(void)
{
__ports_ref<port, __reg_PORT>()|=bit_mask(bit);
}
};
__pin<__port_C,__bit_4> out4;
out4.set();
Довольно муторно, но работает. Правда на этот раз несварение возникает у Иара. Даже на максимальной оптимизации он упорно отказывается сводить "out4.set();" к ассемблерному "sbi".