Требуется перезапускать устройство с сохранением одного параметра (слова) в каком нибудь регистре при возникновении Undef,DAbt,PAbt.
Имеется ввиду переходить в начало кода, /производить перенастройку всего железа/
Уменьшать сохренённое в регистре задание и продолжать работу.
В основе ADuC7024. Вроде всё работает, но иногда зависает и не перезапускается по непонятным причинам.
вот код:
Код
void DAbt_Handler(void) __arm
{
FIQEN = 0;
// IRQEN = 0;
GP4CLR = _Set_DC_DC_Off;
Service_Cicle = 0;
while(Service_Cicle<TCK_MAX)
{
pw[Service_Cicle] = 0;
Service_Cicle++;
};
GP2SET = _mod_on;
//
if(flag2 & _F_Work_On)
{
flag_abort = work_abort | DAbt_abort | Set_Prc;
}
else
{
flag_abort = no_work_abort | DAbt_abort | Set_Prc;
};
REMAP = 0;
__asm{
ldr r8,=flag_abort
ldr r7,[r8]
ldr pc,0
}
}
{
FIQEN = 0;
// IRQEN = 0;
GP4CLR = _Set_DC_DC_Off;
Service_Cicle = 0;
while(Service_Cicle<TCK_MAX)
{
pw[Service_Cicle] = 0;
Service_Cicle++;
};
GP2SET = _mod_on;
//
if(flag2 & _F_Work_On)
{
flag_abort = work_abort | DAbt_abort | Set_Prc;
}
else
{
flag_abort = no_work_abort | DAbt_abort | Set_Prc;
};
REMAP = 0;
__asm{
ldr r8,=flag_abort
ldr r7,[r8]
ldr pc,0
}
}
Другие модули идентичны.
Устройсво работает в зоне больших эл.м помех. Кроме того возможны аппаратные казусы. А рядом никого нет, чтобы перезапустить и установить уменьшеное задание задание.
То что по DAbt оно отрабатывает - проверено. Но Undef и PAbt не зафиксировано.
(Устройство при таком перезапуске инкрементирует во FLASH - е кол-во тех или иных ситуаций по сохранённым в R7 данным)
Будьте добры укажите где копать. (Кроме железа - это мне известно)
Заранее благодарен!