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

 
 
> Programmers Notepad 2, Проблема с размером hex-файла
RED_BULLok
сообщение May 6 2008, 12:21
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 27-03-08
Из: Беларусь, Минск
Пользователь №: 36 275



Здравствуйте.

Суть вопроса: написал программку, помимо всего, использую в ней единожды функцию sprintf(); , размер выходного файла hex = 10 564 байт. Комментирую функцию sprintf(); размер hex = 5 569 байт !!! Решил дальше поэкспериментировать:раскомментировал функцию и продублировал строчку с ней - размер hex = 10 638 байт. Т.е размер скомпилированной функции 74 байта. Та же ситуация с операцией сдвига, только применил в программе +781 байт, дальнейшее применение этой операции вообще не влияет на размер выходного файла. Вот, думаю суть понятна.

Теперь вопрос: что так жестоко хавает память ? И есть какие соображения по устранению проблемы? Может в makefile нуна что-то прописать ?

P.S. использую дефолтовый makefile, изменял лишь название контроллера, частоту и имя файла проги.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 10)
Палыч
сообщение May 6 2008, 12:43
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(RED_BULLok @ May 6 2008, 15:21) *
Теперь вопрос: что так жестоко хавает память ? И есть какие соображения по устранению проблемы?
Ну, и что тут не понятно? Вы сами, по-моему, всё объяснили своими примерами. Память едят процедуры, подключаемые из стандартных библиотек. Давно известно, что процедуры типа sprintf, scanf и еже с ними очень прожорливы до памити. Обычно, таких процедур несколько: разные возможности (только int, int+long, int+long+float) и, соответственно, разная потребность в памяти... Ну, и сдвиг (скорее всего не байта) - это тоже некая процедура, которая тоже отжирает память...
Ну, собственно, какие могут быть соображения? Не пользоваться стандартными printf и им подобными - обычно, можно написать свою более легкую функцию. Если памяти не хватает - попробовать включить оптимизацию по памяти...
Go to the top of the page
 
+Quote Post
DpInRock
сообщение May 6 2008, 12:43
Сообщение #3


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Сама функция занимает много место.
Ее вызов - несколько байт. 10 вызовов - несколько байт умножить на 10.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
RED_BULLok
сообщение May 6 2008, 13:21
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 27-03-08
Из: Беларусь, Минск
Пользователь №: 36 275



Эх..... ясно. В атмегу8 так и не получится впихнуться. Взял 32-ю. Насчет своих функций.... влом изобретать колесо. Лучше уж на асм перепрыгну, сложно но верно.
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение May 6 2008, 13:23
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



2 RED_BULLok - вообсче то вы обрабатываете напильником паравоз чтобы получить вертолёт (был когда то давно такой анекдот....)
Go to the top of the page
 
+Quote Post
RED_BULLok
сообщение May 6 2008, 13:29
Сообщение #6


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 27-03-08
Из: Беларусь, Минск
Пользователь №: 36 275



Цитата(Kuzmi4 @ May 6 2008, 16:23) *
2 RED_BULLok - вообсче то вы обрабатываете напильником паравоз чтобы получить вертолёт (был когда то давно такой анекдот....)


Ну помогите тогда написать аналог sprintf
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение May 6 2008, 13:43
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



2 RED_BULLok - а самому ??

Тут вроде описание есть -
http://www.codenet.ru/progr/cpp/spru/sprintf.php
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 6 2008, 14:08
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(RED_BULLok @ May 6 2008, 16:29) *
Ну помогите тогда написать аналог sprintf
Прямо-таки: аналог... Судя по вопросу - у Вас только один вызов этой функции. И, что он из себя представляет? Скорее всего Вы переводите в символы некоторую (возможно одну) переменную... Или группу переменных одного-двух типов... Вот Вам и нужна одна или две (три) функции типа itoa(), ltoa() или что-то подобное.
Go to the top of the page
 
+Quote Post
mdmitry
сообщение May 6 2008, 14:30
Сообщение #9


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



bb-offtopic.gif Почти. Уважаемый автор топика, пожалуйста, формулируйте тему верно. Programmers Notepad 2 к вопросу отношения не имеет.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
RED_BULLok
сообщение May 6 2008, 17:04
Сообщение #10


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 27-03-08
Из: Беларусь, Минск
Пользователь №: 36 275



Цитата(Палыч @ May 6 2008, 17:08) *
Прямо-таки: аналог... Судя по вопросу - у Вас только один вызов этой функции. И, что он из себя представляет? Скорее всего Вы переводите в символы некоторую (возможно одну) переменную... Или группу переменных одного-двух типов... Вот Вам и нужна одна или две (три) функции типа itoa(), ltoa() или что-то подобное.



Функцией sprintf() преобразую показания датчика температуры в стоку для вывода на ЖКИ (hd44780). Температура передается в двух байтах в 16-ричном числе, точность 0.5 град, т.е 20 град = 1400 для 20.5 град = 1480

Делаю так

if (((temp<<8)>>8) == 0x00)
{
sprintf(buf,"%d.0",(char)(temp>>8));
else
sprintf(buf,"%d.5",(char)(temp>>8));
}

В этом случае itoa(); никатит 05.gif

Может можно как-нить попроще выводить значения ?
Go to the top of the page
 
+Quote Post
vet
сообщение May 7 2008, 04:36
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



отчего же не катит?
Код
itoa(temp>>8,buf);
len = strlen(buf);
buf[len] = '.';
if (temp&0x80) buf[len+1] = '5'; else buf[len+1] = '0';
buf[len+2] = 0;


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 7th August 2025 - 00:14
Рейтинг@Mail.ru


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