ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
26 ноября
971371 Топик полностью
Nikolay_Po (18.01.2020 13:55, просмотров: 339) ответил evgeniy1294 на Если немного заморочиться, то можно легко найти проблему:
Стек превращается в месиво ещё до срабатывания исключений. Попробовал такую функцию: void prvGetRegistersFromStack(uint32_t *pulFaultStackAddress) { /* These are volatile to try and prevent the compiler/linker optimising them away as the variables never actually get used. If the debugger won't show the values of the variables, make them global my moving their declaration outside of this function. */ volatile uint32_t r0; volatile uint32_t r1; volatile uint32_t r2; volatile uint32_t r3; volatile uint32_t r12; volatile uint32_t lr; /* Link register. */ volatile uint32_t pc; /* Program counter. */ volatile uint32_t psr;/* Program status register. */ r0 = pulFaultStackAddress[0]; r1 = pulFaultStackAddress[1]; r2 = pulFaultStackAddress[2]; r3 = pulFaultStackAddress[3]; r12 = pulFaultStackAddress[4]; lr = pulFaultStackAddress[5]; pc = pulFaultStackAddress[6]; psr = pulFaultStackAddress[7]; /* When the following line is hit, the variables contain the register values. */ for (;;) ; } И такой обработчик HardFault: static void HardFault_Handler(void) { asm volatile ("tst lr, #4"); asm volatile ("ite eq"); asm volatile ("mrseq r0, msp"); asm volatile ("mrsne r0, psp"); asm volatile ("ldr r1, [r0, #24]"); asm volatile ("ldr r2, handler2_address_const"); asm volatile ("bx r2"); asm volatile ("handler2_address_const: .word prvGetRegistersFromStack"); } Честно говоря, на этот ассемблер смотрю как баран. С таким обработчиком исключения, в этом же проекте, Global_Array_Access_Bug, вместо HardFault_Handler() теперь срабатывает, на тех же 1999мс, Default_Handler из startup_stm32f107vctx.s. Примерно как на картинке. В общем, небольшое изменение в программе приводит к разным отказам. Или HardFault, или вылет в Default_Handler. При пошаговой отладке видно, что перед отказом содержимое массива испорчено примерно в районе текущей области записи. И характер отказа зависит лишь от случая, куда прыгнет исполнение программы после возврата по затёртому адресу возврата из стека.
image