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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> sprintf
Сергей Борщ
сообщение Apr 16 2010, 13:39
Сообщение #16


Гуру
******

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



Цитата(sonycman @ Apr 16 2010, 15:31) *
В кейле для кортексов юзаю vsprintf постоянно.
Вот и я в ИАРе пользовал с удовольствием. Тоже было ~8 кило и ни в чем себе не отказывал. Понятия не имею, зачем ему динамическое выделение памяти. Тут пишут что-то про thread-safe и прочие навороты.


--------------------
На любой вопрос даю любой ответ
"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
AHTOXA
сообщение Apr 16 2010, 15:38
Сообщение #17


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Сергей Борщ @ Apr 16 2010, 19:19) *
Сижу, чешу репу - есть ли более легковесный вариант библиотеки или придется свой vsprintf подцеплять?

У kgp и codesourcery чуть поменьше выходит - около 33кsmile.gif
Я так понимаю, что более-менее полный printf есть только в avr-gcc, далее везде либо неполный (как в msp-gcc), либо уже совсем взрослый, как в arm-овских вариантах. Видимо считается, что уже можно себе позволить.
Кстати, _Pasha грозился newlib с нуля переписать smile.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
smac
сообщение Apr 16 2010, 19:54
Сообщение #18


Частый гость
**

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



Цитата(sergey sva @ Apr 15 2010, 21:52) *
Где можно посмотреть исходник sprintf..

Я так понимаю, в Вашем случае исходник в newlib нужно искать, правда геморное это дело с теми исходниками разбираться (имхо конечно, наверняка есть и более геморные исходники). Если будете разбираться, пользуйтесь возможностью препроцессирования исходников (имеется ввиду GCC-шный ключ -E ).
Go to the top of the page
 
+Quote Post
ReAl
сообщение Apr 17 2010, 11:14
Сообщение #19


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



У avr-gcc, насколько я помню, поначалу тоже с malloc был. На стеке выделялся только буфер для преобразований целых чисел, а для плавающих форматов буфер длиннее и его по malloc выделяли.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 17 2010, 15:02
Сообщение #20


Гуру
******

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



Цитата(sergey sva @ Apr 15 2010, 19:52) *
Где можно посмотреть исходник sprintf,
Вот тут есть несколько: http://menie.org/georges/embedded/index.html

В приложении тот, что я сейчас использую. На плавающей точке не проверял, но она там есть. Где взял - не помню. Помню, что допиливал - они умудрились в процессе вывода портить форматную строку. Сейчас использую его на ARM, поскольку int у него совпадает с long int, то поддержку ключа l закомментировал.
Прикрепленные файлы
Прикрепленный файл  printfs.zip ( 4.21 килобайт ) Кол-во скачиваний: 107
 


