Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: fload в char
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Karl
Народ, подскажите, как в ИАР преобразовать float (double) в строку с целью вывода на экран?
Dog Pawlowa
Цитата(Karl @ Jun 25 2007, 12:53) *
Народ, подскажите, как в ИАР преобразовать float (double) в строку с целью вывода на экран?

Я использую форматированный вывод с помощью sprintf.
KRS
Цитата(Karl @ Jun 25 2007, 13:53) *
Народ, подскажите, как в ИАР преобразовать float (double) в строку с целью вывода на экран?


sprintf

или можно прямо printf если вы определите функции вывода на экран
Karl
Попробовал sprintf - вылезла ошибка
Fatal Error[e72]: Segment HEAP must be defined in a segment definition option (-Z, -b or -P)
zltigo
Цитата(Karl @ Jun 25 2007, 13:59) *
Попробовал sprintf - вылезла ошибка
Fatal Error[e72]: Segment HEAP must be defined in a segment definition option (-Z, -b or -P)

Ну так нужен ему heap сегмент - опишите линкеру месторасположение и размер.
IgorKossak
Для работы sprintf HEAP не нужен.
Видимо автор пытается определить буфер для выводимого стринга в динамической памяти. Определите буфер статически и не будет никаких ошибок.
Karl
Цитата(IgorKossak @ Jun 25 2007, 20:00) *
Для работы sprintf HEAP не нужен.
Видимо автор пытается определить буфер для выводимого стринга в динамической памяти. Определите буфер статически и не будет никаких ошибок.


Я действительно локально определил массив. HEAP уже определил.
Всем спасибо за помощь.
shasik
Цитата(Karl @ Jun 25 2007, 12:53) *
Народ, подскажите, как в ИАР преобразовать float (double) в строку с целью вывода на экран?


А на какой экран, если не секрет? Если на "экран" симулятора, то черт с ним. А если преобразовываете double в char для работ с ЖКИ, то использовать printf нельзя - ооооочень медленно будет.
Dog Pawlowa
Цитата(shasik @ Jun 26 2007, 12:49) *
А на какой экран, если не секрет? Если на "экран" симулятора, то черт с ним. А если преобразовываете double в char для работ с ЖКИ, то использовать printf нельзя - ооооочень медленно будет.

Да? А медленно - это сколько?
shasik
Цитата(Dog Pawlowa @ Jun 26 2007, 18:37) *
Да? А медленно - это сколько?


Встречный вопрос: а как подсчитать количество тактов, потраченных на выполнение того или иного куска кода? Судя по Вашим постам в этом форуме, ответ Вы знаете. Зачем тогда спрашиваете, издеваетесь, да?

Код:
Код
sprintf(txt, "%.4f", 12.35);


занимает в IAR симуляторе примерно 19000 тиков CYCLECOUNTER'а. Много это или мало Вам судить.
По мне проще сделать простое преобразование типов (int), а затем (char *)& или Bin2BCD. Если нужна и дробная часть, то сначала умножить на 10.0, 100.0, 1000.0 и т.д. Все равно быстрее. Да и не забудьте добавить 0.5, чтобы получить правильное округление.
Dog Pawlowa
Цитата(shasik @ Jun 27 2007, 08:49) *
Встречный вопрос: а как подсчитать количество тактов, потраченных на выполнение того или иного куска кода? Судя по Вашим постам в этом форуме, ответ Вы знаете. Зачем тогда спрашиваете, издеваетесь, да?

Код:
Код
sprintf(txt, "%.4f", 12.35);


занимает в IAR симуляторе примерно 19000 тиков CYCLECOUNTER'а. Много это или мало Вам судить.
По мне проще сделать простое преобразование типов (int), а затем (char *)& или Bin2BCD. Если нужна и дробная часть, то сначала умножить на 10.0, 100.0, 1000.0 и т.д. Все равно быстрее. Да и не забудьте добавить 0.5, чтобы получить правильное округление.

Издеваюсь ли? Немножко smile.gif

