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

 
 
> Вывод float в arm-none-eabi-gcc для stmf4
zemlemer
сообщение Oct 20 2016, 15:09
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 10-06-08
Пользователь №: 38 190



Добрый день.

Я меня возникли некоторые проблемы с выводом в терминал значений с плавающей точкой. Самый обычный sprintf прекрасно работает с целыми числами и отказывается работать с float. Например

CODE

float flttest = 123.45678;

sprintf(TestArray, "-= %lf =-", flttest);
Terminal("Test1: STR %s", TestArray);

uint16_t integer= 12345;
sprintf(TestArray, "*- %d -*", integer);
Terminal("Test2: STR %s", TestArray);


При этот вывод:
003 INFO: Test1: STR -= 403099659660755.687500 =-
004 INFO: Test2: STR *- 12345 -*

Основные ключи компилятора: arm-none-eabi-gcc -c -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mlittle-endian -mthumb-interwork -ffunction-sections -fdata-sections -Wl,--gc-sections
Основные ключи линкера: arm-none-eabi-gcc -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Xlinker -Map="project.map" -L/opt/gcc-arm-none-eabi-5_4/arm-none-eabi/lib/armv7e-m/fpu/ --specs=rdimon.specs -T/Core/STM32F4XX_FLASH.ld

Кто-либо сталкивался с подобным?

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
iiv
сообщение Oct 21 2016, 19:03
Сообщение #2


вопрошающий
*****

Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436



Цитата(zemlemer @ Oct 20 2016, 21:09) *
float flttest = 123.45678;

sprintf(TestArray, "-= %lf =-", flttest);

если у вас одинарная точность, sprintf хочет %f или %e или %g, а если двойная, то да, с "l" надо писать.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 21 2016, 19:18
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(iiv @ Oct 21 2016, 22:03) *
если у вас одинарная точность, sprintf хочет %f или %e или %g, а если двойная, то да, с "l" надо писать.

У sprintf не бывает одинарной точности, "l" игнорируется.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 22 2016, 21:21
Сообщение #4


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

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



Цитата(aaarrr @ Oct 21 2016, 22:18) *
У sprintf не бывает одинарной точности, "l" игнорируется.
Я каждый раз задаюсь вопросом: в чём был смысл такого решения при создании сишной библиотеки?


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


Гуру
******

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



Цитата(demiurg_spb @ Oct 23 2016, 00:21) *
Я каждый раз задаюсь вопросом: в чём был смысл такого решения при создании сишной библиотеки?

Между прочим, если функция имеет переменное число аргументов (как sprintf), аргументы типа float приводятся к типу double перед вызовом функции. Отцы-основатели не подумали о микроконтроллерах. Да их (МК) тогда и не было, наверное laughing.gif

Цитата(zemlemer @ Oct 24 2016, 13:53) *
Мне не нужны все возможности printf или sprintf (кто-нить использовал \b или \v или ..... ), но все лишнее намертво прилепится к выходному бинарнику.

Уже проверили выравнивание стека, кратное 8 байт? Просто интересно.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 24 2016, 11:26
Сообщение #6


Гуру
******

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



QUOTE (scifi @ Oct 24 2016, 14:15) *
если функция имеет переменное число аргументов (как sprintf), аргументы типа float приводятся к типу double перед вызовом функции.
А все, что меньше int - к int. При том зачем-то в последних стандартах в inttypes.h добавили префиксы спецификаторов форматной строки h и hh "для принудительного приведения к short и char"


QUOTE (demiurg_spb @ Oct 24 2016, 14:23) *
Это всем известно, но не понятно - зачем)))
Видимо неявное приведение позволяет написать вывод только одного типа (double) и в программах разумного размера суммарный размер всех кодов приведения типа будет меньше, чем размер дополнительной отдельной ветки кода для вывода float.


--------------------
На любой вопрос даю любой ответ
"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
demiurg_spb
сообщение Oct 24 2016, 11:29
Сообщение #7


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

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



я hu и hhu использую по мере необходимости. На AVR вроде как был профит от этого.

Цитата(Сергей Борщ @ Oct 24 2016, 14:26) *
Видимо неявное приведение позволяет написать вывод только одного типа (double) и в программах разумного размера суммарный размер всех кодов приведения типа будет меньше, чем размер дополнительной отдельной ветки кода для вывода float.
Ну а если наоборот - в прошивке ни одного double нет, лишь одни float))) (типично для кортекса и около того)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- zemlemer   Вывод float в arm-none-eabi-gcc для stmf4   Oct 20 2016, 15:09
- - scifi   В командную строку линкера нужно добавить "-u...   Oct 20 2016, 15:26
|- - zemlemer   Цитата(scifi @ Oct 20 2016, 18:26) В кома...   Oct 20 2016, 17:02
|- - scifi   Я невнимательно посмотрел. Если линкуется целочисл...   Oct 20 2016, 17:22
|- - zemlemer   Цитата(scifi @ Oct 20 2016, 20:22) Я невн...   Oct 21 2016, 19:00
|- - scifi   Цитата(zemlemer @ Oct 21 2016, 22:00) Вро...   Oct 21 2016, 19:26
- - Lagman   может поможет http://www.openstm32.org/tiki-view_f...   Oct 20 2016, 20:10
- - dxp   Ещё вариант: https://github.com/emb-lib/io библио...   Oct 21 2016, 05:29
||- - zemlemer   Цитата(demiurg_spb @ Oct 23 2016, 00:21) ...   Oct 24 2016, 10:53
|||- - demiurg_spb   Цитата(zemlemer @ Oct 24 2016, 13:53) Смы...   Oct 24 2016, 11:23
||- - Сергей Борщ   QUOTE (demiurg_spb @ Oct 24 2016, 14:29) ...   Oct 24 2016, 12:48
|- - zemlemer   Цитата(iiv @ Oct 21 2016, 22:03) если у в...   Oct 21 2016, 19:25
- - Genadi Zawidowski   Цитатаперед передачей я преобразовывал в double а ...   Oct 21 2016, 20:05
- - scifi   Цитата(Сергей Борщ @ Oct 24 2016, 14:26) ...   Oct 24 2016, 11:38


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

 


RSS Текстовая версия Сейчас: 9th August 2025 - 05:28
Рейтинг@Mail.ru


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