|
Свой __write, IAR |
|
|
|
 |
Ответов
|
Apr 24 2007, 23:40
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(axle @ Apr 24 2007, 19:30)  Я разбирался с arm-elf-gcc и newlib - все работало. Там printf вообще создавала собственный буфер и писала данные в него, пока он не заполнялся или не появлялся символ перевода строки, и только тогда все разом перекидывала во __write. Жуть, если так обстоит дело - самочинная буферизация с malloc-ами! Думаю, что Вы ошиблись. Цитата(Dron_Gus @ Apr 24 2007, 23:21)  Накапливать и посылать - слишком большие накладные расходы на вызов функци, ИМХО. свой printf() на базе vsprintf() при статическом буфере даже при последующем побайтном (фифофированном) выводе в UART работает быстрее (немного  )штатного IAR-овского printf(). Цена - буфер под строчку.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 25 2007, 01:45
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Сергей Борщ @ Apr 25 2007, 01:11)  Поправьте, если я неправ - printf требует море ОЗУ в частности и из-за того, что резервирует на стеке место под буфер на все случаи жизни. Все известные мне реализации printf() и прочих ...f() есть обертки одного и того же. И в следствие этого не имеют радикальных отличий по использованию стека. В IAR это выглядит так: Код int (printf)(const char *fmt, ...) { /* print formatted to stdout */ int ans; va_list ap;
va_start(ap, fmt); ans = _Printf(&_Prout, (void *)1, fmt, &ap); va_end(ap); return (ans); }
int (vsnprintf)(char *s, size_t size, const char *fmt, va_list ap) { /* print formatted to string from arg list */ int ans; _SNProutInfo x;
x.count = 0; if (size == 0) { /* write nothing */ x.s = (char *)&x.size; /* place to junk terminating nul */ x.size = 0; } else { /* set up buffer */ x.s = s; x.size = --size; } ans = _Printf(&_SNProut, &x, fmt, &ap); *x.s = '\0';
return ans < 0 ? ans : x.count; } Собственно движок ....f() память под буфер кушает только на размер одного максимального равертутого формата знак+число+экспонента 40 с хвостиком байт, что не так трагично.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Сообщений в этой теме
Dron_Gus Свой __write Apr 24 2007, 16:26 scifi Если очень хочется, то можно создать свой буфер, н... Apr 24 2007, 19:42 Dron_Gus Компилятор IAR'овский. Он шлет по одному. Нак... Apr 24 2007, 23:21 Alex B._ >> Жуть, если так обстоит дело - самочинная ... Apr 24 2007, 23:42 vromanov FYI - В CrossWorks реализация printf вызывает и тр... Apr 25 2007, 13:14 Dron_Gus Написал свой printf на основе vsprintf по совету z... May 1 2007, 19:38 zltigo Цитата(Dron_Gus @ May 1 2007, 19:38) Возн... May 1 2007, 21:37 DASM Не припомните где именно по поводу буфера ? Третий... May 1 2007, 22:16 zltigo Цитата(DASM @ May 1 2007, 22:16) Не припо... May 1 2007, 22:26
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|