йцукен (08.02.2019 15:45, просмотров: 181) ответил Codavr на Вот насчет читаемости мне совсем не очевидно. Хотелось бы пример замены для этого конкретного случая и пример применения в возможном контексте юзеркода. Не настаиваю, но очень хотелось бы убедиться, чиста для собственного развития.
Чиста для развития.
#define BFI(v,bf,pos,width) (v) = (v) & ~(((1<<(width))-1)<<(pos)) | ((bf)<<(pos))
#define PIN_MODE_IN 0UL
#define PIN_MODE_OUT 1UL
#define PIN_MODE_AF 2UL
#define PIN_MODE_ANALOG 3UL
enum pin_mode { MODE_IN = 0, MODE_OUT, MODE_AF, MODE_ANALOG };
void set_pin_mode_int( GPIO_TypeDef * port, int bit, int mode )
{
BFI( port->MODER, mode, 2*bit, 2 );
}
void set_pin_mode_enum( GPIO_TypeDef * port, int bit, enum pin_mode mode )
{
BFI( port->MODER, mode, 2*bit, 2 );
}
void foo()
{
set_pin_mode_int( GPIOA, 0, -666 ); // absurd, but compiler does not mind
set_pin_mode_enum( GPIOB, 1, 1 ); // compiler error: incompatible argument type
set_pin_mode_enum( GPIOC, 2, MODE_OUT );
}