Как получить исключение из-за простой ошибки или инструкции на руке - PullRequest
2 голосов
/ 12 марта 2019

В настоящее время мы ищем фантом, который имеет вид, что когда мы компилируем в некотором коде (не вызывая его) один конкретный вызов memset, генерируется исключение жесткого сбоя.

Адрес и длина, заданные дляmemset действительны.Проход по нему в режиме одной команды показал, что он всегда терпит неудачу при выполнении инструкции ИЛИ.Но вместо вычисления значения процессор решает вызвать 0xfffffff9, а затем переходит в обработчик hardfault по причине неизвестной инструкции.

Разборка memset, где это происходит:

    0x80192f0  <+0x0020>        03 2c        cmp    r4, #3
    0x80192f2  <+0x0022>        2e d9        bls.n    0x8019352 <memset+130>
    0x80192f4  <+0x0024>        cd b2        uxtb    r5, r1
    # The following line crashes
    0x80192f6  <+0x0026>        45 ea 05 25  orr.w    r5, r5, r5, lsl #8
    0x80192fa  <+0x002a>        0f 2c        cmp    r4, #15
    0x80192fc  <+0x002c>        45 ea 05 45  orr.w    r5, r5, r5, lsl #16

Разборка 0xfffffff9:

    0xfffffff7                   00 00  movs    r0, r0
    0xfffffff9                   00 00  movs    r0, r0
    0xfffffffb                   00 00  movs    r0, r0

Где мы можем найти источник этого исключения?

Мы запускаем программное обеспечение на STM32F429II, который является Cortex-M4.

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Имейте в виду, что для Cortex-M значение регистра ссылки указывает, как возвращаться из исключения, а не адрес для возврата.Соответствующий адрес будет в стеке (при условии, что стек тоже не вышел из строя).

  • 0xFFFFFFF1 Возврат в режим обработчика.
    Возврат исключения получает состояние из основного стека.Выполнение использует MSP после возврата.

  • 0xFFFFFFF9 Возврат в режим потока.

    Исключение Возвращает состояние получения из основного стека.Выполнение использует MSP после возврата.

  • 0xFFFFFFFD Возврат в режим потока.

    Возврат исключения получает состояние из стека процессов.Для выполнения используется PSP после возврата.

Cortex-M также никогда не сможет выполнить код из области памяти «локальной периферии».

0 голосов
/ 20 июня 2019

@ Руди!Я надеюсь, что вы уже решили это.Я только что столкнулся с той же проблемой и хотел бы поделиться своим опытом.

Тот факт, что MCU переходит в HardFault из инструкции orr.w , не означает, что ваша проблема заключается в самой инструкции.Я использовал регистр HFSR (упомянутый @starblue), чтобы найти момент, когда он изменится.Если вы используете Eclipse - просто добавьте точку наблюдения памяти или

(uint32_t)*((uint32_t *) 0xE000ED2C)

к выражениям и найдите строку, в которой значение становится не равным нулю.

В моем случае это была строка с нулевым указателемприсвоение значения.И это было 15 сборочных линий, прежде чем перейти к хардфоут обработчик.В вашем случае это может быть даже в другой ветке.

...