Имеется вот такой код
uint16_t testval16;
uint8_t testval8;
uint8_t Testfunc8(void)
{
testval8 = 2;
return testval8;
}
void Testfunc(void)
{
testval16 = 20;
testval16 << 3;
testval16 += Testfunc8();//выходит из функции и происходит вылет в HardFault_Handler
}
получается вылетает на опреаторе `+=`, я в лёгкой прострации.
Флаги линкера и компилятора.
ifdef DEBUG
$(info [info] debug mode)
CFLAGS = -g -Og
else
$(info [info] nodebug mode)
CFLAGS = -O2
endif
# CFLAGS += -ffunction-sections
CFLAGS += -Wall -Wextra -Warray-bounds -std=c99 -lgcc -lm
CFLAGS += -MMD -MP
CFLAGS += -mthumb -mlittle-endian -mthumb-interwork
LFLAGS = -Wl,--gc-sections -Wl,-T$(LD_SCRIPT) --specs=rdimon.specs
Код функций на ассмблере
Testfunc:
0x0800057a <+2>: ldr r4, [pc, #20] ; (0x8000590 <Testfunc+24>)
0x0800057c <+4>: movs r3, #20
0x0800057e <+6>: strh r3, [r4, #0]
=> 0x08000580 <+8>: bl 0x800056c <Testfunc8>
0x08000584 <+12>: ldrh r3, [r4, #0]
0x08000586 <+14>: uxtah r0, r3, r0 # после этой строчки происходит вылет
0x0800058a <+18>: strh r0, [r4, #0]
0x0800058c <+20>: pop {r4, pc}
0x0800058e <+22>: nop
0x08000590 <+24>: ldr r3, [pc, #496] ; (0x8000784 <LwIP_Init+104>)
0x08000592 <+26>: movs r0, #0
End of assembler dump.
Testfunc8:
=> 0x0800056c <+0>: movs r0, #2
0x0800056e <+2>: ldr r3, [pc, #4] ; (0x8000574 <Testfunc8+8>)
0x08000570 <+4>: strb r0, [r3, #0]
0x08000572 <+6>: bx lr
0x08000574 <+8>: ldr r3, [pc, #504] ; (0x8000770 <LwIP_Init+84>)
0x08000576 <+10>: movs r0, #0
Вопрос номер раз: как такое вообще произошло?
Вопрос номер два: как такое фиксить?
Версия GCC 8.3.1, мкк STM32F207xx(256 kb flash а не 1mb), прошивка c openocd.