Страница 1 из 1

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

Добавлено: Вс июл 27, 2014 21:47:24
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);
Или это не так эффективно?

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

Добавлено: Пн июл 28, 2014 04:43:42
DX168B
Смотря какое ядро. Для Cortex-M0..M3 может и так эффективнее. А для Cortex-M4(f) плевать как.
У последнего числодробилка полноценная. С FPU.
Cortex-M3 умеет делить, но не умеет операции с числами с плавающей точкой.
Cortex-M0 помоему делить не умеет вообще (в смысле, аппаратно)

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

Добавлено: Пн июл 28, 2014 13:56:24
menzoda
Надо измерять. Для 8-битного значения вычитать десятку придется в худшем случае 25 раз, что не так много. Если присутствует аппаратная операция деления, то она тоже далеко не за один такт выполняется, не помню за сколько точно, нужно документ на ядро смотреть. Кроме того там есть операция вычисления остатка от деления. Черт его знает, что там выдаст компилятор, вариантов куча. По идее, он вообще должен заменить деление на константу умножением, тогда последний вариант будет выигрышным, но кто его знает. Надо измерять.

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

Добавлено: Пн июл 28, 2014 14:06:05
HHIMERA
А нех там измерять... Для F0 быстрее будет с вычитанием (аппаратное деление отсутствует)... для остальных с делением...
И нет там никаких "25 раз"...

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

Добавлено: Пн июл 28, 2014 14:16:35
menzoda
HHIMERA писал(а):Для F0 быстрее будет с вычитанием (аппаратное деление отсутствует)
А если заменить деление на десять на:

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

uint8_t div10(uint8_t value)
{
    return ((uint32_t)value * 205) / 2048;
}
??? Измерять надо.

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

Добавлено: Пн июл 28, 2014 16:21:56
HHIMERA
Для данного случая... для F0 - произведение лучше... для остальных - нет смысла...

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

Добавлено: Пн июл 28, 2014 16:23:19
menzoda
И для остальных лучше. Умножение плюс сдвиг - два такта, деление - вроде 14, точно не помню.

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

Добавлено: Пн июл 28, 2014 19:37:15
DX168B
Аппаратный делитель в Cortex-M3/M4 делит за 2...12 тактов.
В M4 имеется поддержка некоторых DSP-инструкций.
Я когда писал под M4 (STM32F439BIT6), то вообще не заморачивался.
Тупо вписывал формулы с использованием float переменных.
На производительности ничего практически не потерял.

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

Добавлено: Пн июл 28, 2014 23:19:13
watchmaker
Float мне не надо, только целое 8 или 32 бита.

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

Добавлено: Вт июл 29, 2014 02:15:11
DX168B
Еще одна мелочь. Цикл может породить инструкции косвенного перехода. Хотя, в данном
случае логичнее применить условный или абсолютный переходы, которые конвейеру не страшны.
Но мало-ли что компилятору взбредет.
Инструкции косвенного перехода часто вызывают сброс конвейера инструкций ядра. (промах кеша)
В этом случае, можно нехило так потерять в производительности, что дешевле будет делить аппаратно.
Так что надо это учесть.
Вообще, вот есть книжка на русском по микроконтроллерам STM32 с ядром Cortex-M3
Мартин М. Инсайдерское руководство по STM32
Там описаны такие вещи, как ядро, NVIC, шины, DMA, периферия и прочее.
Это не даташит, а описание архитектуры МК в целом. Как оно работает, из чего состоит и прочее.

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

Добавлено: Вт июл 29, 2014 07:52:08
menzoda
watchmaker в общем то в реальной жизни такие мелочи оптимизировать не нужно, это капля в море, если же это чисто из академического интереса, то тут все верно написали.

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

Добавлено: Вт июл 29, 2014 23:45:48
watchmaker
Реальная жизнь - это наручные часы на литиевой батарейке с потреблением 6..8 мкА. Так что не исключено, что и это может повлиять.