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

 
 
> Скорость выполнения кода на atmega640
Leonmezon
сообщение Jul 24 2009, 11:12
Сообщение #1


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

Группа: Участник
Сообщений: 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)) ) { };
           }
     }      
}
}
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
x736C
сообщение Jul 25 2009, 16:54
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942



Я написал просто деление. Дальше в скобках уточнил, что процедура деления в вашем случае достаточно быстрая.
Не надо рассматривать это, как ухищрение.
Не приводите перед делением rez к типу double. У вас абсолютно целочисленное деление на (2^23 - 1).
Все в signed long.

Напишите, пожалуйста, позже в теме, насколько уменьшилось время выполнения процедуры. Интересно.
На какой частоте работает контроллер?

Цитата(Leonmezon @ Jul 25 2009, 20:24) *
И можно что то сделать с отниманием 1 (или она мало занимает кода).

Думаю, что это не тот случай, чтоб оптимизировать вычитание единицы. Оставьте так smile.gif

Сообщение отредактировал x736C - Jul 25 2009, 16:57
Go to the top of the page
 
+Quote Post
Leonmezon
сообщение Jul 25 2009, 17:01
Сообщение #3


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

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



Цитата(x736C @ Jul 25 2009, 20:48) *
Я написал просто деление. Дальше в скобках уточнил, что процедура деления в вашем случае достаточно быстрая.
Не надо рассматривать это, как ухищрение.
Не переводите перед делением rez к типу double. У вас абсолютно целочисленное деление на (2^23 - 1).
Все в signed long.

Напишите, пожалуйста, позже в теме, насколько уменьшилось время выполнения процедуры. Интересно.
На какой частоте работает контроллер?

1. По времени - попробую на работ- напишу. (Хотя тяжело точно отследить - примерно будет только).
2. В целочисленных нельзя (правда я не уверен - как на самом деле будет происходить преобразования типов: сначала результат, потом преобразование или нет): U=rez/Kd - если rez и Kd целочисленные - то результат будет 0 при rez<Kd?
3. Частота 14,... МГц - хотя сейчас думаю перевести на Xmega - с частотой 14,...х2 = 28,.. МГц (в теме Xmega писал уже)
4. В принципе и сейчас все работает (и очень хорошо),но появился датчик (с собственным шумом 300 нВ) и для работы с ним планирую сделать запас времени, чтобы сняв 200 выборок за 1 сек прогнать через простой режекторный цифровой фильтр в микроконтроллере (повысить точность измерений) - для этого и еще как бы выиграть еще время, т.е. перед отправкой буфера (2400 байт) по RS232 успеть 200-300 мс прогнать через фильтр. (Фильтр пишу не я - человек на них собаку съел - но просит запас по времени на работу фильтра)
Go to the top of the page
 
+Quote Post
x736C
сообщение Jul 25 2009, 17:28
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942



1. Как оцениваете время выполнения функции? Симулятор не может посчитать?
2. Результат будет правильным. Типы менять туда-сюда не надо в вашем случае.
3. 28 — огромная частота smile.gif
4.1. Если вы поверите в прерывания, то сможете многое выполнять параллельно. Например, работать с данными и отсылать их одновременно, выполняя что-то третье.
4.2. 200-300 мс — огромное время smile.gif
4.3. 1 сек — cranky.gif

«..200 выборок за 1 сек прогнать через...»
«...успеть 200-300 мс прогнать через...»
Сколько в итоге?

Если не секрет, какого рода данные с датчика? Что-то периодичное? Почему такие точности?


P. S. Неужели ассемблер окончательно отмирает unsure.gif

Сообщение отредактировал x736C - Jul 25 2009, 17:29
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 25 2009, 18:23
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(x736C @ Jul 25 2009, 21:28) *
2. Результат будет правильным. Типы менять туда-сюда не надо в вашем случае.

Не будет.

Цитата(x736C @ Jul 25 2009, 21:28) *
P. S. Неужели ассемблер окончательно отмирает unsure.gif

Ну и причем тут ассемблер?

2 Leonmezon:

Во-первых, 24-х значащих бит у Вас не будет никогда, просто примите это как данность. Во-вторых сдвиг является не "ухищрением",
а нормальным методом деления и умножения на степень двойки. И освойте тип long long.

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

Хотя и это дикий маразм, т.к. я уверен, что и 1.077 и (10000000 / 8388608) можно упихать в один восьмибитный коэффициент,
оставшись при этом в пределах 32-х битной арифметики, безо всякого ущерба для конечного результата.
Go to the top of the page
 
+Quote Post
Leonmezon
сообщение Jul 25 2009, 18:43
Сообщение #6


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

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



long long - длиное целое 8 байтовое?
( Если да, то у меня только до 4 байт).
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
- - Leonmezon   Если вот так записать код, насколько будет быстрее...   Jul 25 2009, 16:24
|- - defunct   Цитата(Leonmezon @ Jul 25 2009, 19:24) Ес...   Jul 29 2009, 00:18
|- - Leonmezon   Цитата(x736C @ Jul 25 2009, 21:28) 1. Как...   Jul 25 2009, 18:19
|- - x736C   Цитата(aaarrr @ Jul 25 2009, 22:23) Не бу...   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


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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 02:45
Рейтинг@Mail.ru


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