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

 
 
> как побороть WinAVR?, и заставить просто скомпиллить как написано
VDV
сообщение Aug 7 2008, 17:01
Сообщение #1


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

Группа: Участник
Сообщений: 152
Регистрация: 18-03-06
Пользователь №: 15 366



написана функция:

volatile int32_t _corr[2 * 8];//result of correlations
volatile uint8_t _corr_index;//index for sample table
int8_t PROGMEM _dtmf_samples[] = {...};

int8_t d = ADCH;
for( uint8_t i = 16; i--; )
{
int16_t mul = d * pgm_read_byte( &_dtmf_samples[_corr_index] );
_corr[i] += mul;
}

в результате генерится совершенно безобразный код.
умножение производится в 32-х битном виде, хотя явно написано умножение 2-х байтов
включена оптимизация O3

если массив объявить как int8_t, то умножение делается для 2-х байтов, но!!!!
используется mul вместо muls (хотя написано, что величины знаковые!!!)
и в результате он зануляет старший байт, даже если идет приведение результата операции к int16_t

как побороть WinAVR?

что хочется:
сделать знаковое умножение 2-х байтов, получить 16-ти битное значение.
затем расширить его до 32-х бит,
сложить с 32-х битной величиной из массива и запомнить в массиве результат.

и еще:
ткните, плиз, носом где понятно написано как делать ассемблерные вставки.
собственно, непонятно, как из асма взять данные из Сишной переменной и в нужную Сишную переменную отдать
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
VDV
сообщение Aug 8 2008, 14:57
Сообщение #2


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

Группа: Участник
Сообщений: 152
Регистрация: 18-03-06
Пользователь №: 15 366



код приведен для пояснения смысла проблемы, а не объяснения работы программы.
ес-но правильный цикл несколько другой.
чем проще код в примере, тем проще понять суть проблемы.

по поводу сдвига, если на асме:
если написать подряд, то получается 6 команд и 6 тактов
если написать цикл, то получается 5 команд и 17 тактов

если скомпиллить O3, получаем 10 команд и 10 тактов
если скомпиллить Os, получаем 9 команд и 21 такт
лишние команды - это пересылки туда-сюда до сдвига и обратно после сдвига (совершенно не понимаю, зачем компиль их делает)

итого:
проигрышь по объему и по скорости от 2-х до почти 4-х раз

Сообщение отредактировал VDV - Aug 8 2008, 14:59
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 8 2008, 16:02
Сообщение #3


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

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



Цитата(VDV @ Aug 8 2008, 20:57) *
проигрышь по объему и по скорости от 2-х до почти 4-х раз


ИМХО, некоторым людям вредно знать ассемблер... Вы посчитайте, сколько циклов у вас есть на выполнение нужной работы, и посмотрите, успеваете ли. Если успеваете - какой смысл горевать по лишним тактам? Если не успеваете - пишите на асме/меняйте компилер/шлифуйте алгоритм.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- VDV   как побороть WinAVR?   Aug 7 2008, 17:01
- - aesok   Цитата(VDV @ Aug 7 2008, 21:01) в результ...   Aug 7 2008, 19:36
- - demiurg_spb   Цитата(VDV @ Aug 7 2008, 21:01) что хочет...   Aug 7 2008, 20:20
- - 777777   Цитата(VDV @ Aug 7 2008, 21:01) ткните, п...   Aug 8 2008, 04:36
|- - AHTOXA   Цитата(777777 @ Aug 8 2008, 10:36) Ассемб...   Aug 8 2008, 05:59
- - aesok   Цитата(VDV @ Aug 7 2008, 21:01) int8_t d ...   Aug 8 2008, 06:37
|- - demiurg_spb   Цитата(aesok @ Aug 8 2008, 10:37) Макрос ...   Aug 8 2008, 07:25
|- - VDV   спасибо за ответы, я ошибся написав, что он делает...   Aug 8 2008, 08:49
|- - aesok   Цитата(VDV @ Aug 8 2008, 12:49) такой код...   Aug 8 2008, 13:04
|- - ReAl   Цитата(VDV @ Aug 8 2008, 11:49) Os оптими...   Aug 8 2008, 13:13
- - VDV   мда.... ни с О3 ни с Os код нормально не генерит т...   Aug 8 2008, 13:39
|- - aesok   Цитата(VDV @ Aug 8 2008, 17:39) блин, а у...   Aug 8 2008, 14:04
|- - VDV   Цитата(aesok @ Aug 8 2008, 18:04) НЕВЕРЮ...   Aug 8 2008, 14:14
|- - aesok   Цитата(VDV @ Aug 8 2008, 18:14) А вот Э...   Aug 8 2008, 14:20
- - _Pasha   Цитата(777777 @ Aug 8 2008, 08:36) Что не...   Aug 9 2008, 08:53


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 01:23
Рейтинг@Mail.ru


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