Под "отладка падает на строке" имел в виду то, находясь на строке Х и вызывая "Step Into" отладчик переходил не к следующей команде, а улетал неизвестно куда. Расставив брэкпойнты выяснил, что со строки "ResetAddr = *(unsigned int*)(LOADER_BUF_START+4)" отладчик перескакивал сразу к условному оператору "if (isSoftwareError)". Но, открыл окно дизасемблера, стал шагать по асм-командам. Все они исправно выполняются. Видимо есть нюансы при отладке при ненулевом уровне оптимизации.
"ResetAddr = *(unsigned int*)(LOADER_BUF_START+4);" выполняется правильно (LOADER_BUF_START находится за границами указанными линкеру), volatile добавлю для надёжности, спасибо за совет.
Глюк ушёл и не появляется даже если я теперь убираю квалификатор static при объявлении переменной ResetAddr. Не понятно из-за чего возникла ошибка, почему она пропала и, ГЛАВНОЕ, ожидать ли её появление вновь.
asm для STM32 не знаю, вот листинг на всякий случай.
CODE
ResetAddr = *(unsigned int*)(LOADER_BUF_START+4);
if ( (ResetAddr < ROM_START) || (ResetAddr > ROM_END) )
isSoftwareError = true;
if ( (ResetAddr & 0x00000003) != 1) //Адрес кратен 4, +1, т.е. 2 младших бита 0b0..01.
isSoftwareError = true;
if (isSoftwareError)
StatusReg |= RUN_UPDATE_SW_ERROR;
.......................
ResetAddr = *(unsigned int*)(LOADER_BUF_START+4);
??RunUpdatePackParser_2:
0x8000a14: 0x6870 LDR R0, [R6, #0x4]
if ( (ResetAddr < ROM_START) || (ResetAddr > ROM_END) )
0x8000a16: 0x4932 LDR.N R1, ??DataTable4_14 ; 0xf7ffe000 (-134225920)
0x8000a18: 0x1809 ADDS R1, R1, R0
0x8000a1a: 0xf5b1 0x3ff0 CMP.W R1, #122880 ; 0x1e000
0x8000a1e: 0xd300 BCC.N ??RunUpdatePackParser_3 ; 0x8000a22
isSoftwareError = true;
0x8000a20: 0x2501 MOVS R5, #1
if ( (ResetAddr & 0x00000003) != 1) //дрес кратен 4, +1, т.е. 2 младших бита 0b0..01.
??RunUpdatePackParser_3:
0x8000a22: 0xf000 0x0003 AND.W R0, R0, #3
0x8000a26: 0x2801 CMP R0, #1
0x8000a28: 0xd000 BEQ.N ??RunUpdatePackParser_4 ; 0x8000a2c
isSoftwareError = true;
0x8000a2a: 0x2501 MOVS R5, #1
if (isSoftwareError)
??RunUpdatePackParser_4:
0x8000a2c: 0x2d00 CMP R5, #0
0x8000a2e: 0xd004 BEQ.N ??RunUpdatePackParser_5 ; 0x8000a3a
.......................