19000 тиков - это на частоте 8 Мгц время 2 мс, частота 500 Гц, да? Глаз чаще 20 Гц не различает. Реально отсчеты могут отложиться в мозгу с частотой 1-2 Гц, если смотрит человек, а не терминатор.
Поэтому я и удивился - так для кого Вы делаете такой прибор?! smile.gif

А такты я не считаю, я осциллографом смотрю критичные участки.
shasik
Цитата(Dog Pawlowa @ Jun 27 2007, 09:36) *
Издеваюсь ли? Немножко smile.gif

19000 тиков - это на частоте 8 Мгц время 2 мс, частота 500 Гц, да? Глаз чаще 20 Гц не различает. Реально отсчеты могут отложиться в мозгу с частотой 1-2 Гц, если смотрит человек, а не терминатор.
Поэтому я и удивился - так для кого Вы делаете такой прибор?! smile.gif

А такты я не считаю, я осциллографом смотрю критичные участки.


А если так: процессор MSP430, тактовая 32*32768 Гц. Тогда 19000 = 18мс или 55 Гц. С 55 Гц вроде нормально, но тратить 18мс на простой вывод на экран - это уж слишком. Реально в промышленных приборах индикатор скорее красивая примочка, основная же работа "скрыта от глаз". А отсутствие контроля в течении 18мс для некоторых технологических процессов неприемлимо.

Мое мнение неизменно: printf - только для Simulator'а. Даже на PC'ках с их гигигерцами в программах, критичных к времени выполнения, это роскошь.
Dog Pawlowa
Цитата(shasik @ Jun 27 2007, 10:58) *
А отсутствие контроля в течении 18мс для некоторых технологических процессов неприемлимо.

А систему прерываний уже отменили?
Кто посмел?! smile.gif
shasik
Цитата(Dog Pawlowa @ Jun 27 2007, 11:36) *
А систему прерываний уже отменили?
Кто посмел?! smile.gif


Смешно!

Действительно, зачем мучить себя и писать какой-то код, если есть уже готовый. Да фиг с ним, что он на порядок(!) медленне, фиг с ним - купим проц побыстрее. А напрягать свой "мозг" не станем. А наслаждение от хорошо сделанной работы - тоже фиг с ним, лишь бы деньги платили.

P.S. В Microsoft работаете?
zltigo
Цитата(shasik @ Jun 27 2007, 08:49) *
По мне проще сделать простое преобразование типов (int), а затем (char *)& или Bin2BCD. Если нужна и дробная часть, то сначала умножить на 10.0, 100.0, 1000.0 и т.д. Все равно быстрее. Да и не забудьте добавить 0.5, чтобы получить правильное округление.

То о чем Вы пытаетесь вести речь не есть работа c float double. Это призыв не пользоваться float, но далеко не все могут ему последовать. Попробуйте написать свою функцию для печати 64bit float smile.gif и расскажите сколько сэкономили. Заодно можете попробовать сколько времени на 8-бит контроллерах операции с 64 битной плавучкой занимают, но есть такое слово "надо" smile.gif
Естественно, printf() обладает избыточностью и "сделать" его на печати какого-нибудь int тупо задав выходной формат и написав жесткую обработку легко. Но для float относительный выигрыш будет меньше.
По поводу "18ms" и "отсутствие контроля" - про прерывания Вам уже сказали, а вообще в нормально созданной системе процесс отображения самый не приоритетный и очередь сообщений к процессу отображения строится с намеряными потерями, что позволяет не отображать тупо информацию чаще, чем оператор ее может считывать.
Цитата(shasik @ Jun 27 2007, 12:16) *
А напрягать свой "мозг" не станем.

Напрягать мозг станем! Обязательно! Только в правильном направлении а не в рамках полировки отдельных абсолютно не критичных кусочков кода.
Dog Pawlowa
Цитата(shasik @ Jun 27 2007, 12:16) *
Смешно!

Действительно, зачем мучить себя и писать какой-то код, если есть уже готовый. Да фиг с ним, что он на порядок(!) медленне, фиг с ним - купим проц побыстрее. А напрягать свой "мозг" не станем. А наслаждение от хорошо сделанной работы - тоже фиг с ним, лишь бы деньги платили.

P.S. В Microsoft работаете?

