реклама на сайте
подробности

 
 
> stm32 gcc lib printf улетает в HardFault_Handler, Не получается запустить printf улетает в HardFault_Handler
marka
сообщение Nov 26 2015, 20:16
Сообщение #1





Группа: Участник
Сообщений: 11
Регистрация: 26-11-15
Пользователь №: 89 481



Здравствуйте.

Суть проблемы...

Пытаюсь вызвать стандартный 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] - для короткого!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
slavokhire5
сообщение Nov 26 2015, 22:43
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 31-03-14
Из: Харьков
Пользователь №: 81 165



Вероятно проблемы с не выровнянным доступом. В f0 серии этого нельзя делать. Падает на инструкции загрузки полуслова. Если пытаетесь взять полуслово с не четного адреса, то это и есть ваша проблема)
Go to the top of the page
 
+Quote Post
marka
сообщение Nov 27 2015, 08:20
Сообщение #3





Группа: Участник
Сообщений: 11
Регистрация: 26-11-15
Пользователь №: 89 481



Большое спасибо что откликнулись)

Цитата(slavokhire5 @ Nov 27 2015, 01:43) *
Вероятно проблемы с не выровнянным доступом. В f0 серии этого нельзя делать. Падает на инструкции загрузки полуслова. Если пытаетесь взять полуслово с не четного адреса, то это и есть ваша проблема)


Цитата(Tarbal @ Nov 27 2015, 04:45) *
Какое содержимое регистров r1, r10 и r2?



Да, вы правы. младший бит установлен. Подскажите как это исправить ? Может в скрипте линкера я не правильно применяю ALIGN(4) ?

Код
        862 [1]    in ../../../../../../newlib/libc/stdio/vfprintf.c
0x800392c  <+0x0034>        51 46        mov    r1, r10         // r1 = 0x80000c9 r10 = 0x80000c9
0x800392e  <+0x0036>        8a 89        ldrh    r2, [r1, #12]


Спасибо.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 27 2015, 09:50
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Стек должен быть выровнен на 8 байт. Проверьте это.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
marka
сообщение Nov 27 2015, 10:08
Сообщение #5





Группа: Участник
Сообщений: 11
Регистрация: 26-11-15
Пользователь №: 89 481



Цитата(AHTOXA @ Nov 27 2015, 13:50) *
Стек должен быть выровнен на 8 байт. Проверьте это.


Я только инициализирую указатель стека (0x20001FFF). Как еще можно его выровнять ?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 27 2015, 11:13
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(marka @ Nov 27 2015, 13:08) *
Я только инициализирую указатель стека (0x20001FFF).
Как давно 0x20001FFF стало кратным 8? Вам надо инициализировать числом 0x20002000


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
marka
сообщение Nov 27 2015, 16:24
Сообщение #7





Группа: Участник
Сообщений: 11
Регистрация: 26-11-15
Пользователь №: 89 481



Цитата(Сергей Борщ @ Nov 27 2015, 14:13) *
Как давно 0x20001FFF стало кратным 8? Вам надо инициализировать числом 0x20002000


Сделал. Не помогло.

Проверил отдельно загрузку полуслова... все работает.
В чем еще может быть дело ?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 27 2015, 17:40
Сообщение #8


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Осей никаких не используете?
Ну и покажите, наконец, код.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
marka
сообщение Nov 27 2015, 18:11
Сообщение #9





Группа: Участник
Сообщений: 11
Регистрация: 26-11-15
Пользователь №: 89 481



Цитата(AHTOXA @ Nov 27 2015, 20:40) *
Осей никаких не используете?
Ну и покажите, наконец, код.


Оси нет. Вот исходники ....Прикрепленный файл  f051r8_test_printf.rar ( 950.65 килобайт ) Кол-во скачиваний: 32


Уже все перепробовал sad.gif

Сейчас поставил затычку -lnosys для отладки. Если уходит в HardFault_Handler то зажигает светодиод.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- marka   stm32 gcc lib printf улетает в HardFault_Handler   Nov 26 2015, 20:16
|- - marka   Цитата(marka @ Nov 27 2015, 21:11) Оси не...   Nov 28 2015, 14:15
|- - AHTOXA   Да непонятно. Куда у вас должен выводить текст pri...   Nov 28 2015, 17:00
|- - marka   Цитата(AHTOXA @ Nov 28 2015, 20:00) Да не...   Nov 28 2015, 17:45
|- - marka   Проблема решена А дело вот в чем было... В скрипт...   Nov 28 2015, 21:32
- - Tarbal   Какое содержимое регистров r1, r10 и r2?   Nov 27 2015, 01:45
- - Сергей Борщ   .rodata класть в ОЗУ не нужно.   Nov 28 2015, 22:00
- - marka   Цитата(Сергей Борщ @ Nov 29 2015, 01:00) ...   Nov 28 2015, 22:06


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 17:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01478 секунд с 7
ELECTRONIX ©2004-2016