www.kn34pc.com

Форум на силистренските радиолюбители
Дата и час: 03 Дек 2022, 18:02

Часовете са според зоната UTC + 2 часа [ DST ]




Напиши нова тема Отговори на тема  [ 4 мнения ] 
Автор Съобщение
МнениеПубликувано на: 30 Авг 2021, 13:51 
Offline
Аватар

Регистриран на: 07 Дек 2006, 18:24
Мнения: 1343
Местоположение: Силистра
Какво оптимизира функцията _mul в PIC-C Compiler?

Спестява памет при умножение, в PIC без ресурси е добре дошло.
Интересно е как?

Из help-а:
Syntax: prod=_mul(val1, val2);
Parameters: val1 and val2 are both 8-bit or 16-bit integers
Returns: A 16-bit integer if both parameters are 8-bit integers, or a 32-bit integer if both parameters are 16-bit integers.
Function: Performs an optimized multiplication. By accepting a different type than it returns, this function avoids the overhead of converting the parameters to a larger type.


Върнете се в началото
 Профил  
 
МнениеПубликувано на: 30 Авг 2021, 13:52 
Offline
Аватар

Регистриран на: 07 Дек 2006, 18:24
Мнения: 1343
Местоположение: Силистра
Пример за 16F628a:
210/38 срещу 189/38
Код за потвърждение:
#include <main.h>
#include <stdint.h>
#include <stdbool.h>

uint32_t x = 123456789;
uint32_t y = 987654321;
uint32_t z = 12121212;
uint32_t res;

void main() {
  // res = (x * y) / z;   // 210/38
  res = _mul(x, y) / z;   // 189/38

  while(TRUE){
  }
}

Прикачени файлове:
mul.zip [26.52 KiB]
45 пъти

Оригиналният израз за приемник с TEA, с който пресмятам, е:
Код за потвърждение:
uint16_t data = 4 * (rx * 100000 + 225000) / 32768;  // 474/16

съкратен до:
Код за потвърждение:
uint16_t data = (_mul(rx, 12500) + 28125) / 1024;  // 502/25


Върнете се в началото
 Профил  
 
МнениеПубликувано на: 07 Сеп 2021, 22:35 
Offline

Регистриран на: 15 Дек 2012, 09:51
Мнения: 51
Ами по принцип резултата е от типа на по големият тип на единият операнд. Т.е. ако умножиш един байт със друг трябва да кастнеш към инт единият операнд ако произведението се очаква да е > 255. Кастването явно отнема някакви ресурси не зная какви. Не зная и как са оптимизирали нещата в _mul .
Умножение/деление на може да се получи като се шифтне един бит съответно наляво/надясно. Съответно за 4, 8, 16 и т.н. със 2,3,4 бита. За 32768 също става. Това работи значително по-оптимално - не помня можеше ли с една инструкция да се превъртат 8 бита...
На теб би ти оптимизирало две от сметките, но това едва ли е толкова важно.
Иначе по-мощните процесори си имат модули за хардуерно умножаване. :)


Върнете се в началото
 Профил  
 
МнениеПубликувано на: 07 Сеп 2021, 22:44 
Offline
Аватар

Регистриран на: 07 Дек 2006, 18:24
Мнения: 1343
Местоположение: Силистра
В
x /= 32768;
и
x >>= 15;
и подобните изрази разлика в кода няма. Оптимизацията е в компилатора.
Заместванията от този вид не необходимо дори да се осмислят: пишеш кода както ти е по-четливо.

Въпросът ми е принципен за _mul.
Конкретно примерът за честотата ми е към PIC12F508, а там ресурс няма.


Върнете се в началото
 Профил  
 
Покажи мненията от миналия:  Сортирай по  
Напиши нова тема Отговори на тема  [ 4 мнения ] 

Часовете са според зоната UTC + 2 часа [ DST ]


Кой е на линия

Потребители, разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
cron
Форумът се задвижва от phpBB® Forum Software © phpBB Group
Преведено от yarnaudov.com