STM32: деление или вычитание?

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Поставщик валерьянки для Кота
Сообщения: 2200
Зарегистрирован: Вс ноя 15, 2009 23:13:59
Откуда: Харьков

Сообщение watchmaker »

Код: Выделить всё

uint8_t ByteToBcd2(uint8_t Value)
{
  uint8_t bcdhigh = 0;
  while (Value >= 10)
  {
    bcdhigh++;
    Value -= 10;
  }
  return  ((uint8_t)(bcdhigh << 4) | Value);
}
Функция преобразует двоичное число в двоично-десятичное. Взята из библиотеки RTC для иара. Не проще ли просто
return ((Value/10)<<4) | (Value%10);
Или это не так эффективно?
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Смотря какое ядро. Для Cortex-M0..M3 может и так эффективнее. А для Cortex-M4(f) плевать как.
У последнего числодробилка полноценная. С FPU.
Cortex-M3 умеет делить, но не умеет операции с числами с плавающей точкой.
Cortex-M0 помоему делить не умеет вообще (в смысле, аппаратно)
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Сообщение menzoda »

Надо измерять. Для 8-битного значения вычитать десятку придется в худшем случае 25 раз, что не так много. Если присутствует аппаратная операция деления, то она тоже далеко не за один такт выполняется, не помню за сколько точно, нужно документ на ядро смотреть. Кроме того там есть операция вычисления остатка от деления. Черт его знает, что там выдаст компилятор, вариантов куча. По идее, он вообще должен заменить деление на константу умножением, тогда последний вариант будет выигрышным, но кто его знает. Надо измерять.
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

А нех там измерять... Для F0 быстрее будет с вычитанием (аппаратное деление отсутствует)... для остальных с делением...
И нет там никаких "25 раз"...
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Аватара пользователя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Сообщение menzoda »

HHIMERA писал(а):Для F0 быстрее будет с вычитанием (аппаратное деление отсутствует)
А если заменить деление на десять на:

Код: Выделить всё

uint8_t div10(uint8_t value)
{
    return ((uint32_t)value * 205) / 2048;
}
??? Измерять надо.
Реклама
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Для данного случая... для F0 - произведение лучше... для остальных - нет смысла...
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Сообщение menzoda »

И для остальных лучше. Умножение плюс сдвиг - два такта, деление - вроде 14, точно не помню.
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Аппаратный делитель в Cortex-M3/M4 делит за 2...12 тактов.
В M4 имеется поддержка некоторых DSP-инструкций.
Я когда писал под M4 (STM32F439BIT6), то вообще не заморачивался.
Тупо вписывал формулы с использованием float переменных.
На производительности ничего практически не потерял.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2200
Зарегистрирован: Вс ноя 15, 2009 23:13:59
Откуда: Харьков

Сообщение watchmaker »

Float мне не надо, только целое 8 или 32 бита.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Еще одна мелочь. Цикл может породить инструкции косвенного перехода. Хотя, в данном
случае логичнее применить условный или абсолютный переходы, которые конвейеру не страшны.
Но мало-ли что компилятору взбредет.
Инструкции косвенного перехода часто вызывают сброс конвейера инструкций ядра. (промах кеша)
В этом случае, можно нехило так потерять в производительности, что дешевле будет делить аппаратно.
Так что надо это учесть.
Вообще, вот есть книжка на русском по микроконтроллерам STM32 с ядром Cortex-M3
Мартин М. Инсайдерское руководство по STM32
Там описаны такие вещи, как ядро, NVIC, шины, DMA, периферия и прочее.
Это не даташит, а описание архитектуры МК в целом. Как оно работает, из чего состоит и прочее.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Сообщение menzoda »

watchmaker в общем то в реальной жизни такие мелочи оптимизировать не нужно, это капля в море, если же это чисто из академического интереса, то тут все верно написали.
Поставщик валерьянки для Кота
Сообщения: 2200
Зарегистрирован: Вс ноя 15, 2009 23:13:59
Откуда: Харьков

Сообщение watchmaker »

Реальная жизнь - это наручные часы на литиевой батарейке с потреблением 6..8 мкА. Так что не исключено, что и это может повлиять.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Контактная информация:
Ответить

Вернуться в «ARM»