LINUX.ORG.RU

«легкий» printf() и «удобное выравнивание»

 , ,


0

1

добрый день

данный выкрутас

printf("arg: %02i:%02i:%02i, ",arg[0], arg[1], arg[2]);

прокатывает только при подключении «полного» фарша!

#
# Floating point printf version & Math-lib
#
-Wl,-u,vfprintf -lprintf_flt -lm

как выкручиваемсЯ? если не желательно использовать «толстый» вариант?

tag: avr avr-gcc print

★★★★★
Ответ на: комментарий от Puzan

да все ок :о)

пришлось добавить из своего набора

usart_init(); // add stream init 

+ размеры

------------------------------------
| size  | ver                      | 
------------------------------------
| 8543  - printf normal            |
|14814  - printf mini + punzik-lib |
------------------------------------

возможно, моя инициализация потоков сколько-то занимает, но, она присутсвует в обоих случаях

p.s. да, я сразу контроллеру мозги пудрю :о)

sunjob ★★★★★
() автор топика
Последнее исправление: sunjob (всего исправлений: 2)
Ответ на: да все ок :о) от sunjob

Что это за цифры? Вообще, мой типа-printf должен занимать байт 600, примерно. Сейчас попробую скомпилить для avr.

Попробовал, 2016 байт. Наверное из-за того, что AVG 8-битный. Можно заменить uint64_t на uint32_t и выкинуть лонги, должно быть поменьше.

Puzan ★★★★★
()
Последнее исправление: Puzan (всего исправлений: 1)
Ответ на: avr-gcc makefile от sunjob

Вообще, для AVR наверное нужно писать свою, оптимизированную под 8 бит, реализацию. Скорее всего, встроенный printf уже достаточно оптимизирован, чтобы быть лучше универсальных реализаций.

Для AVR я компилил руками: avr-gcc -Os -o uprintf.o uprintf.c

Puzan ★★★★★
()
Последнее исправление: Puzan (всего исправлений: 1)
Ответ на: комментарий от Puzan

получается, что да... встроенный рулит :о)

p.s. и без инициализации потока работать не будет (у меня, во вс.случае :о))) что и добавляет дополнительный вес

p.s.2

avr-gcc -Os -o uprintf.o uprintf.c
...
а главный модуль?

sunjob ★★★★★
() автор топика
Последнее исправление: sunjob (всего исправлений: 1)
Ответ на: комментарий от Puzan

нет, не надо

p.s. я смотрел полностью собранный hex :o)

sunjob ★★★★★
() автор топика
Ответ на: комментарий от Puzan

я не вижу инициализации :о)

sunjob ★★★★★
() автор топика

имхо вообще не вижу необходимости в printf на мк когда форматы фиксированные(те всегда). И обычно printf - самая жирная функций во всей прошивке.
Твой вариант написал бы как

// printf("arg: %02i:%02i:%02i, ",arg[0], arg[1], arg[2]);
puts("arg: "); printInt(arg[0], 2); putchar(':'); printInt(arg[1], 2); putchar(':'); printInt(arg[2], 2); puts(", ");

или даже так
puts("arg: "); for(int i = 0; i < 3; i++) printInt(arg[i], 2), (i != 2) && putchar(':'); puts(", ");


В расте или крестах можно было бы не писать подобное самому а делать кодогенерацию

bga_ ★★★★
()
Ответ на: комментарий от bga_

возможно ошибаюсь

я тоже сначало думал как-то так и выкрутиться :о) но потом понял, то чего-та не понял

линковка printf():

###!!!
# If this is left blank, then it will use the Standard printf version.
# если не определен - используется "стандартный вариант"
###!!!
#PRINTF_LIB = $(PRINTF_LIB_MIN)
 PRINTF_LIB =
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)

т.е. библиотека линкуется в любом случае,
в самом минимальном - не работает «нужное форматирование» и «забивание незначащими нулями»,
в «стандартном» и «максимальном» - работает,
и, получается, что написание любого велосипеда в «минимальном» варианте всегда тяжелее, чем использование принта в «среднем варианте»

спсибо

sunjob ★★★★★
() автор топика
Ответ на: возможно ошибаюсь от sunjob

попробуй использовать только itoa. Часто пишу для attiny13a и там мне никто насильно printf не подключает. Да и в stm8 тоже. Для дампа в avr вообще желательно использовать hex тк емнип инструкции деления у avr нету и соответственно gcc вставит тебе мега функцию эмуляции. А hex - сдвиг на 4

bga_ ★★★★
()
Последнее исправление: bga_ (всего исправлений: 1)
Ответ на: комментарий от bga_

но вывод то все равно через printf()? тогда

и, получается, что написание любого велосипеда в «минимальном» варианте всегда тяжелее, чем использование принта в «среднем варианте»

надо попробовать «низкоуровневый» подход, через отправку непосредственно в UART, без использования printf(), тогда код, связанный с printf(), не будет добавлен в тело бинарника

sunjob ★★★★★
() автор топика
Ответ на: комментарий от bga_

а теперь...

#include <!cpp/MemoryRegion.h>
#include <!cpp/newKeywords.h>
#include <!cpp/TestRunner.h>
#include <!cpp/common.h>
#include <!cpp/bitManipulations.h>

а теперь эту ... мы попробуем поднять в воздух ... :о)

sunjob ★★★★★
() автор топика
Ответ на: комментарий от bga_

ну я про это и ... вспомнил подходящий анектод из детства :о)

sunjob ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.