реклама на сайте
подробности

 
 
> как перемножать при помощи встроенного умножителя?
cornflyer
сообщение Feb 22 2008, 10:10
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 11-07-06
Из: Dubna
Пользователь №: 18 729



мне нужно умножать два 16bit числа, потом результат поделить на 4095
галочка в ИАРе в опциях стоит - hardware multiplyer
но приведенный ниже код не работает!
может лучше на ассемблере сделать эту фунцкию?


unsigned int get_code ( unsigned int num_value, unsigned int k )
{
tmp = num_value * k ;
asm ("nop") ;
asm ("nop") ;
asm ("nop") ;
tmp = tmp >> 12 ;
return tmp ;
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Feb 22 2008, 11:39
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



А зачем для столь простых операций целочисленного умножения и деления отдельную функцию городить? 07.gif Это же Си, а не ассемблер. Если в свойствах проекта указано о том, что нужно использовать аппаратный умножитель, то компилятор сам подставит вызов именно той функции, которая его использует.
Go to the top of the page
 
+Quote Post
cornflyer
сообщение Feb 22 2008, 13:41
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 11-07-06
Из: Dubna
Пользователь №: 18 729



я сделал так:

unsigned int dac_code = 0 ;
unsigned int HV_value = 0 ;
........

unsigned int get_code ( unsigned int num_value, unsigned int k )
{
unsigned long t = num_value * k ;
asm ( " nop " ) ;
asm ( " nop " ) ;
asm ( " nop " ) ;
asm ( " nop " ) ;
return ( t >> 12 ) ;
}

.........

HV_value = 500 ;

..........

// DAC8512 code = HV_value * 4000/5000 = HV_value * 3276/4095
dac_code = get_code ( HV_value, 3276 ) ;

.........

// отсылаю значение dac_code в ПК через RS-232
query_buf [ 6 ] = dac_code ;
query_buf [ 7 ] = dac_code >> 8 ;

В итоге на компе вижу цифру 15
Откуда!?
Должно быть 400.....

так железно должно работать:

unsigned int t = 0 ;

unsigned int get_code ( unsigned int num_value, unsigned int k )
{
stack1 [ 0 ] = num_value ;
stack1 [ 1 ] = num_value >> 8 ;
stack2 [ 0 ] = k ;
stack2 [ 1 ] = k >> 8 ;

result [ 3 ] = stack1 [ 1 ] * stack2 [ 1 ] ;
result [ 2 ] = stack1 [ 1 ] * stack2 [ 0 ] ;
result [ 1 ] = stack1 [ 0 ] * stack2 [ 1 ] ;
result [ 0 ] = stack1 [ 0 ] * stack2 [ 0 ] ;

t = ( result [ 3 ] << 16 ) + result [ 0 ] + ( ( result [ 2 ] + result [ 1 ] ) << 8 ) ;
return ( t >> 12 ) ;
}

но компилятор ругаеца - Warning[Pe063]: shift count is too large
что собственно естественно - у MSP430 размер регистров 16 бит
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 22 2008, 17:09
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(cornflyer @ Feb 22 2008, 18:41) *
я сделал так:
unsigned int get_code ( unsigned int num_value, unsigned int k )
{
unsigned long t = num_value * k ;
asm ( " nop " ) ;
asm ( " nop " ) ;
asm ( " nop " ) ;
asm ( " nop " ) ;
return ( t >> 12 ) ;
}


А надо так:
Код
unsigned int get_code ( unsigned int num_value, unsigned int k )
{
  unsigned long t = num_value;
  t *= k;
  asm ( " nop " );
  asm ( " nop " );
  asm ( " nop " );
  asm ( " nop " );
  return ( t >> 12 );
}


Тогда будет всё в порядке. Кстати, без "nop"-ов тоже будет работать :-)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
cornflyer
сообщение Feb 26 2008, 06:51
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 11-07-06
Из: Dubna
Пользователь №: 18 729



Код
unsigned int get_code ( unsigned int num_value, unsigned int k )
{
  unsigned long t = num_value;
  t *= k;
  return ( t >> 12 );
}


Так работает !!!!!!!!!!!! Ура !!!!!!!!!

P.S. Опять наступил на грабли приведения типов в С...
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 3rd August 2025 - 11:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01409 секунд с 7
ELECTRONIX ©2004-2016