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

 
 
> Скорость выполнения кода на 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, 20:45
Сообщение #2


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

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



Понятно. Это как раз то, чего я не мог понять в диалоге между вами и aaarrr.
Ну удачи вам.
Go to the top of the page
 
+Quote Post
Leonmezon
сообщение Jul 27 2009, 10:45
Сообщение #3


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

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



Цитата(x736C @ Jul 26 2009, 00:45) *
Понятно. Это как раз то, чего я не мог понять в диалоге между вами и aaarrr.
Ну удачи вам.


Время исполнения кода (в симуляторе) снизилось на 31%. (Много времени занимает деление - попробую и его убрать, на сдвиг).
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 27 2009, 13:07
Сообщение #4


Гуру
******

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



Цитата(Leonmezon @ Jul 27 2009, 14:45) *
Время исполнения кода (в симуляторе) снизилось на 31%. (Много времени занимает деление - попробую и его убрать, на сдвиг).

А зачем Вы его (деление) вообще оставили?
Go to the top of the page
 
+Quote Post
Leonmezon
сообщение Jul 27 2009, 16:18
Сообщение #5


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

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



Цитата(aaarrr @ Jul 27 2009, 17:07) *
А зачем Вы его (деление) вообще оставили?

Согласен, деление увеличивает время исполнения в 2 раза:
Начальный вариант: - 2976 циклов;
Мой вариант - 2021 циклов;
Ваш вариант (без деления но в double) - 1000 циклов, впорос в константе KK сколько знаков после запятой оставлять? И второй Kd - может быть тип long - это как то влияет на размер кода (теоретически)?
Вот тестовый файл:
Код
//ICC-AVR application builder : 27.07.2009 20:16:20
// Target : M640
// Crystal: 14.7456Mhz

#include <iom640v.h>
#include <macros.h>

void main(void)
{
   unsigned long A, B, C;
   signed long rez;
   double U, KU, Kd, KK;
   A=128;
   B=25;
   C=55;

// Начальный вариант
   rez=(C+(B<<8)+(A<<16));
   KU=1.077;
   U=(((double)(rez))*20)/0xFFFFFF; // Получаем напряжение от 0 до 20 В
   // Отнимаем 10 В - для сдига в биполярный сигнал - получаем изменение напряжения от -10 до 10В
   U=U-10;
   U=U*KU;
   // Преобразуем в микровольты и возращаем результат
   rez=(signed long)(U*1000000);
    
// Мой вариант
   KU=10770000;
   Kd=8388608;  
    U=(C+(B<<8)+(A<<16));
   // Далее преобразуем с типу double и Преобразуем к напряжению
   U=U/Kd;
   U=U-1;    // Отнимаем 1  - для сдига в биполярный сигнал
   rez=(signed long)(U*KU);  // Изменяем масштаб и преобразуем в микровольты и возращаем результат
  
  
   // Предложенный вариант
  KU=10770000;
  Kd=8388608;
  KK=1.2838840484619140625; // KK=KU/Kd
   U=(C+(B<<8)+(A<<16));
   U -= Kd; // Отнимаем 0x800000  - для сдига в биполярный сигнал
   rez = (signed long)(U*KK); // Изменяем масштаб и преобразуем в микровольты и возращаем результат
  
  while(1)
{;}
  }
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 27 2009, 18:01
Сообщение #6


Гуру
******

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



Цитата(Leonmezon @ Jul 27 2009, 20:18) *
впорос в константе KK сколько знаков после запятой оставлять?

Вам должно быть виднее. На сколько, например, 1.077 отражает реальность? Я бы не стал писать больше пяти.

Цитата(Leonmezon @ Jul 27 2009, 20:18) *
И второй Kd - может быть тип long - это как то влияет на размер кода (теоретически)?

Логично сначала вычесть в целых числах, затем умножить с плавающей запятой.

Код
  Kd=8388608;
  KK=1.2838840484619140625; // KK=KU/Kd
  rez=(C+(B<<8)+(A<<16));
  U = rez - Kd; // Отнимаем 0x800000  - для сдига в биполярный сигнал
  rez = (signed long)(U*KK); // Изменяем масштаб и преобразуем в микровольты и возращаем результат
Go to the top of the page
 
+Quote Post
Leonmezon
сообщение Jul 27 2009, 20:12
Сообщение #7


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

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



Цитата(aaarrr @ Jul 27 2009, 22:01) *
Вам должно быть виднее. На сколько, например, 1.077 отражает реальность? Я бы не стал писать больше пяти.


Логично сначала вычесть в целых числах, затем умножить с плавающей запятой.

Код
  Kd=8388608;
  KK=1.2838840484619140625; // KK=KU/Kd
  rez=(C+(B<<8)+(A<<16));
  U = rez - Kd; // Отнимаем 0x800000  - для сдвига в биполярный сигнал
  rez = (signed long)(U*KK); // Изменяем масштаб и преобразуем в микровольты и возвращаем результат

1. 1,077 отражает разброс С2-29 резисторов в входный аналоговых цепях - расчетное естественно, думаю есть смысл ограничиться 7 знаками (на время не все равно не влияет)
2. Логичнее, да и время выполнения уменьшаться на 21%.
Спасибо.

И все таки хотелось вернуться к первоначальному вопросу:
можно ли уменьшить время выполнения (естественно без учета ожидания флага от UART) кода преобразования и отправки байт по порту в функции void RS232(void) ? (Фактически можно ли как по другому long разбить на 4 байта с большей скоростью и тем же результатам (чтоб не переписывать программу на ЭВМ).

Сообщение отредактировал Leonmezon - Jul 27 2009, 20:16
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
- - 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
|- - 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 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 Текстовая версия Сейчас: 19th July 2025 - 17:44
Рейтинг@Mail.ru


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