|
как побороть WinAVR?, и заставить просто скомпиллить как написано |
|
|
|
Aug 7 2008, 17:01
|
Частый гость
 
Группа: Участник
Сообщений: 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-х битной величиной из массива и запомнить в массиве результат.
и еще: ткните, плиз, носом где понятно написано как делать ассемблерные вставки. собственно, непонятно, как из асма взять данные из Сишной переменной и в нужную Сишную переменную отдать
|
|
|
|
|
 |
Ответов
|
Aug 8 2008, 14:57
|
Частый гость
 
Группа: Участник
Сообщений: 152
Регистрация: 18-03-06
Пользователь №: 15 366

|
код приведен для пояснения смысла проблемы, а не объяснения работы программы. ес-но правильный цикл несколько другой. чем проще код в примере, тем проще понять суть проблемы.
по поводу сдвига, если на асме: если написать подряд, то получается 6 команд и 6 тактов если написать цикл, то получается 5 команд и 17 тактов
если скомпиллить O3, получаем 10 команд и 10 тактов если скомпиллить Os, получаем 9 команд и 21 такт лишние команды - это пересылки туда-сюда до сдвига и обратно после сдвига (совершенно не понимаю, зачем компиль их делает)
итого: проигрышь по объему и по скорости от 2-х до почти 4-х раз
Сообщение отредактировал VDV - Aug 8 2008, 14:59
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|