Если Вы будете переходить на личности, модераторы примут меры, что будет не очень хорошо для Вас, так как мне кажется, что всегда и всем есть чему поучиться, в том числе и Вам у меня. Если это Вам смешно и/или обидно, лучше промолчите.
Если же Вы готовы продолжить дискуссию, то мы можем это сделать, только избегайте упоминания об абстрактном готовом софте, смысле напрягать мозги, упреков в получении незаработанных денег, и месте моей работы - только технические аспекты.

Итак, что мешает Вам огранизовать контроль технологических процессов с периодичностью 0,5 .. 1 мс в прерывании таймера, исключив тем самым задержку контроля при выводе информации на экран?
shasik
Цитата(zltigo @ Jun 27 2007, 12:30) *
То о чем Вы пытаетесь вести речь не есть работа c float double


Еще раз: в моем случае у меня float, а на ЖКИ вывод с одним знаком после запятой, да и диапазон известен (ну, скажем проценты). Зачем мне printf?
Умножил на 10.0, добавил 0.5, преобразовал к unsigned, преобразовал к BCD. Все просто и никаких заманух. В таком случае sprintf явно избыточен. Согласны? Понимаю, что такой вариант не всем подходит. Но и не говорите, что такой вариант не имеет право на жизнь. Иногда нужен и sprintf, не отрицаю. Я же всего лишь указал на один из возможных вариантов, но не горил, что это единственно возможный путь.

На счет некритичности... Отсчеты - 1кГц, т.е. на обработку одного отсета 1мс. Теперь добавим немного арифметики с плавающей запятой, пару прерываний на прием/передачу, да не забудем про тактовую частоту в 1048576 Гц. 18мс*"частота кадров" в таких условиях много или мало?

Цитата(Dog Pawlowa @ Jun 27 2007, 12:35) *
Если Вы будете переходить на личности, модераторы примут меры, что будет не очень хорошо для Вас, так как мне кажется, что всегда и всем есть чему поучиться, в том числе и Вам у меня. Если это Вам смешно и/или обидно, лучше промолчите.
Если же Вы готовы продолжить дискуссию, то мы можем это сделать, только избегайте упоминания об абстрактном готовом софте, смысле напрягать мозги, упреков в получении незаработанных денег, и месте моей работы - только технические аспекты.

Итак, что мешает Вам огранизовать контроль технологических процессов с периодичностью 0,5 .. 1 мс в прерывании таймера, исключив тем самым задержку контроля при выводе информации на экран?


1. А объяснять, что есть такая штука как система прерываний, и ерничать по этому поводу, не считаете оскорблением? Если чем обидел, извините. Вот только пугать не надо - не женщина я, чтобы бояться. А по поводу поучиться у Вас, я как раз и говорил, о значительном(!) присутствии смысла в Ваших постах, не думал, что это Вас обидит.

2. Есть проблема и в условиях неопределенности конкретных требований к ее решению несколько возможных путей ее устранения. Не лучше ли рассмотреть разные варианты, предоставив возможность выбора, чем в безапеляционно отстаивать свою точку зрения. Помню, была уже у нас однопартийная система, а вместо выборов голосование.
Dog Pawlowa
Цитата(shasik @ Jun 27 2007, 13:48) *
1. А объяснять, что есть такая штука как система прерываний, и ерничать по этому поводу, не считаете оскорблением? ...

И Вы меня извините.

Цитата(shasik @ Jun 27 2007, 13:48) *
2. Есть проблема и в условиях неопределенности конкретных требований к ее решению несколько возможных путей ее устранения.

Не очень понятна суть проблемы, даже интересно, но решите ведь и без меня?
Успехов
Karl
Уф, ну и дискуссию вы тут развернули! Похоже, у кого-то мало работы wink.gif По моему мнению что кому использовать каждый решит сам. В моем случае использование переменных с плавающей точкой - необходимость. Избежать этого не получилось. А выводить эти переменные на дисплей ЖКИ необходимо только для контроля в режиме отладки. И тут, как правильно подметил shasik, "зачем мучить себя и писать какой-то код, если есть уже готовый" biggrin.gif
Всем удачи!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.