Столкнулся с определенными проблемами, используя маленький и слабенький процессор.
Немного поковырялся, обобщил результаты и решил вставить свои 5 копеек

При сборке проекта (процессор STM32F100C4), содержащего вызов стандартной библиотечной функции sprintf() линковка не удается по двум причинам:
- Отсутствуют некоторые системные функции (ошибка ”undefined reference to `_sbrk'” или ей подобные).
- Код не помещается во FLASH.
Первая проблема обусловлена тем, что в тулчейнах для встраиваемых систем отсутствуют требуемые системные функции (
https://sourceware.org/newlib/libc.html#Syscalls ), которые необходимы для работы библиотеки newlib (эти функции обеспечиваются полноценной ОС). Их необходимо реализовать самостоятельно или взять готовый вариант (
http://electronix.ru/forum/index.php?showt...mp;#entry651990 ).
Вторая проблема обусловлена нехваткой FLASH памяти выбранного микроконтроллера, ”объемной” реализацией функции sprinft() и всего, что с ней связано. Поэтому оптимальное решение в сложившейся ситуации - поиск менее ”объемного” варианта этой функции.
Протестировал несколько вариантов функций sprintf() от различного производителя

Тестирование проводилось с помощью простого приложения, написанного на языке C с использованием библиотеки SPL. Приложение осуществляет циклический вывод форматированной строки через USART микроконтроллера. Результаты тестирования приведены ниже (перечислены не все секции выходного файла). В итоге было установлено, что наиболее ”легкий” вариант реализации функции sprintf() от ChaN.
Функции sprintf() в стандартных библиотеках тулчейнов бывают в нескольких вариантах (или просто разные функции или разные библиотеки, часто с ограниченным функционалом). Часто функции, реализованные в стандартной библиотеке, требуют приличного количества ОЗУ, поэтому при их использовании необходимо обеспечить достаточный объем для стека (кучи).
ПО с использованием стандартной библиотечной функции sprintf().
Чтобы проект собрался пришлось увеличить в скрипте линкера размер региона FLASH до 32 кБ.
.text 27048
.ARM.exidx 8
.data 1436
.bss 80
ПО с использованием стандартной библиотечной функции sniprintf().
Это облегченный вариант sprintf(), работающий только с целыми числами.
.text 12092
.ARM.exidx 8
.text.align 4
.data 1436
.bss 80
ПО без использования форматированного вывода (без каких-либо функций sprintf()).
.text 1604
.text.align 4
.data 20
.bss 16
Реализация от ChaN (целые числа).
http://elm-chan.org/fsw/strf/xprintf.html.text 2368
.data 20
.bss 28
Реализация от Georges Menie (целые числа).
http://www.menie.org/georges/embedded/index.html.text 7656
.data 1308
.bss 80
Доработанный вариант от Сергея Борща (оригинал неизвестен)
http://electronix.ru/forum/index.php?showt...mp;#entry746084.text 7952
.data 24
.bss 16
Вариант от sergey_sva
http://electronix.ru/forum/index.php?s=&am...st&p=746563.text 13600
.ARM.exidx 8
.data 268
.bss 16
makefile и скрипт линкера использовался из комплекта scmRTOS. Тулчейн - Sourcery CodeBench Lite ARM EABI.
А, с Новым Годом всех!
Сообщение отредактировал koluna - Jan 2 2014, 07:55