Здравствуйте.
Суть проблемы...
Пытаюсь вызвать стандартный
printf из
stdio и после вызова вылетает в HardFault_Handler.
Запускал отладчик смотрел на каком месте падает...
На строчке
ldrh r2, [r1, #12]Код
862 [1] in ../../../../../../newlib/libc/stdio/vfprintf.c
0x8003934 <+0x0034> 51 46 mov r1, r10
0x8003936 <+0x0036> 8a 89 ldrh r2, [r1, #12]
Есть подозрения что что-то с линковкой (адреса путаются)... или флаги линковщику особенные нужно скармливать...
Да! Заранее конечно подготовил мин. набор функция для библиотеки _write, _read и другие. Линковка проходит нормально, не ругается это точно.
Хочу узнать ваши предположения. Может кто сталкивался с такой проблемой...
Кусок из makefile, то что касается линковщика:
Код
LD =arm-none-eabi-ld
LIB_B =/usr/lib/arm-none-eabi/newlib/armv6-m/
LIB_GCC =/usr/lib/gcc/arm-none-eabi/4.8.2/armv6-m/
LIB_OP =-L$(LIB_B) -lc -lg -L$(LIB_GCC) -lgcc
LINKOP =-T link.ld
AFOBJ= \
startup_stm32f0xx.o \
user_io.o \
main.o \
phisic.o
$(LD) $(AFOBJ) $(LINKOP) $(LIB_OP) -o $(PBIN)$(NAMEPROJ).elf
Вот скрипт линкера (самописный):
CODE
MEMORY
{
FLASH(RX) : ORIGIN = 0x08000000, LENGTH = 64K
RAM(rwx) : ORIGIN = 0x20000000, LENGTH = 8K
}
_Min_Heap_Size =1; /* required amount of heap */
SECTIONS
{
.isr_vector : ALIGN(4)
{
_start_isr_vector = .;
KEEP(*(.isr_vector))
_end_isr_vector = .;
. = 0xc8 - _end_isr_vector + ALIGN(2);
KEEP(*(.loop))
} > FLASH = 0xff
.text : ALIGN(4)
{
_start_text = .;
*(.text)
*(.text*)
KEEP(*(.data_flash))
_end_text = .;
} > FLASH
.rodata : ALIGN(4)
{
_start_rodata = .;
*(.rodata)
*(.rodata*)
_end_rodata = .;
} > RAM AT > FLASH
.data : ALIGN(4)
{
_start_data = .;
*(.data)
*(.data*)
_end_data = .;
} > RAM AT > FLASH
.bss : ALIGN(4)
{
_start_bss = .;
*(.bss)
*(.bss*)
_end_bss = .;
} > RAM
.heap :
{
. = ALIGN(4);
PROVIDE(end = .);
KEEP(*(.heap))
. = . + _Min_Heap_Size;
} > RAM
}
_size_rodata = SIZEOF(.rodata);
_size_data = SIZEOF(.data);
_size_bss = SIZEOF(.bss);
_start_rodata_copi = _end_text;
_start_data_copi = _end_text + _size_rodata;
_start_bss_copi = _end_text + _size_rodata + _size_data;
Сообщение отредактировал IgorKossak - Nov 27 2015, 08:42
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!