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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> STM32F2: printf (float)
k000858
сообщение Dec 8 2016, 04:53
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Во всех своих проектах пользуюсь выводом отладочных сообщений, в том числе выводом значений переменных. Float переменные обычно вывожу printf("%.2f\n", val); - таким методом пользуюсь и на L0, и на F4 контроллерах, и через UART и через SWO интерфейс.

Однако на STM32F205 контроллере не работает, как надо, например printf("%.2f\n", 1.0f); выводит 0.00, при этом в настройках линкера включено
Код
-specs=nano.specs  -u _printf_float


Что ни так с этим контроллером?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 8 2016, 07:01
Сообщение #2


Гуру
******

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



С выводом чисел с плавающей точкой была только одна проблема - адрес дна стека должен быть кратен 8. У вас оно пришет 0.00, то есть оно распознало модификатор %f и что-то вывело. Но вывело явно не то, вероятнее всего потому, что переменная оказалась не в том месте, где ее ожидал printf.


--------------------
На любой вопрос даю любой ответ
"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
k000858
сообщение Dec 8 2016, 07:17
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Цитата(Сергей Борщ @ Dec 8 2016, 10:01) *
С выводом чисел с плавающей точкой была только одна проблема - адрес дна стека должен быть кратен 8. У вас оно пришет 0.00, то есть оно распознало модификатор %f и что-то вывело. Но вывело явно не то, вероятнее всего потому, что переменная оказалась не в том месте, где ее ожидал printf.

никаких переменных

printf("%f\n", 1.0f); выводит 0.000000
а printf("%f\n", 1.1f); выводите -0.000000

Сообщение отредактировал k000858 - Dec 8 2016, 07:19
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Dec 8 2016, 07:35
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



А куда ж эти цифирки-то кладутся, если не в стек?!


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 8 2016, 07:40
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(esaulenka @ Dec 8 2016, 10:35) *
А куда ж эти цифирки-то кладутся, если не в стек?!

Как куда? В регистры.
Стек используется в функциях плавучки. Если нет выравнивания стека по 8 байтам, то происходят чудеса.
Go to the top of the page
 
+Quote Post
k000858
сообщение Dec 8 2016, 07:53
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



спасибо. проблема решена.

причина озвучена выше: адрес стека не был выровнен

вопрос в тему: выравнивание адреса указателя стека к 8 должно быть обязательно на всех типах ядер (конкретно STM32L0, STM32F4) ?
во любых типах проектов или только в тех, что используют newlib для print/sprint ?
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 8 2016, 07:57
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(k000858 @ Dec 8 2016, 10:53) *
вопрос в тему: выравнивание адреса указателя стека к 8 должно быть обязательно на всех типах ядер (конкретно STM32L0, STM32F4) ?
во любых типах проектов или только в тех, что используют newlib для print/sprint ?

Это требование ARM EABI. На практике косяки вылазили только с плавучкой, но для порядка надо везде.
Go to the top of the page
 
+Quote Post
k000858
сообщение Dec 8 2016, 07:58
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Цитата(scifi @ Dec 8 2016, 10:57) *
Это требование ARM EABI. На практике косяки вылазили только с плавучкой, но для порядка надо везде.

спасибо за разъяснения
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 8 2016, 08:02
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Кажется, я буковки напутал laughing.gif
Это называется AAPCS. Тут.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 8 2016, 10:11
Сообщение #10


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(scifi @ Dec 8 2016, 11:02) *

Это называется долбаные даблы. И от них никуда не деться, если принтфить флоаты.
Каждый раз как об этом подумаю - злюсь...

Такие же траблы были бы если выводился тип long long.
Так что дело не в плавучке, а в размере используемых типов данных.
Если всегда не более 4 байт - то и с выравниванием на 4 всё должно работать нормально.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 8 2016, 10:34
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(demiurg_spb @ Dec 8 2016, 13:11) *
Это называется долбаные даблы. И от них никуда не деться, если принтфить флоаты.
Каждый раз как об этом подумаю - злюсь...

