Значение ПК между двумя инструкциями (счетчик программ)

Пытаюсь понять причину сторожевого пса. Фрагмент процедуры сборки выглядит следующим образом:

fe813cf0:       2820            cmp     r0, #32
fe813cf2:       dbf0            blt.n   fe813cd6 <XYZ+0x10>
fe813cf4:       f04f 30ff       mov.w   r0, #4294967295 ; 0xffffffff
fe813cf8:       bd10            pop     {r4, pc}

Значение моего ПК из дампа — fe813cf3. Что это значит? Как мне это интерпретировать? Пожалуйста, дайте мне знать, если требуется дополнительная информация.


person mk..    schedule 18.04.2013    source источник
comment
Вы тоже знаете процессор mode?   -  person artless noise    schedule 18.04.2013
comment
Каково значение регистра CPSR?   -  person Chris Stratton    schedule 18.04.2013
comment
@artlessnoise Процессор находится в режиме FIQ. Подпрограмма, которую я показываю, вызывается из обработчика FIQ.   -  person mk..    schedule 19.04.2013
comment
@ChrisStratton Извините, у меня нет информации CPSR. У меня есть отдельные значения регистров sp, lr nad.   -  person mk..    schedule 19.04.2013
comment
Вы установили FIQ CPSR в режим большого пальца. Я думаю, что Крис, возможно, после той же проблемы. Каждый источник исключений имеет свой собственный режим. Если вы используете Cortex-Mx, то, возможно, это большой палец по умолчанию. Большинство других процессоров будут работать в режиме ARM, и здесь у вас есть код thumb.   -  person artless noise    schedule 19.04.2013


Ответы (1)


Если срабатывает сторожевой таймер, это указывает на зависание процессора. Состояние, которое вы фиксируете, может быть повреждено в худшем случае. Не уверен, как вы получаете дамп, поэтому трудно сказать.

Как правило, на ARM нечетный адрес указывает на переход, который хотел переключиться на Thumb. Набор инструкций.

См., например, эту документацию BX (обмен ответвлениями) инструкция:

Инструкция BX переходит к адресу, содержащемуся в указанном регистре. Значение бита 0 адреса перехода определяет, будет ли выполнение продолжаться в состоянии ARM или в состоянии Thumb.

Бит 0 адреса может использоваться таким образом, потому что:

  • Все инструкции ARM выравниваются по словам. Это означает, что биты 0 и 1 адреса любой инструкции ARM игнорируются, поскольку эти биты относятся к полуслову и байтовой части адреса.

  • Все инструкции Thumb выравниваются по полуслову. Это означает, что бит 0 адреса любой команды Thumb игнорируется, поскольку он относится к байтовой части адреса.

Однако я почти уверен, что вышеизложенное подразумевает, что ПК на самом деле никогда не устанавливается на нечетный адрес, бит 0 очищается командой перехода.

person unwind    schedule 18.04.2013
comment
Уверен, что дамп не поврежден. Для различных случаев использования, таких как общие сбои, я вижу, что адрес является нечетным числом в ПК. Я пытаюсь выяснить.. Но информация, которую вы дали, была полезной. благодарю вас - person mk..; 18.04.2013
comment
Причина, по которой вы видите нечетное число в дампе ПК, заключается в том, что обработчик исключений получает значение ПК из регистра LR, в котором ПК сохраняется при запуске исключения и векторах ЦП обработчику. Если ЦП находился в режиме большого пальца, когда произошло исключение, LR будет иметь установленный бит 0. Обратите внимание, что из-за эффекта конвейера ПК, который будет сохранен в LR, будет через пару инструкций после инструкции с ошибкой (поэтому я думаю, что инструкция, вызвавшая ошибку, будет по адресу 0xfe813cee - вероятно, загрузка r0 с недопустимого адреса ). - person Michael Burr; 27.04.2013