Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Можно ли настроить printf без включения double?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Михась
Можно ли настроить printf без включения double?

Есть кейл микровижн, cortex-m0. Все равно есть плавучка в математике, на индикатор надо выводить плавучку. Сейчас все нормально работает и с притянутыми printfa.o double. Но можно ли в принципе настроить встроенный printf на использование только float?
Сергей Борщ
Обычно, если такая возможность есть - она описана в документации на ваш компилятор. Чтение документации из интернета вслух - не менее 100 евро в час.

P.S. Но вообще-то, по стандарту, при передаче в функцию с переменным числом аргументов float неявно приводится к double. Так что если ваш компилятор соответствует стандарту, то заставить его printf внутри работать с float вместо double не получится.
Михась
Цитата(Сергей Борщ @ Nov 7 2015, 03:47) *
Обычно, если такая возможность есть - она описана в документации на ваш компилятор. Чтение документации из интернета вслух - не менее 100 евро в час.

P.S. Но вообще-то, по стандарту, при передаче в функцию с переменным числом аргументов float неявно приводится к double. Так что если ваш компилятор соответствует стандарту, то заставить его printf внутри работать с float вместо double не получится.


Спасибо, Сергей. Я видел ваш пост по этой теме ранее и посмотрел хидеры printf. Понял что есть выбор только между целочисленным printf и double. Была надежда, что где-то затаился printf с float.
Михась
Цитата(Михась @ Nov 7 2015, 11:28) *
Спасибо, Сергей. Я видел ваш пост по этой теме ранее и посмотрел хидеры printf. Понял что есть выбор только между целочисленным printf и double. Была надежда, что где-то затаился printf с float.


Для информации будущим исследователям
МК -STM32f030, индикатор - LCD TIC-55, softspi. Частота тактовая - 8МГц

Строка форматируется из
sprintf(s_temp, "%4.1f%5d", (float)A, cool.gif;
Время на функцию включая вывод softspi - 2.2ms

sprintf(s_temp, "%2d %5d", A, B );
Время на функцию включая вывод softspi - 0.9ms

Время чистого вывода на индикатор по softspi -0.4ms

Библиотеки (float используется и в других функциях, double - только printf)
Оптимизация отключена. Стека в 256 байт не хватило (без printf с double хватало 256), пришлось увеличить до 512.

CODE
----------------------------------------------------------------------

Code (inc. data) RO Data RW Data ZI Data Debug Library Member Name

34 0 0 0 0 60 fpclassifyf.o
62 0 0 0 0 340 funder.o
1520 90 320 0 0 176 powf.o
0 0 0 0 0 0 entry.o
0 0 0 0 0 0 entry10a.o
0 0 0 0 0 0 entry11a.o
8 4 0 0 0 0 entry2.o
4 0 0 0 0 0 entry5.o
0 0 0 0 0 0 entry7b.o
0 0 0 0 0 0 entry8b.o
8 4 0 0 0 0 entry9a.o
12 6 0 4 0 60 errno.o
30 0 0 0 0 0 handlers.o
40 0 0 0 0 72 idiv.o
36 8 0 0 0 68 init.o
0 0 0 0 0 0 iusefp.o
32 0 0 0 0 68 llshl.o
38 0 0 0 0 68 llsshr.o
34 0 0 0 0 68 llushr.o
2242 94 0 0 0 472 printfa.o
36 12 0 4 0 120 rand.o
44 0 0 0 0 72 uidiv.o
96 0 0 0 0 84 uldiv.o
40 2 0 0 0 68 cdrcmple.o
356 4 0 0 0 140 dadd.o
240 6 0 0 0 84 ddiv.o
236 0 0 0 0 216 depilogue.o
64 10 0 0 0 68 dfixul.o
208 6 0 0 0 88 dmul.o
40 0 0 0 0 60 f2d.o
178 0 0 0 0 108 fadd.o
124 0 0 0 0 72 fdiv.o
130 0 0 0 0 144 fepilogue.o
50 0 0 0 0 60 ffixi.o
76 0 0 0 0 68 ffixir.o
40 0 0 0 0 60 ffixui.o
22 0 0 0 0 68 fflti.o
14 0 0 0 0 68 ffltui.o
122 0 0 0 0 72 fmul.o
24 0 0 0 0 60 fscalb.o

----------------------------------------------------------------------
6242 246 320 8 0 3232 Library Totals
2 0 0 0 0 0 (incl. Padding)
AlexandrY
Цитата(Михась @ Nov 7 2015, 08:56) *
Для информации будущим исследователям
МК -STM32f030, индикатор - LCD TIC-55, softspi. Частота тактовая - 8МГц


Если вам очень надо, то скачайте в Keil-е Kinetis SDK , там в директории RTOS/MQX/MQX_STDLIB будут исходники всех стандартных библиотек C
Там найдете и _io_doprint, которое ядро всех print-ов.
Небольшие исправление и оно будет вам печатать только float.
M_Andrey
А если так:

int i = (int)(A*10.0);

sprintf(s_temp, "%4d.%.1d %5d", i/10, i%10, B );
Михась
Цитата(M_Andrey @ Nov 7 2015, 15:21) *
А если так:

int i = (int)(A*10.0);

sprintf(s_temp, "%4d.%.1d %5d", i/10, i%10, B );


Я, как умная маша, с этого и начал. Но уже есть с десяток "экранов" на каждый выводится 1-2 параметра со знаками, и эти параметры еще масштабировать, т.к. положение точки надо двигать в зависимости от места на экране под число. Я осатанел с проверками за три дня и перешел на флоат. Пара килобайт не стоят инсульта. sm.gif

Это не говоря о том, что попробуйте вывести в свой пример отрицательное число. Минус будет показывать в каждой позиции под число.
ar__systems
Выкинуть стандартный принтф и заменить его собственным, а там уже отключайте и включайте все что угодно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.