--------------------
На любой вопрос даю любой ответ
"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
sergey sva
сообщение Apr 17 2010, 15:39
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Хотел попробовать kgp но что то он у меня не идет пишет
Цитата
make all
make: *** No rule to make target `all'. Stop.

Похоже на то что какой то путь не указал в path, проделал так скачал kgp_arm_eabi_20100226 распаковал на C:\
после добавил две переменные в path C:\kgp_arm_eabi_20100226\arm-kgp-eabi\bin\;C:\kgp_arm_eabi_20100226\bin\
после в eclipse ->project->properties->settings->GNUarfParser указал C:\kgp_arm_eabi_20100226\bin\arm-kgp-eabi-addr2line
И C:\kgp_arm_eabi_20100226\bin\arm-kgp-eabi-c++filt
deskovery options Default. Может что то пропустил?

Из командной строки работает, Не пойму почему из eclipse не работает.
Go to the top of the page
 
+Quote Post
smac
сообщение Apr 17 2010, 17:14
Сообщение #22


Частый гость
**

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



Цитата(sergey sva @ Apr 17 2010, 19:54) *
Из командной строки работает, Не пойму почему из eclipse не работает.

При компиляции проекта эклипс наверняка вызывает
Код
make all <filename>
, а цели all в <filename> (по-умолчанию Makefile) нету. Разберитесь с проектом эклипса - мейкфайл у Вас подключен извне или эклипсом генерируется?
PS Наверняка с терминами у меня как всегда беда, поправьте кому не лень пожалуйста.

Сообщение отредактировал smac - Apr 17 2010, 17:15
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 17 2010, 17:46
Сообщение #23


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sergey sva @ Apr 17 2010, 21:54) *
Хотел попробовать kgp но что то он у меня не идет

Хм. Из-за одной небольшой проблемы сразу менять компилятор? Оригинально.
Вы читали моё сообщение номер 13? Исправили?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Apr 17 2010, 22:39
Сообщение #24


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Я чего-то вообще не пойму в сыр-бор. Исходников sprintf в inet'e - пруд пруди. Что не найти подходящий? Выкинуть из библиотеки тот, что не нравится (или не работает), и добавить туда свою функцию. Dietlib можно поглядеть для начала, она компактно написана.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Apr 18 2010, 15:09
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



>Хм. Из-за одной небольшой проблемы сразу менять компилятор? Оригинально.
>Вы читали моё сообщение номер 13? Исправили?
Да спасибо сам сразу и не заметил, исправил. Функциия malloc работает, только sprintf все же не работает с float. Тут в инете нашел инструкцию к avr -gcc там написано(Для ARM думаю тоже самое будет) там написано для того чтобы работал полный Printf нужно подключить библиотеку -u,vfprintf -lprintf_flt -lm если добавляю эту строчку , то пишет что -lprintf_flt
не найден. Компилятор менять не собираюсь просто попробовать, может понравится. smile.gif

>Я чего-то вообще не пойму в сыр-бор. Исходников sprintf в inet'e - пруд пруди. Что не найти подходящий? Выкинуть из библиотеки тот, что не нравится (или не работает), и добавить >туда свою функцию. Dietlib можно поглядеть для начала, она компактно написа
Не знаю как добавить эту библиотеку, скачал detlibs-0.32 в этой папке много всяких файлов папок с исходниками есть makefile, ее нужно собрать ?
а потом то что получится положить в папку ,,yagarto/lib? не разу так не делал, потом заменить файлы stdio.h на файлы из detlib-0.32 ?

Сообщение отредактировал sergey sva - Apr 18 2010, 14:44
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Apr 18 2010, 16:04
Сообщение #26


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(sergey sva @ Apr 18 2010, 18:24) *
Не знаю как добавить эту библиотеку, скачал detlibs-0.32 в этой папке много всяких файлов папок с исходниками есть makefile, ее нужно собрать ?
а потом то что получится положить в папку ,,yagarto/lib? не разу так не делал, потом заменить файлы stdio.h на файлы из detlib-0.32 ?


Елы-палы. На кой вам всю библиотеку подключать! Вроде по русски написал. Поясняю по пунктам:

1. Сохранить оригинал вашей стандартной библиотеки, чтобы можно все вернуть на место.

2. Функцию sprintf выкинуть(удалить, стереть) из копии вашей библиотеки средствами вашего библиотекаря/линкера, чтобы не возникало конфликта имен функций.

3. Из DietLib (к примеру, я не утвердаю, что это лучший вариант, но и не худший) взять исходный текст sprintf (он ведь на стандартном С написан, не японскими иероглифами). Почитать его за чашкой кофе, не пролив кофе на клавиатуру.

4. Посмотреть (изучить) - он вам годится или нет. Может она (функция sprintf) использует еще какие-то функции из DietLib. Их найти и добавить в тот же модуль, где и sprintf.

5. Скомпилировать этот вариант sprintf с вашим проектом.

6. Поглядеть на экран (не забыв одеть очки, если они вам необходимы) и если терминал используется для отладки и посмотреть что и в каком виде выводится.

7. Понравится функциональность этого варианта sprintf (скорость, размер и пр.) - добавите ее к вашей стандартной библиотеке.

Все! Это что, фантастически трудная задача? Максимум - полчаса работы. Дебаты идут больше недели.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Apr 18 2010, 20:27
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Спасибо, теперь работает float и строки и целые числа, и места много не занимает smile.gif smile.gif
Может кому пригодится Прикрепленный файл  uselib.zip ( 5.58 килобайт ) Кол-во скачиваний: 285
Go to the top of the page
 
+Quote Post
_Макс
сообщение Jun 15 2010, 22:41
Сообщение #28


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



Как указать вывод float с предшествующими пробелами до указанной минимальной ширины? Пробовал "%5f" либо "%а5" не получается. Float вообще в IAR не выводит, после обработки в массиве пусто, Int получается но как задать ширину понять не могу. Курил http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/ но безрезультатно.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 16 2010, 00:04
Сообщение #29


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(ReAl @ Apr 17 2010, 14:14) *
На стеке выделялся только буфер для преобразований целых чисел, а для плавающих форматов буфер длиннее и его по malloc выделяли.

Вначале писали извращенцы, асболютно не представляющие что такое МК. Потом за дело взялись нормальные люди и сделали правильно.
Я все никак не могу взять в толк почему некоторые делают маленький стек, и большой heap, а потом в коде начинают появляться воистину дебильные и тормозные конструции типа:

Код
foo()
{
    U8 *buf = (U8 *)malloc(256);
    /*
        malloc при поиске подходящего блока проходит километровую цепочку heap descriptor'ов.
        процесс прохода дескрипторов необходимо защитить локом либо другим sync примитивом,
        для обеспечения атомарности доступа,
        а значит прерывания могут быть запрещены на ОЧЕНЬ ДОЛГО.
    */
    ...



    free( buf );
    /*
        проходит через процесс объединения текущего блока со свободными,
        хоть этот процесс и быстрее чем выделение,
        но всяко медленнее чем одна команда "SUB SP, 256"
      
        в этом процессе требуется обеспечить атомарность при обращении к heap дескрипторам,
        а значит прерывания и здесь могут быть запрещены на относительно длительное время
    */
}


что мешает млин heap уменьшить на 256 байт, а стек на те же 256 байт увеличить? Чтобы было просто

Код
foo()
{
    buf[ 256 ];  // память выделена мгновенно

    // и освобождена автоматически
}
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 16 2010, 00:54
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(defunct @ Jun 16 2010, 06:04) *
Я все никак не могу взять в толк почему некоторые делают маленький стек, и большой heap

ИМХО потому, что у кучи есть менеджер, а стек он неконтролируемый. Наползание стека на данные это одна из самых трудновылавливаемых ошибок при программировании МК.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 23:29
Рейтинг@Mail.ru


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