Перейти к содержанию
    

Как в микроконтроллере преобразовать число float IEEE 754 в десятичное int?

Интересно, только у меня возник первый вопрос - "6 мкс многовато" - для чего? Что за космический реалтайм?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 hours ago, jcxz said:
float a = ...;
int result = (int)(a * (1 << 8)) * 10 >> 8;

 

Применение такого выражение позволило снизить время выполнения с 6 мкс до 5,2 мкс.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 minutes ago, sidy said:

Применение такого выражение позволило снизить время выполнения с 6 мкс до 5,2 мкс.

Интересно - сколько времени занимает просто преобразование?

int result = a;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, pyroman said:

Интересно - сколько времени занимает просто преобразование?

int result = a;

Не могу сказать точно. Время выполнение данного участка кода я измеряю с помощь установки 1 и сброса в 0 ножки МК. В данном случае там всегда ноль, т.е. в 1 установиться не успевает. Можно сделать вывод что преобразование происходит очень быстро)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

55 минут назад, sidy сказал:

Не могу сказать точно. Время выполнение данного участка кода я измеряю с помощь установки 1 и сброса в 0 ножки МК.

Меряете микроны с помощью миллиметровой линейки?  :biggrin:

имхо - это очень грубое измерение. Лучше для измерения таких задержек пользоваться таймером.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, sidy said:

Не могу сказать точно. Время выполнение данного участка кода я измеряю с помощь установки 1 и сброса в 0 ножки МК. В данном случае там всегда ноль, т.е. в 1 установиться не успевает. Можно сделать вывод что преобразование происходит очень быстро)

 

6 minutes ago, jcxz said:

Меряете микроны с помощью миллиметровой линейки?  :biggrin:

имхо - это очень грубое измерение. Лучше для измерения таких задержек пользоваться таймером.

Скорее всего оптимизатор что-то соптимизировал.
Не может такое преобразование мгновенно выполняться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 минут назад, dimka76 сказал:

Скорее всего оптимизатор что-то соптимизировал.
Не может такое преобразование мгновенно выполняться.

Если обращение к таймеру правильно прописано (со всеми volatile), то не важно - соптимизирорвал или нет -> будет показывать правильно реальное время выполнения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 hours ago, pyroman said:

Интересно - сколько времени занимает просто преобразование?

int result = a;

 

22 hours ago, dimka76 said:

 

Скорее всего оптимизатор что-то соптимизировал.
Не может такое преобразование мгновенно выполняться.

Да действительно, соптимизировал:

3,4 мкс занимает такое преобразование.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/21/2023 at 9:45 AM, sidy said:

 

Да действительно, соптимизировал:

3,4 мкс занимает такое преобразование.

Может вам на Cortex-M4F перейти ?
Они и дешевле гораздо и доступнее (по крайней мере в России).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

35 minutes ago, dimka76 said:

Может вам на Cortex-M4F перейти ?
Они и дешевле гораздо и доступнее (по крайней мере в России).

Это все понятно и даже используется. Просто есть один старый проект в который потребовалось добавить функционал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

  unsigned long data;
  signed long result;
  
  data = 0xC1480000; //-12.5

  if (data != 0)  
  {  
    result = (data & 0x007FFFFF | 0x00800000) * 10 >> (150 - (data >> 23 & 0xFF));
    if (data & 0x80000000) //знак числа
      result = -result;
  }  
  else
    result = 0;  

 

Изменено пользователем pyroman

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 21.12.2023 в 07:45, sidy сказал:

Да действительно, соптимизировал:

3,4 мкс занимает такое преобразование.

Так а нужно-то сколько? просто больше или просто меньше- это не на инженерном языке.

Если больше чего то не годится? если меньше чего то подходит?

Ну и проверять доли микросекунд пином- так себе тест. Нужно или такты в симуляторе/эмуляторе считать, или таймер аппаратный под эту проверку использовать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/21/2023 at 8:30 PM, pyroman said:
  unsigned long data;
  signed long result;
  
  data = 0xC1480000; //-12.5

  if (data != 0)  
  {  
    result = (data & 0x007FFFFF | 0x00800000) * 10 >> (150 - (data >> 23 & 0xFF));
    if (data & 0x80000000) //знак числа
      result = -result;
  }  
  else
    result = 0;  

 

 

Спасибо! Думаю это просто отличное решение. Только не совсем понятно: что означает (откуда берется) число 150?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 hours ago, sidy said:

Только не совсем понятно: что означает (откуда берется) число 150?

А также 23. Да здравствуют магические константы и отсутствие комментариев!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/25/2023 at 9:13 AM, andrew_b said:

А также 23. 

Это местоположение экспоненты в битовом пространстве числа в формате с плавающей точкой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...