|
|
  |
sprintf |
|
|
|
Apr 16 2010, 13:39
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Apr 16 2010, 15:38
|

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

|
Цитата(Сергей Борщ @ Apr 16 2010, 19:19)  Сижу, чешу репу - есть ли более легковесный вариант библиотеки или придется свой vsprintf подцеплять? У kgp и codesourcery чуть поменьше выходит - около 33к  Я так понимаю, что более-менее полный printf есть только в avr-gcc, далее везде либо неполный (как в msp-gcc), либо уже совсем взрослый, как в arm-овских вариантах. Видимо считается, что уже можно себе позволить. Кстати, _Pasha грозился newlib с нуля переписать
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Apr 16 2010, 19:54
|
Частый гость
 
Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003

|
Цитата(sergey sva @ Apr 15 2010, 21:52)  Где можно посмотреть исходник sprintf.. Я так понимаю, в Вашем случае исходник в newlib нужно искать, правда геморное это дело с теми исходниками разбираться (имхо конечно, наверняка есть и более геморные исходники). Если будете разбираться, пользуйтесь возможностью препроцессирования исходников (имеется ввиду GCC-шный ключ -E ).
|
|
|
|
|
Apr 17 2010, 15:02
|

Гуру
     
Группа: Модераторы
Сообщений: 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 закомментировал.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 17 2010, 15:39
|
Гуру
     
Группа: Свой
Сообщений: 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 не работает.
|
|
|
|
|
Apr 17 2010, 17:14
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Apr 17 2010, 17:46
|

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

|
Цитата(sergey sva @ Apr 17 2010, 21:54)  Хотел попробовать kgp но что то он у меня не идет Хм. Из-за одной небольшой проблемы сразу менять компилятор? Оригинально. Вы читали моё сообщение номер 13? Исправили?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Apr 18 2010, 15:09
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
>Хм. Из-за одной небольшой проблемы сразу менять компилятор? Оригинально. >Вы читали моё сообщение номер 13? Исправили? Да спасибо сам сразу и не заметил, исправил. Функциия malloc работает, только sprintf все же не работает с float. Тут в инете нашел инструкцию к avr -gcc там написано(Для ARM думаю тоже самое будет) там написано для того чтобы работал полный Printf нужно подключить библиотеку -u,vfprintf -lprintf_flt -lm если добавляю эту строчку , то пишет что -lprintf_flt не найден. Компилятор менять не собираюсь просто попробовать, может понравится.  >Я чего-то вообще не пойму в сыр-бор. Исходников sprintf в inet'e - пруд пруди. Что не найти подходящий? Выкинуть из библиотеки тот, что не нравится (или не работает), и добавить >туда свою функцию. Dietlib можно поглядеть для начала, она компактно написа Не знаю как добавить эту библиотеку, скачал detlibs-0.32 в этой папке много всяких файлов папок с исходниками есть makefile, ее нужно собрать ? а потом то что получится положить в папку ,,yagarto/lib? не разу так не делал, потом заменить файлы stdio.h на файлы из detlib-0.32 ?
Сообщение отредактировал sergey sva - Apr 18 2010, 14:44
|
|
|
|
|
Apr 18 2010, 16:04
|
Профессионал
    
Группа: Свой
Сообщений: 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 (скорость, размер и пр.) - добавите ее к вашей стандартной библиотеке. Все! Это что, фантастически трудная задача? Максимум - полчаса работы. Дебаты идут больше недели.
|
|
|
|
|
Jun 16 2010, 00:04
|

кекс
     
Группа: Свой
Сообщений: 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 ]; // память выделена мгновенно
// и освобождена автоматически }
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|