Цитата(WhiteWolf @ Oct 5 2007, 16:23)

1. Проверьте размеры стеков
2. Вы его перезапускаете в режиме Data abort, а не supervisor - это нормально?
3. Может попробовать LDR PC, 0x80000
3. Попробуйте перезапуск через RSTSTA - специально для этого предназначенный регистр. Сам так сделал, но у меня почему-то похоже после этого обнуляется структура в памяти, куда я сохраняю адрес проблемной инструкции, сейчас пытаюсь с этим разобраться.
Понял свою ошибку. Спасибо!
Действительно не LDR PC,0 а LDR PC,0x800000.
Через RSTSTA уже пробовол, но при этом терял данные в регистре R7.
Данные, в каком регистре хранить знячения при перезапуске определил из анализа startup.s
Ещё проще в отладке заполнить чем - нибудь регистры, дойти до main и посмотреть какой регистр не изменился. У меня не менялись R7 и R8. И ещё какие - то. Уже не помню.
В самом начале main делал анализ и восстановление.
Вот код восстановления
Код
__asm{
ldr r1,=flag_abort
str r7,[r1]
ldr r7,=0
}
а вот в моём случае восстановление задания и фиксация ошибок
Код
if(flag_abort & work_abort)
{
//фиксация ошибок
if(flag_abort & pow_abort)
{
if(_F_Ram_pow_err < 0xFFFF) _F_Ram_pow_err++;
}
else if(flag_abort & Undef_abort)
{
if(_F_Ram_Undef_err < 0xFFFF) _F_Ram_Undef_err++;
}
else if(flag_abort & DAbt_abort)
{
if(_F_Ram_DAbt_err < 0xFFFF) _F_Ram_DAbt_err++;
}
else
{
if(_F_Ram_PAbt_err < 0xFFFF) _F_Ram_PAbt_err++;
};
FEE_Save_page(_FEE_Start);
//
Set_Prc = flag_abort & 0x000000FF; //маска для задания
if(Set_Prc > 5) Set_Prc -= 5; //уменьшение задания на 5%
drink_regulator();
flag2 |= _F_Work_On; //
TCK_L = 0;
LCD_On();
LCD_Cur(STR1);
LCD_Print_rus(" Восстановлен после");
LCD_Cur(STR2);
LCD_Print_rus(" Серьёзной ошибки");
while(TCK_L < TCK_L_MAX)
{
}
LCD_Cls();
}
else if(flag_abort & no_work_abort)
{
//
if(flag_abort & pow_abort)
{
if(_F_Ram_pow_err < 0xFFFF) _F_Ram_pow_err++;
}
else if(flag_abort & Undef_abort)
{
if(_F_Ram_Undef_err < 0xFFFF) _F_Ram_Undef_err++;
}
else if(flag_abort & DAbt_abort)
{
if(_F_Ram_DAbt_err < 0xFFFF) _F_Ram_DAbt_err++;
}
else
{
if(_F_Ram_PAbt_err < 0xFFFF) _F_Ram_PAbt_err++;
};
FEE_Save_page(_FEE_Start);
//
TCK_L = 0;
LCD_Cur(STR1);
LCD_Print_rus(" Восстановлен после");
LCD_Cur(STR2);
LCD_Print_rus(" Серьёзной ошибки");
while(TCK_L <TCK_L_MAX)
{
};
LCD_Cls();
LCD_Off();
}
else
{
G_Draw();
LCD_Cls();
LCD_Off();
};
flag_abort = 0;
Сейчас вроде всё нормально.