Задать вопрос
discipuli
@discipuli
Студент

STM32 ловит HardFault_Handler на операторе += как починить?

Имеется вот такой код

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.
  • Вопрос задан
  • 162 просмотра
Подписаться 1 Сложный Комментировать
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Вопрос номер раз: как такое вообще произошло?

Насколько я понимаю STM32F207xx не поддерживает инструкцию uxtah, потому что это инструкция Thumb2 не реализованная в CortexM3.

Вопрос номер два: как такое фиксить?

Подозреваю, что ключом -march=, вероятно -march=armv6.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы