Karl 0 25 июня, 2007 Опубликовано 25 июня, 2007 · Жалоба Народ, подскажите, как в ИАР преобразовать float (double) в строку с целью вывода на экран? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 25 июня, 2007 Опубликовано 25 июня, 2007 · Жалоба Народ, подскажите, как в ИАР преобразовать float (double) в строку с целью вывода на экран? Я использую форматированный вывод с помощью sprintf. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 25 июня, 2007 Опубликовано 25 июня, 2007 · Жалоба Народ, подскажите, как в ИАР преобразовать float (double) в строку с целью вывода на экран? sprintf или можно прямо printf если вы определите функции вывода на экран Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Karl 0 25 июня, 2007 Опубликовано 25 июня, 2007 · Жалоба Попробовал sprintf - вылезла ошибка Fatal Error[e72]: Segment HEAP must be defined in a segment definition option (-Z, -b or -P) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 25 июня, 2007 Опубликовано 25 июня, 2007 · Жалоба Попробовал sprintf - вылезла ошибка Fatal Error[e72]: Segment HEAP must be defined in a segment definition option (-Z, -b or -P) Ну так нужен ему heap сегмент - опишите линкеру месторасположение и размер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 25 июня, 2007 Опубликовано 25 июня, 2007 · Жалоба Для работы sprintf HEAP не нужен. Видимо автор пытается определить буфер для выводимого стринга в динамической памяти. Определите буфер статически и не будет никаких ошибок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Karl 0 26 июня, 2007 Опубликовано 26 июня, 2007 · Жалоба Для работы sprintf HEAP не нужен. Видимо автор пытается определить буфер для выводимого стринга в динамической памяти. Определите буфер статически и не будет никаких ошибок. Я действительно локально определил массив. HEAP уже определил. Всем спасибо за помощь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shasik 0 26 июня, 2007 Опубликовано 26 июня, 2007 · Жалоба Народ, подскажите, как в ИАР преобразовать float (double) в строку с целью вывода на экран? А на какой экран, если не секрет? Если на "экран" симулятора, то черт с ним. А если преобразовываете double в char для работ с ЖКИ, то использовать printf нельзя - ооооочень медленно будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 26 июня, 2007 Опубликовано 26 июня, 2007 · Жалоба А на какой экран, если не секрет? Если на "экран" симулятора, то черт с ним. А если преобразовываете double в char для работ с ЖКИ, то использовать printf нельзя - ооооочень медленно будет. Да? А медленно - это сколько? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shasik 0 27 июня, 2007 Опубликовано 27 июня, 2007 · Жалоба Да? А медленно - это сколько? Встречный вопрос: а как подсчитать количество тактов, потраченных на выполнение того или иного куска кода? Судя по Вашим постам в этом форуме, ответ Вы знаете. Зачем тогда спрашиваете, издеваетесь, да? Код: sprintf(txt, "%.4f", 12.35); занимает в IAR симуляторе примерно 19000 тиков CYCLECOUNTER'а. Много это или мало Вам судить. По мне проще сделать простое преобразование типов (int), а затем (char *)& или Bin2BCD. Если нужна и дробная часть, то сначала умножить на 10.0, 100.0, 1000.0 и т.д. Все равно быстрее. Да и не забудьте добавить 0.5, чтобы получить правильное округление. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 27 июня, 2007 Опубликовано 27 июня, 2007 · Жалоба Встречный вопрос: а как подсчитать количество тактов, потраченных на выполнение того или иного куска кода? Судя по Вашим постам в этом форуме, ответ Вы знаете. Зачем тогда спрашиваете, издеваетесь, да? Код: sprintf(txt, "%.4f", 12.35); занимает в IAR симуляторе примерно 19000 тиков CYCLECOUNTER'а. Много это или мало Вам судить. По мне проще сделать простое преобразование типов (int), а затем (char *)& или Bin2BCD. Если нужна и дробная часть, то сначала умножить на 10.0, 100.0, 1000.0 и т.д. Все равно быстрее. Да и не забудьте добавить 0.5, чтобы получить правильное округление. Издеваюсь ли? Немножко :) 19000 тиков - это на частоте 8 Мгц время 2 мс, частота 500 Гц, да? Глаз чаще 20 Гц не различает. Реально отсчеты могут отложиться в мозгу с частотой 1-2 Гц, если смотрит человек, а не терминатор. Поэтому я и удивился - так для кого Вы делаете такой прибор?! :) А такты я не считаю, я осциллографом смотрю критичные участки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shasik 0 27 июня, 2007 Опубликовано 27 июня, 2007 · Жалоба Издеваюсь ли? Немножко :) 19000 тиков - это на частоте 8 Мгц время 2 мс, частота 500 Гц, да? Глаз чаще 20 Гц не различает. Реально отсчеты могут отложиться в мозгу с частотой 1-2 Гц, если смотрит человек, а не терминатор. Поэтому я и удивился - так для кого Вы делаете такой прибор?! :) А такты я не считаю, я осциллографом смотрю критичные участки. А если так: процессор MSP430, тактовая 32*32768 Гц. Тогда 19000 = 18мс или 55 Гц. С 55 Гц вроде нормально, но тратить 18мс на простой вывод на экран - это уж слишком. Реально в промышленных приборах индикатор скорее красивая примочка, основная же работа "скрыта от глаз". А отсутствие контроля в течении 18мс для некоторых технологических процессов неприемлимо. Мое мнение неизменно: printf - только для Simulator'а. Даже на PC'ках с их гигигерцами в программах, критичных к времени выполнения, это роскошь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 27 июня, 2007 Опубликовано 27 июня, 2007 · Жалоба А отсутствие контроля в течении 18мс для некоторых технологических процессов неприемлимо. А систему прерываний уже отменили? Кто посмел?! :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shasik 0 27 июня, 2007 Опубликовано 27 июня, 2007 · Жалоба А систему прерываний уже отменили? Кто посмел?! :) Смешно! Действительно, зачем мучить себя и писать какой-то код, если есть уже готовый. Да фиг с ним, что он на порядок(!) медленне, фиг с ним - купим проц побыстрее. А напрягать свой "мозг" не станем. А наслаждение от хорошо сделанной работы - тоже фиг с ним, лишь бы деньги платили. P.S. В Microsoft работаете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 27 июня, 2007 Опубликовано 27 июня, 2007 · Жалоба По мне проще сделать простое преобразование типов (int), а затем (char *)& или Bin2BCD. Если нужна и дробная часть, то сначала умножить на 10.0, 100.0, 1000.0 и т.д. Все равно быстрее. Да и не забудьте добавить 0.5, чтобы получить правильное округление. То о чем Вы пытаетесь вести речь не есть работа c float double. Это призыв не пользоваться float, но далеко не все могут ему последовать. Попробуйте написать свою функцию для печати 64bit float :) и расскажите сколько сэкономили. Заодно можете попробовать сколько времени на 8-бит контроллерах операции с 64 битной плавучкой занимают, но есть такое слово "надо" :) Естественно, printf() обладает избыточностью и "сделать" его на печати какого-нибудь int тупо задав выходной формат и написав жесткую обработку легко. Но для float относительный выигрыш будет меньше. По поводу "18ms" и "отсутствие контроля" - про прерывания Вам уже сказали, а вообще в нормально созданной системе процесс отображения самый не приоритетный и очередь сообщений к процессу отображения строится с намеряными потерями, что позволяет не отображать тупо информацию чаще, чем оператор ее может считывать. А напрягать свой "мозг" не станем. Напрягать мозг станем! Обязательно! Только в правильном направлении а не в рамках полировки отдельных абсолютно не критичных кусочков кода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться