В настоящее время мы ищем фантом, который имеет вид, что когда мы компилируем в некотором коде (не вызывая его) один конкретный вызов 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.