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

 
 
 
Reply to this topicStart new topic
> Проблема sprintf() в IAR C, Проблема sprintf() в IAR C
Dimmy
сообщение Dec 4 2006, 18:35
Сообщение #1


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

Группа: Участник
Сообщений: 106
Регистрация: 12-09-05
Пользователь №: 8 503



Процессор - Мега16, проект на С, библиотека CLIB.
Необходимо получить из float строку. Дабы использовать ф-ю sprintf() в опциях проекта изменил следующее: Library options->printf formatter->Large (по умолчанию small). Компилю. Получаю ошибку размещения сегмента CSTACK.
Изменяю Memory Model->Small (было Tiny). Компилирую, все ОК... Во время отладки ошибка Stack Underflow.
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 4 2006, 19:10
Сообщение #2


Гуру
******

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



Вопрос ваш не нов и мой ответ тоже не оригинален. Функции sprintf и printf для работы требуют довольно большого стека (до 1,5кБайт иногда). Чем более высокую опцию (Small->Medium->Large) вы выбираете, тем больше стека для sprintf требуется. Для вывода строки float требуется не менее 400 байт стека по-моему.
Go to the top of the page
 
+Quote Post
Dimmy
сообщение Dec 4 2006, 23:11
Сообщение #3


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

Группа: Участник
Сообщений: 106
Регистрация: 12-09-05
Пользователь №: 8 503



Дык вопросов не возникало-бы, если б доока была полноценная. В своих экспериментах я дошел до значения Data stack= 0x80. Недоборjava script:emoticon(':biggrin:', 'smid_7'). Ладно, буду пробовать. Скорей всего придется свою процедуру писать.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 5 2006, 00:51
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Dimmy @ Dec 4 2006, 22:11) *
Дык вопросов не возникало-бы, если б доока была полноценная.

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

Ну а дальше просто - смотрите сколько стека кушает sprintf() ну + к нему и естественно вызываемый realworker (что-то типа _PrintfLarge )


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Dec 5 2006, 09:38
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Dimmy @ Dec 4 2006, 23:11) *
Скорей всего придется свою процедуру писать.

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


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
RedFroggy
сообщение Dec 6 2006, 10:38
Сообщение #6


Участник
*

Группа: Свой
Сообщений: 36
Регистрация: 7-11-05
Пользователь №: 10 549



Цитата(Dog Pawlowa @ Dec 5 2006, 09:38) *
Цитата(Dimmy @ Dec 4 2006, 23:11) *

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

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


Свою пишите. Зачем Вам универсальные навороты sprintf'a и как следствие, ненужные проблемы с памятью? Своя функция будет маленькая, узкозаточенная и предсказуемая (как реализуете smile.gif). Способ реализации описали выше, если непонятно - спрашивайте.
Go to the top of the page
 
+Quote Post
GDI
сообщение Dec 7 2006, 16:39
Сообщение #7


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

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



тоже нужно бвло выводить флоат и, покопавшись у себя на компе в залежах исходников нашел вот это( в присоединенном файле) - асмовая функция, которая преобразует флоат в массив символов 6 цифр + 1 точка + 1 знак, массив выводится потом принтом как строка.

принт - самый Small справится..

Сообщение отредактировал GDI - Dec 7 2006, 16:40
Прикрепленные файлы
Прикрепленный файл  bcdfp.rar ( 1.85 килобайт ) Кол-во скачиваний: 64
 


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post

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

 


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


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