Теоретически можно сделать ключик компилятора "treat double as float" и собирать стандартную библиотеку с этой опцией. Но пока никто не озаботился laughing.gif
Go to the top of the page
 
+Quote Post
Pridnya
сообщение Dec 9 2016, 06:53
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159



Цитата(k000858 @ Dec 8 2016, 10:53) *
спасибо. проблема решена.

причина озвучена выше: адрес стека не был выровнен

вопрос в тему: выравнивание адреса указателя стека к 8 должно быть обязательно на всех типах ядер (конкретно STM32L0, STM32F4) ?
во любых типах проектов или только в тех, что используют newlib для print/sprint ?

Разрешите поинтересоваться, а как у вас получилось, что адрес стека оказался не выровнен? И в какой IDE вы работаете? У меня такого ни разу не было, ни в одном проекте.

Сообщение отредактировал Pridnya - Dec 9 2016, 06:53
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 9 2016, 09:23
Сообщение #13


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Pridnya @ Dec 9 2016, 09:53) *

В знаете, что можно и без IDE вовсе работать. Всё с командной строки и правки править руками и исходники и файл линкера и правила сборки и стартап файл.
Основная масса открытого софта именно так и реализована.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Pridnya
сообщение Dec 9 2016, 09:29
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159



Цитата(demiurg_spb @ Dec 9 2016, 12:23) *
В знаете, что можно и без IDE вовсе работать. Всё с командной строки и правки править руками и исходники и файл линкера и правила сборки и стартап файл.
Основная масса открытого софта именно так и реализована.

Я знаю, что можно в простейшем текстовом редакторе работать...с exe-шниками для командной строки, и браузер самому можно написать, но я об этом не спрашивал. Если вы хотели сказать, что из-за такого "открытого" софта (частично открытого для лица его использующего) и появилась ошибка "невыровненный адрес стека", то я с вами соглашусь.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 9 2016, 09:37
Сообщение #15


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Pridnya @ Dec 9 2016, 12:29) *
Дальнейшее обсуждение считаю бессмысленным.
Чего не знаю, того не существует - этот лозунг не для меня.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Pridnya
сообщение Dec 9 2016, 09:43
Сообщение #16


Частый гость
**

Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159



Цитата(demiurg_spb @ Dec 9 2016, 12:37) *
Дальнейшее обсуждение считаю бессмысленным.
Чего не знаю, того не существует - этот лозунг не для меня.

Хорошо! Как мне (и другим желающим) смоделировать такую же ошибку при работе с ARMCC! Подскажите.

Сообщение отредактировал Pridnya - Dec 9 2016, 09:44
Go to the top of the page
 
+Quote Post
k000858
сообщение Dec 9 2016, 09:52
Сообщение #17


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Цитата(Pridnya @ Dec 9 2016, 09:53) *
Разрешите поинтересоваться, а как у вас получилось, что адрес стека оказался не выровнен? И в какой IDE вы работаете? У меня такого ни разу не было, ни в одном проекте.

Eclipse + GCC, адрес стека был 0x2001FFFF, стал 0x20020000
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 9 2016, 10:51
Сообщение #18


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Pridnya @ Dec 9 2016, 12:43) *
Хорошо! Как мне (и другим желающим) смоделировать такую же ошибку при работе с ARMCC! Подскажите.
Читайте доки на свой компилятор и линкер.
http://infocenter.arm.com/help/index.jsp?t...474e/index.html

В gcc - это элементарно.
Для вас тоже это не должно составить труда - поправьте scatter files.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Pridnya
сообщение Dec 9 2016, 11:22
Сообщение #19


Частый гость
**

Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159



Цитата(demiurg_spb @ Dec 9 2016, 13:51) *
Читайте доки на свой компилятор и линкер.
http://infocenter.arm.com/help/index.jsp?t...474e/index.html

В gcc - это элементарно.
Для вас тоже это не должно составить труда - поправьте scatter files.

