самое интересное что даже предложенный optimize = none не помогает - везде переходы вставляет.
по вашему примеру сделал следующее и сразу лучше стало:
////////////////////////////////////////////////////////////////////////////////
#pragma optimize = none
void watchdog_disable( void )
{
INTERRUPT_PUSH_AND_CLR;
WATCHDOG_RESET;
MCU_REG &= ~(1 << WDRF);
u8 t = WDT_REG;
t |= (1 << WDCE) | (1 << WDE);
WDT_REG = t;
WDT_REG = 0;
INTERRUPT_POP;
}
////////////////////////////////////////////////////////////////////////////////
#pragma optimize = none
void watchdog_enable_8sec( void )
{
INTERRUPT_PUSH_AND_CLR;
WATCHDOG_RESET;
u8 t1 = WDT_REG;
u8 t2 = t1;
t1 |= (1 << WDCE) | (1 << WDE);
t2 |= (1 << WDE) | (1 << WDP3) | (1 << WDP0);
WDT_REG = t1;
WDT_REG = t2;
INTERRUPT_POP;
}
и все отлично, но компилятор сует JUMP, как бы избавиться ?
причина то в том, что обе фунции юзаются.
int main( void )
{
watchdog_disable();
бла-бла
watchdog_enable_8sec();
}
Можно конечно сделать сразу енабле, но это не выход - вдруг потом где в пректе будет строка управления ватчдогом и оптимизатор нафигачит и буду чесать репу