[uquote="Эйлер Леонард",url="/forum/viewtopic.php?p=4164409#p4164409"]пирожок только что из печки - прошу откушать[/uquote]Какие преимущества мы получим? Код уменьшится раза в два как в примере с MIN?
Настрогать классов вместо функций это ещё не С++. Вот с чем надо бороться в первую очередь.
Спойлер
Код: Выделить всё
#define GPIO_ATOMIC(expr) \
do { \
if (PIN < GPIO_ATOMIC_MAX) { \
expr; \
} \
else { \
uint8_t sreg = SREG; \
__asm__ __volatile__("cli" ::: "memory"); \
expr; \
SREG = sreg; \
__asm__ __volatile__("" ::: "memory"); \
} \
} while (0)Код: Выделить всё
// Для пародии на AVR
constexpr auto PIN = 30;
constexpr auto GPIO_ATOMIC_MAX = 20;
volatile uint8_t SREG;
template<auto pin>
void GPIO_ATOMIC(auto expr)
{
if constexpr(pin<GPIO_ATOMIC_MAX)
expr();
else
{
uint8_t sreg = SREG;
__disable_irq();
expr();
SREG = sreg;
}
}
GPIO_ATOMIC<PIN>([]{ __NOP(); });


