Да вроде бы проще нельзя. А надо? :-) Я бы вообще написал
inline uint8_t __save_interrupt(void) {
uint8_t old_sreg = SREG;
cli();
return old_sreg;
}
inline void __restore_intrreupt(uint8_t old_sreg) {
SREG = old_sreg;
}
воспользовавшись уже имеющимся в avr/interrupt.h макросом cli()
Кстати, вполне недурственно и так (подсмотрено в рассылке avr-gcc-list)
#define ATOMIC_CODE(_code_) do {\
uint8_t __atomic_code_sreg__ = SREG; \
cli(); \
{ _code_ } \
SREG = __atomic_code_sreg__; \
} while(0)
ATOMIC_CODE(
OCR3A = TCNT3 + ocr3_step;
*ptr++ = TCNT1;
);