Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема sprintf() в IAR C
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Dimmy
Процессор - Мега16, проект на С, библиотека CLIB.
Необходимо получить из float строку. Дабы использовать ф-ю sprintf() в опциях проекта изменил следующее: Library options->printf formatter->Large (по умолчанию small). Компилю. Получаю ошибку размещения сегмента CSTACK.
Изменяю Memory Model->Small (было Tiny). Компилирую, все ОК... Во время отладки ошибка Stack Underflow.
rezident
Вопрос ваш не нов и мой ответ тоже не оригинален. Функции sprintf и printf для работы требуют довольно большого стека (до 1,5кБайт иногда). Чем более высокую опцию (Small->Medium->Large) вы выбираете, тем больше стека для sprintf требуется. Для вывода строки float требуется не менее 400 байт стека по-моему.
Dimmy
Дык вопросов не возникало-бы, если б доока была полноценная. В своих экспериментах я дошел до значения Data stack= 0x80. Недоборjava script:emoticon(':biggrin:', 'smid_7'). Ладно, буду пробовать. Скорей всего придется свою процедуру писать.
zltigo
Цитата(Dimmy @ Dec 4 2006, 22:11) *
Дык вопросов не возникало-бы, если б доока была полноценная.

Нормальная документация.
1. То, что родственные printf() функции жрут память в документации предупреждали;
2. Как map файл получить в документации описано;
3. Сам map файл можно в html формате получить - ну очень приятен для изучения.

Ну а дальше просто - смотрите сколько стека кушает sprintf() ну + к нему и естественно вызываемый realworker (что-то типа _PrintfLarge )
Dog Pawlowa
Цитата(Dimmy @ Dec 4 2006, 23:11) *
Скорей всего придется свою процедуру писать.

По моему опыту, практически всегда при выводе диапазон выводимого числа известен с точностью до одного-двух порядков, поэтому "своя процедура" достаточна проста, если преобразовать в целочисленный тип перед выводом.
А float нужно, чтобы не париться при вычислениях, если нужна точность, а памяти и быстродействия хватает.
RedFroggy
Цитата(Dog Pawlowa @ Dec 5 2006, 09:38) *
Цитата(Dimmy @ Dec 4 2006, 23:11) *

Скорей всего придется свою процедуру писать.

По моему опыту, практически всегда при выводе диапазон выводимого числа известен с точностью до одного-двух порядков, поэтому "своя процедура" достаточна проста, если преобразовать в целочисленный тип перед выводом.
А float нужно, чтобы не париться при вычислениях, если нужна точность, а памяти и быстродействия хватает.


Свою пишите. Зачем Вам универсальные навороты sprintf'a и как следствие, ненужные проблемы с памятью? Своя функция будет маленькая, узкозаточенная и предсказуемая (как реализуете smile.gif). Способ реализации описали выше, если непонятно - спрашивайте.
GDI
тоже нужно бвло выводить флоат и, покопавшись у себя на компе в залежах исходников нашел вот это( в присоединенном файле) - асмовая функция, которая преобразует флоат в массив символов 6 цифр + 1 точка + 1 знак, массив выводится потом принтом как строка.

принт - самый Small справится..
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.