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

 
 
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

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

 


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


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