Пока ждал вашего ответа. Уже успел по вашей ссылке сходить, понравились регистраторы. Cortex A8 MCU, на Linux что ли (судя по объему ОЗУ на Linux)? Только что-то описания не нашел и в таблице про синхронизацию времени ни слова. rolleyes.gif
Вот мой scatter-файл (создается IDE при создании проекта) для проекта с симулятором, я в этом проекте всякие мелочи:
Цитата
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00100000 { ; load region size_region
ER_IROM1 0x08000000 0x00100000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00020000 { ; RW data
.ANY (+RW +ZI)
}
}

Что в нем поправить?

Сообщение отредактировал Pridnya - Dec 9 2016, 11:28
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 9 2016, 11:24
Сообщение #20


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Ложку дай...
Читайте доку! Я не страна советов.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Pridnya
сообщение Dec 9 2016, 11:31
Сообщение #21


Частый гость
**

Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159



Цитата(demiurg_spb @ Dec 9 2016, 14:24) *
Ложку дай...
Читайте доку! Я не страна советов.

Сначала вы мне напомнили, что можно разрабатывать программы без IDE, затем посоветовали читать доку на предыдущую версию моего компилятора, а затем посоветовали поправить scatter-файл, ну я и подумал, что вы знаете, что там поправить в 14-ти строках включая комментарии. rolleyes.gif
Я вам scatter-файл, а вы "я не страна советов".

Сообщение отредактировал Pridnya - Dec 9 2016, 11:32
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 9 2016, 11:37
Сообщение #22


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Я бы подcказал, но пользуюсь gcc...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 9 2016, 11:41
Сообщение #23


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Pridnya @ Dec 9 2016, 14:31) *
Я вам scatter-файл, а вы "я не страна советов".

startup.s посмотрите, там есть чего наворотить при желании.
Go to the top of the page
 
+Quote Post
Pridnya
сообщение Dec 9 2016, 11:50
Сообщение #24


Частый гость
**

Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159



Цитата(ViKo @ Dec 9 2016, 14:41) *
startup.s посмотрите, там есть чего наворотить при желании.

Да, в этом файле если накосячить, то в HardFaultHandler улетает. rolleyes.gif
Код
;  
<o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Stack_Size      EQU     0x000003FF; 0x00000400 да хоть вот так

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp

Понятно, откуда у товарища ошибка появилась.
Вообще и startup и scatter файл создаются IDE при создании проекта и ошибок с выравниванием нет.

Сообщение отредактировал Pridnya - Dec 9 2016, 11:51
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 9 2016, 12:46
Сообщение #25


Гуру
******

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



QUOTE (Pridnya @ Dec 9 2016, 14:50) *
Вообще и startup и scatter файл создаются IDE при создании проекта и ошибок с выравниванием нет.
Пока вам не понадобится сделать что-то, под что создатели вашей IDE не предусмотрели соответствующей галочки.


--------------------
На любой вопрос даю любой ответ
"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
Mister_DSP
сообщение Dec 9 2016, 13:50
Сообщение #26


Частый гость
**

Группа: Участник
Сообщений: 133
Регистрация: 5-11-16
Пользователь №: 94 050



Вот начало моего стартапа с измененными базами/размерами стека и кучи:
Код
;------------------------------------ 4kB STACK
Stack_Mem         EQU     0x1000F000
Stack_Size        EQU     0x00001000
__initial_sp      EQU     Stack_Mem+Stack_Size
;------------------------------------

;------------------------------------ 60kB HEAP
Heap_Mem      EQU     0x10000000
Heap_Size     EQU     0x0000F000
__heap_base   EQU     Heap_Mem
__heap_limit  EQU     Heap_Mem+Heap_Size
;------------------------------------

                PRESERVE8
                THUMB.......................


Думаю что вершину стека указать здесь не проблема.


--------------------
SPY vs. SPY
Хорошо там, где нет ничего...
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Dec 9 2016, 16:03
Сообщение #27


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(scifi @ Dec 8 2016, 10:40) *
Как куда? В регистры.

Да, действительно.
Почему-то был уверен, что у printf работает только через стек (из-за переменного числа аргументов). Ан нет, всё отлично в регистры лезет, если аргументов немного. Век живи...


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 14:53
Рейтинг@Mail.ru


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