|
Скорость выполнения кода на atmega640 |
|
|
|
Jul 24 2009, 11:12
|
Частый гость
 
Группа: Участник
Сообщений: 191
Регистрация: 11-02-09
Из: Краснодар
Пользователь №: 44 686

|
Просьба помочь с функцией отправки байт по RS232 от atmega640 (сама функция полностью работает, но необходимо ускорить ее выполнения (на ассемблер перейти не могу - его не знаю). // Функция передачи данных на ЭВМ по RS232 (масивы B1, B2 - создаю в ОЗУ, передаю по переменно взависимости от флагов. перед массив идут 5 0хF0 - заголовок. Код void RS232(void) { unsigned int i, j; unsigned char data[4]; signed long *p; p=(signed long*)data; flag_BUF=0; if (flag_B2==1) { UDR0 = 0xF0; while ( !( UCSR0A & (1<<UDRE0)) ) { }; UDR0 = 0xF0; while ( !( UCSR0A & (1<<UDRE0)) ) { }; UDR0 = 0xF0; while ( !( UCSR0A & (1<<UDRE0)) ) { }; UDR0 = 0xF0; while ( !( UCSR0A & (1<<UDRE0)) ) { }; UDR0 = 0xF0; while ( !( UCSR0A & (1<<UDRE0)) ) { }; // Преобразуем signed long B1 и в ЭВМ for(i=0; i<600; i++) { *p=B1[i]; for (j=0; j<4; j++) { UDR0 = data[j]; while ( !( UCSR0A & (1<<UDRE0)) ) { }; } } } else { UDR0 = 0xF0; while ( !( UCSR0A & (1<<UDRE0)) ) { }; UDR0 = 0xF0; while ( !( UCSR0A & (1<<UDRE0)) ) { }; UDR0 = 0xF0; while ( !( UCSR0A & (1<<UDRE0)) ) { }; UDR0 = 0xF0; while ( !( UCSR0A & (1<<UDRE0)) ) { }; UDR0 = 0xF0; while ( !( UCSR0A & (1<<UDRE0)) ) { }; // Преобразуем signed long B2 и в ЭВМ for(i=0; i<600; i++) { *p=B2[i]; for (j=0; j<4; j++) { UDR0 = data[j]; while ( !( UCSR0A & (1<<UDRE0)) ) { }; } } } }
Причина редактирования: Оформление цитаты исходника.
|
|
|
|
|
 |
Ответов
|
Jul 25 2009, 16:24
|
Частый гость
 
Группа: Участник
Сообщений: 191
Регистрация: 11-02-09
Из: Краснодар
Пользователь №: 44 686

|
Если вот так записать код, насколько будет быстрее первоначального? (и что еще можно упростить, без применения ухишрений (типа сдвига...). И можно что то сделать с отниманием 1 (или она мало занимает кода). Код const signed int K11=-831; // программный учет смещения в 1 канале 1 АЦП const signed int K12=-999; // программный учет смещения в 2 канале 1 АЦП const double KU=10770000; // коэффициент передачи сигнала в аналоговой части 1.077 умноженный на 1000000х10 const double Kd=8388608; // половина всего диапазона для +-10В - 0xFFFFFF/2 . . // Функция получения данных от 1-го АЦП signed long uzmerenie1(void) { . . . rez=(C+(B<<8)+(A<<16)); /* Далее преобразуем с типу double и преобразуем к напряжению с упрощением операций, конечный результат: напряжение от -10 В до 10 В в микровольтах*/ U=((double)(rez))/Kd; U=U-1; // Отнимаем 1 - для сдига в биполярный сигнал rez=(signed long)(U*KU); // Изменяем масштаб и преобразуем в микровольты и возращаем результат rez=rez-K; //Учитываем смещение в каждом из каналов АЦП: 1К - К11; 2К- К12 return (rez); }
Сообщение отредактировал Leonmezon - Jul 25 2009, 16:26
|
|
|
|
|
Jul 29 2009, 00:18
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Leonmezon @ Jul 25 2009, 19:24)  Если вот так записать код, насколько будет быстрее первоначального? Думаю что ни на сколько. На мой взгляд основной тормоз у вас это блокировка отпраки данных длинным обработчиком INT6 (SPI +вычисления). Если переделать алгоритм работы программы, а именно. 1. передачу по UART сделать по прерыванию. 2. Int6 сделать максимально возможно коротким - только взводить флажек готовности считывания АЦП. 3. Всю галиматью, с вычислениями и считыванием данных с АЦП через SPI, переместить в основной цикл программы. Выполнять ее тогда когда флажек готовности считывать АЦП установлен, после чего сбрасывать этот флажек. Тогда выйдете на максимально возможную скорость, и можно будет думать про оптимизацию математики. Цитата(Leonmezon @ Jul 27 2009, 19:18)  Начальный вариант: - 2976 циклов; Мой вариант - 2021 циклов; Даже начальный вариант с 2971 циклов, с лихвой годится для обработки любого тормозного сигма-дельта АЦП. Банальная арифметка. У Вас 3 АЦП, пусть 1KSPS, тогда всего циклов нужно: 2971 * 3 * 1000 = 8.913M т.е. если будете тактировать МК частотой 14.7456Mhz, МК должен простаивать ~50% времени, даже в первоначальном варианте. У вас же я так понимаю вообще 500SPS. Если же имеют место тормоза, проблема не в нехватке ресурса, не в проце и не в компиляторе, а неправильном распределении ресурса. (программа построена неверно).
|
|
|
|
Сообщений в этой теме
Leonmezon Скорость выполнения кода на atmega640 Jul 24 2009, 11:12 Непомнящий Евгений А зачем вам ускорять скорость ее выполнения? Какая... Jul 24 2009, 11:24 Leonmezon Цитата(Непомнящий Евгений @ Jul 24 2009, 15... Jul 24 2009, 14:17  zltigo Цитата(Leonmezon @ Jul 24 2009, 17:17) 2.... Jul 24 2009, 14:27 aaarrr Переведите работу на прерывания - все равно, на че... Jul 24 2009, 11:38 Непомнящий Евгений я что-то не пойму. Вы не успеваете отправлять со с... Jul 24 2009, 14:30 zltigo Цитата(Непомнящий Евгений @ Jul 24 2009, 17... Jul 24 2009, 14:37 Палыч Цитата(Leonmezon @ Jul 24 2009, 14:12) ..... Jul 24 2009, 15:05 Leonmezon Перерыва в передачи байтов нет (данные принимаются... Jul 24 2009, 15:52 MrYuran Цитата(Leonmezon @ Jul 24 2009, 19:52) фи... Jul 24 2009, 16:03 aaarrr Оптимизацию советую начать отсюда:
КодU=(... Jul 24 2009, 15:59 Leonmezon Цитата(aaarrr @ Jul 24 2009, 19:59) Оптим... Jul 24 2009, 16:12  aaarrr Цитата(Leonmezon @ Jul 24 2009, 20:12) А ... Jul 24 2009, 16:16  MrYuran Цитата(Leonmezon @ Jul 24 2009, 20:12) А ... Jul 24 2009, 16:24   Leonmezon Цитата(MrYuran @ Jul 24 2009, 20:24) U=((... Jul 24 2009, 17:02    aaarrr Цитата(Leonmezon @ Jul 24 2009, 21:02) Пр... Jul 24 2009, 17:22     Leonmezon Цитата(aaarrr @ Jul 24 2009, 21:22) Вы ог... Jul 24 2009, 17:44 aaarrr Да не нужно заниматься ерундой и делить на 1677721... Jul 24 2009, 18:05 Leonmezon Цитата(aaarrr @ Jul 24 2009, 22:05) Да не... Jul 24 2009, 18:14  rezident Цитата(Leonmezon @ Jul 25 2009, 00:14) Ка... Jul 24 2009, 18:41 aaarrr Деление на 16777215 и умножение на 20000000 эквива... Jul 24 2009, 18:40 Leonmezon Цитата(aaarrr @ Jul 24 2009, 22:40) Делен... Jul 24 2009, 18:58  rezident Цитата(Leonmezon @ Jul 25 2009, 00:58) 2.... Jul 24 2009, 19:02   Leonmezon Цитата(rezident @ Jul 24 2009, 23:02) Еру... Jul 24 2009, 19:10    rezident Цитата(Leonmezon @ Jul 25 2009, 01:10) По... Jul 24 2009, 19:25     Leonmezon Цитата(rezident @ Jul 24 2009, 23:25) 150... Jul 24 2009, 19:52 Kuzmi4 2 Leonmezon - откройте секрет - что вы там такое... Jul 24 2009, 21:11 mdmitry На семинаре AD по АЦП специалисты компании утвержд... Jul 24 2009, 21:44 x736C Цена деления 1,2 мкВ при точности ±150 мкВ..
К... Jul 25 2009, 03:25 x736C Я написал просто деление. Дальше в скобках уточнил... Jul 25 2009, 16:54 Leonmezon Цитата(x736C @ Jul 25 2009, 20:48) Я напи... Jul 25 2009, 17:01  x736C 1. Как оцениваете время выполнения функции? Симуля... Jul 25 2009, 17:28   Leonmezon Цитата(x736C @ Jul 25 2009, 21:28) 1. Как... Jul 25 2009, 18:19   aaarrr Цитата(x736C @ Jul 25 2009, 21:28) 2. Рез... Jul 25 2009, 18:23    x736C Цитата(aaarrr @ Jul 25 2009, 22:23) Не бу... Jul 25 2009, 18:43    Leonmezon long long - длиное целое 8 байтовое?
( Если да,... Jul 25 2009, 18:43 aaarrr Цитата(x736C @ Jul 25 2009, 22:43) То ест... Jul 25 2009, 18:48 Leonmezon Цитата(aaarrr @ Jul 25 2009, 22:48) Можно... Jul 25 2009, 19:11  x736C Цитата(Leonmezon @ Jul 25 2009, 23:11) По... Jul 25 2009, 19:24   Leonmezon Цитата(x736C @ Jul 25 2009, 23:24) Понял,... Jul 25 2009, 19:41 x736C Вы сначала написали, что результат не будет коррек... Jul 25 2009, 19:02 aaarrr Цитата(x736C @ Jul 25 2009, 23:24) Такая ... Jul 25 2009, 19:44 Leonmezon Цитата(aaarrr @ Jul 25 2009, 23:44) Дык м... Jul 25 2009, 20:21 x736C Понятно. Запутался слегка.
Из Kd можно убрать лиш... Jul 25 2009, 20:02 x736C Понятно. Это как раз то, чего я не мог понять в ди... Jul 25 2009, 20:45 Leonmezon Цитата(x736C @ Jul 26 2009, 00:45) Понятн... Jul 27 2009, 10:45  aaarrr Цитата(Leonmezon @ Jul 27 2009, 14:45) Вр... Jul 27 2009, 13:07   Leonmezon Цитата(aaarrr @ Jul 27 2009, 17:07) А зач... Jul 27 2009, 16:18    rezident Цитата(Leonmezon @ Jul 27 2009, 22:18) Во... Jul 27 2009, 17:11     Leonmezon Цитата(rezident @ Jul 27 2009, 21:11) А в... Jul 27 2009, 17:39      rezident Цитата(Leonmezon @ Jul 27 2009, 23:39) 3.... Jul 28 2009, 16:01       Leonmezon Цитата(rezident @ Jul 28 2009, 20:01) Есл... Jul 28 2009, 16:24        aaarrr Цитата(Leonmezon @ Jul 28 2009, 20:24) Лу... Jul 28 2009, 16:26         Leonmezon Цитата(aaarrr @ Jul 28 2009, 20:26) Выбро... Jul 28 2009, 16:39    aaarrr Цитата(Leonmezon @ Jul 27 2009, 20:18) вп... Jul 27 2009, 18:01     Leonmezon Цитата(aaarrr @ Jul 27 2009, 22:01) Вам д... Jul 27 2009, 20:12      aaarrr Цитата(Leonmezon @ Jul 28 2009, 00:12) И ... Jul 27 2009, 20:15       Leonmezon Цитата(aaarrr @ Jul 28 2009, 00:15) По ср... Jul 27 2009, 20:19        aaarrr Цитата(Leonmezon @ Jul 28 2009, 00:19) т.... Jul 27 2009, 20:26         Leonmezon Цитата(aaarrr @ Jul 28 2009, 00:26) По ср... Jul 27 2009, 20:54          aaarrr Цитата(Leonmezon @ Jul 28 2009, 00:54) Не... Jul 27 2009, 20:58 aaarrr А может, взять нормальные средства (можно и беспла... Jul 28 2009, 16:47 Leonmezon Цитата(aaarrr @ Jul 28 2009, 20:47) А мож... Jul 28 2009, 16:57  aaarrr Цитата(Leonmezon @ Jul 28 2009, 20:57) AV... Jul 28 2009, 17:07   Leonmezon Цитата(aaarrr @ Jul 28 2009, 21:07) Помен... Jul 28 2009, 17:35 Rst7 ЦитатаНа AVR и ICC свет клином не сошелся, как это... Jul 28 2009, 17:14 aaarrr Цитата(Rst7 @ Jul 28 2009, 21:14) Кстати,... Jul 28 2009, 23:47
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|