В настоящее время мы охотимся за фантомом, который находится в форме, когда мы компилируем какой-либо код (без его вызова) один конкретный вызов memset генерирует исключение жесткой ошибки.
Адрес и длина, указанные для memset, действительны. Пошаговое выполнение в режиме одной инструкции показало, что он всегда терпит неудачу при выполнении инструкции ИЛИ. Но вместо вычисления значения процессор решает вызвать 0xffffffff9, а затем переходит к обработчику аппаратной ошибки с причиной неизвестной инструкции.
Разборка 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
Разборка 0xffffffff9:
0xfffffff7 00 00 movs r0, r0
0xfffffff9 00 00 movs r0, r0
0xfffffffb 00 00 movs r0, r0
Где мы можем найти источник этого исключения?
Мы запускаем программное обеспечение на STM32F429II, который является Cortex-M4.
orr
недоступна в ARMv6-M/Cortex-M0. Кроме того, в обработчике аппаратных сбоев вы можете просмотреть различные регистры состояния (например, HFSR, CFSR), чтобы узнать больше. - person starblue   schedule 12.03.2019