Перейти к содержанию
    

В кейле для кортексов юзаю vsprintf постоянно.
Вот и я в ИАРе пользовал с удовольствием. Тоже было ~8 кило и ни в чем себе не отказывал. Понятия не имею, зачем ему динамическое выделение памяти. Тут пишут что-то про thread-safe и прочие навороты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сижу, чешу репу - есть ли более легковесный вариант библиотеки или придется свой vsprintf подцеплять?

У kgp и codesourcery чуть поменьше выходит - около 33к:)

Я так понимаю, что более-менее полный printf есть только в avr-gcc, далее везде либо неполный (как в msp-gcc), либо уже совсем взрослый, как в arm-овских вариантах. Видимо считается, что уже можно себе позволить.

Кстати, _Pasha грозился newlib с нуля переписать :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Где можно посмотреть исходник sprintf..

Я так понимаю, в Вашем случае исходник в newlib нужно искать, правда геморное это дело с теми исходниками разбираться (имхо конечно, наверняка есть и более геморные исходники). Если будете разбираться, пользуйтесь возможностью препроцессирования исходников (имеется ввиду GCC-шный ключ -E ).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Где можно посмотреть исходник sprintf,
Вот тут есть несколько: http://menie.org/georges/embedded/index.html

 

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

printfs.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хотел попробовать 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 не работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Из командной строки работает, Не пойму почему из eclipse не работает.

При компиляции проекта эклипс наверняка вызывает

make all <filename>

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

PS Наверняка с терминами у меня как всегда беда, поправьте кому не лень пожалуйста.

Изменено пользователем smac

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хотел попробовать kgp но что то он у меня не идет

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

Вы читали моё сообщение номер 13? Исправили?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я чего-то вообще не пойму в сыр-бор. Исходников sprintf в inet'e - пруд пруди. Что не найти подходящий? Выкинуть из библиотеки тот, что не нравится (или не работает), и добавить туда свою функцию. Dietlib можно поглядеть для начала, она компактно написана.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

>Вы читали моё сообщение номер 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не знаю как добавить эту библиотеку, скачал 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 (скорость, размер и пр.) - добавите ее к вашей стандартной библиотеке.

 

Все! Это что, фантастически трудная задача? Максимум - полчаса работы. Дебаты идут больше недели.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, теперь работает float и строки и целые числа, и места много не занимает :) :)

Может кому пригодится uselib.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как указать вывод float с предшествующими пробелами до указанной минимальной ширины? Пробовал "%5f" либо "%а5" не получается. Float вообще в IAR не выводит, после обработки в массиве пусто, Int получается но как задать ширину понять не могу. Курил http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/ но безрезультатно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

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



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

 

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

 

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

    // и освобождена автоматически
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я все никак не могу взять в толк почему некоторые делают маленький стек, и большой heap

ИМХО потому, что у кучи есть менеджер, а стек он неконтролируемый. Наползание стека на данные это одна из самых трудновылавливаемых ошибок при программировании МК.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...