int main( void )
{
watchdog_cmd( wd_disable );
watchdog_cmd( wd_8sec );
будет работать корректно, без всяких левый CALL и JMP если оформлено в виде:
typedef enum
{
wd_disable,
wd_1sec = 6,
wd_2sec = 7,
wd_4sec = 8,
wd_8sec = 9,
}Ewd_modes;
////////////////////////////////////////////////////////////////////////////////
#pragma optimize = none
void watchdog_cmd( Ewd_modes in_mode )
{
INTERRUPT_PUSH_AND_CLR;
WATCHDOG_RESET;
switch( in_mode )
{
case wd_disable:
MCU_REG &= ~(1 << WDRF);
u8 t = WDT_REG;
t |= (1 << WDCE) | (1 << WDE);
WDT_REG = t;
WDT_REG = 0;
break;
case wd_8sec:
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;
break;
}
INTERRUPT_POP;
}
Если же попытаетесь убрать введеные временные переменные, типо
////////////////////////////////////////////////////////////////////////////////
#pragma optimize = none
void watchdog_cmd( Ewd_modes in_mode )
{
INTERRUPT_PUSH_AND_CLR;
WATCHDOG_RESET;
switch( in_mode )
{
case wd_disable:
MCU_REG &= ~(1 << WDRF);
WDT_REG |= (1 << WDCE) | (1 << WDE);
WDT_REG = 0;
break;
case wd_8sec:
WDT_REG |= (1 << WDCE) | (1 << WDE);
WDT_REG |= (1 << WDE) | (1 << WDP3) | (1 << WDP0);
break;
}
INTERRUPT_POP;
}
то они появляются.
по ссылке дизасм первого правильного варианта
по рисунку второго некуорректного варианта