roboforum.ru

Технический форум по робототехнике.
Текущее время: 21 май 2025, 10:35

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 88 ]  На страницу 1, 2, 3, 4, 5, 6  След.
Автор Сообщение
 Заголовок сообщения: TV-AVR
СообщениеДобавлено: 20 сен 2011, 14:27 
Не в сети
Аватара пользователя

Зарегистрирован: 15 ноя 2010, 13:56
Сообщения: 996
Откуда: Нижний Новгород
прог. языки: С, С++, РНР
Столкнулся с проблемой.

мне нужно выполнить критичный ко времени исполнения код вида:
Код:
PORTB.7=(*buffer) & 0b00001000;

Проблема в том, что время его выполнения сильно различается когда соответствующий бит в буфере равен 0 или 1, а мне надо что-бы было одинаково. Уже всю голову сломал :(

Может что подскажете?


Последний раз редактировалось HarryStar 24 фев 2012, 14:59, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время выполнения PORTB.1 = ...
СообщениеДобавлено: 20 сен 2011, 14:44 
Не в сети
Аватара пользователя

Зарегистрирован: 06 окт 2004, 18:01
Сообщения: 24218
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов
А как измеряли, что время выполнения отличается?

_________________
Проект [[Open Robotics]] - Универсальные модули для построения роботов


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время выполнения PORTB.1 = ...
СообщениеДобавлено: 20 сен 2011, 14:49 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
в симуляторе наверняка. Оно наверно и должно отличаться.

так попробуйте, может чуть поровней будет.
Код:
PORTB.7 = 0b00001000 & (*buffer);


Можно листинг АСМ посмотреть на отличие.

_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время выполнения PORTB.1 = ...
СообщениеДобавлено: 20 сен 2011, 15:07 
Не в сети
Аватара пользователя

Зарегистрирован: 15 ноя 2010, 13:56
Сообщения: 996
Откуда: Нижний Новгород
прог. языки: С, С++, РНР
В симуляторе не смотрел, оно на глаз отличается. Это для генерации видеосигнала.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время выполнения PORTB.1 = ...
СообщениеДобавлено: 20 сен 2011, 15:10 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Глаз АЛМАЗ!

_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время выполнения PORTB.1 = ...
СообщениеДобавлено: 20 сен 2011, 15:10 
Не в сети
Аватара пользователя

Зарегистрирован: 10 дек 2010, 13:16
Сообщения: 4995
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей
Можа оптимизация какая-то???

_________________
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время выполнения PORTB.1 = ...
СообщениеДобавлено: 20 сен 2011, 15:19 
Не в сети
Аватара пользователя

Зарегистрирован: 15 ноя 2010, 13:56
Сообщения: 996
Откуда: Нижний Новгород
прог. языки: С, С++, РНР
Нет, тоже самое.
Вот выдержка из асма
Код:
;        PORTB.7=0b00100000 & (*(lvideo+1)); PIXEL_SIZE1b
   MOVW R30,R10
   LDD  R30,Z+1
   ANDI R30,LOW(0x20)
   BRNE _0x18
   CBI  0x18,7
   RJMP _0x19
_0x18:
   SBI  0x18,7
_0x19:
   nop


Там не глаз-алмаз, там получается что черный пиксель больше, чем белый. Пока выводил вертикальные полосочки, все было ок, как произвольное изображение - тут же заметно стало. Полностью черная строка длиннее белой на 10%.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время выполнения PORTB.1 = ...
СообщениеДобавлено: 20 сен 2011, 15:39 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Наверно надо АСМ вставкой оформить и более быструю часть дополнить НОП-ами.

_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время выполнения PORTB.1 = ...
СообщениеДобавлено: 20 сен 2011, 15:53 
Не в сети
Аватара пользователя

Зарегистрирован: 15 ноя 2010, 13:56
Сообщения: 996
Откуда: Нижний Новгород
прог. языки: С, С++, РНР
В том и проблема что оч слабо разбираюсь в ассемблере, хотелось бы по возможности все на си.
Пробовал просто алгоритм сменить...
Идеальным решением было бы из массива в 16 байт все биты превратить в байты.
Т.е. например для одного байта
Код:
    lineram[16] = ((*(lvideo+2)) & 0b10000000)<<0;
    lineram[17] = ((*(lvideo+2)) & 0b01000000)<<1;
    lineram[18] = ((*(lvideo+2)) & 0b00100000)<<2;
    lineram[19] = ((*(lvideo+2)) & 0b00010000)<<3;
    lineram[20] = ((*(lvideo+2)) & 0b00001000)<<4;
    lineram[21] = ((*(lvideo+2)) & 0b00000100)<<5;
    lineram[22] = ((*(lvideo+2)) & 0b00000010)<<6;
    lineram[23] = ((*(lvideo+2)) & 0b00000001)<<7;

Но 16 байт таким образом очень долго преобразуются, нужно уложится в 12 мс примерно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время выполнения PORTB.1 = ...
СообщениеДобавлено: 20 сен 2011, 16:16 
Не в сети
Аватара пользователя

Зарегистрирован: 06 окт 2004, 18:01
Сообщения: 24218
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов
Странно, а симулятор разное количество тактов показывает или нет?

_________________
Проект [[Open Robotics]] - Универсальные модули для построения роботов


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время выполнения PORTB.1 = ...
СообщениеДобавлено: 20 сен 2011, 16:23 
Не в сети
Аватара пользователя

Зарегистрирован: 07 окт 2009, 00:29
Сообщения: 6028
Откуда: СПб
HarryStar писал(а):
Т.е. например для одного байта
Код:
    lineram[16] = ((*(lvideo+2)) & 0b10000000)<<0;

Но 16 байт таким образом очень долго преобразуются, нужно уложится в 12 мс примерно.


Наверняка так быстрее:
lineram[5] = 0x00; if (lvideo&0b00010000) lineram[5] = 0x80;

Но вообще перекладывать из массива в массив - зло.
Вы таким образом гробите и память и быстродействие.


Последний раз редактировалось Michael_K 21 сен 2011, 00:44, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время выполнения PORTB.1 = ...
СообщениеДобавлено: 20 сен 2011, 16:44 
Не в сети
Аватара пользователя

Зарегистрирован: 06 окт 2004, 18:01
Сообщения: 24218
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов
Можно по полубайту готовый массив из 16 выбирать и выводить :)

_________________
Проект [[Open Robotics]] - Универсальные модули для построения роботов


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время выполнения PORTB.1 = ...
СообщениеДобавлено: 20 сен 2011, 20:53 
Не в сети
Аватара пользователя

Зарегистрирован: 15 ноя 2010, 13:56
Сообщения: 996
Откуда: Нижний Новгород
прог. языки: С, С++, РНР
Michael_K писал(а):
Наверняка так быстрее:

Попробую завтра утром, но что-то сомневаюсь, что условие и ветвление быстрее, чем присваивание
Michael_K писал(а):
Но вообще перекладывать из массива в массив - зло.
Вы таким образом гробите и память и быстродействие.

Вывод видео специфическая задача. Во время прохода строки времени очень мало, чтобы делать даже простейшие расчеты, а вот между строками есть 12 мс, во время которых можно подготовить данные для следующей строки. Если 1 точка = 1 байт, то вывод очень быстрый - практически можно сделать любое разрешение, главное подготовить одну строку-буфер. Без этого у меня получилось 2 режима: 32 х 32 х 8бит и 32 х 32 х 4бита. Дальше пробую 128 х 64 х 1 бит, но вот столкнулся с этой проблемой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время выполнения PORTB.1 = ...
СообщениеДобавлено: 20 сен 2011, 23:29 
Не в сети

Зарегистрирован: 27 авг 2011, 14:05
Сообщения: 47
У вас же SPI по сути, почему его не использовать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время выполнения PORTB.1 = ...
СообщениеДобавлено: 21 сен 2011, 01:50 
Не в сети
Аватара пользователя

Зарегистрирован: 07 окт 2009, 00:29
Сообщения: 6028
Откуда: СПб
HarryStar писал(а):
что-то сомневаюсь, что условие и ветвление быстрее, чем присваивание

У вас там не присваивание, а маска и сдвиг.

А условие и ветвление возможно будут такими (от оптимизатора зависит)

Код:
lds  in, (in_array+2) - один раз для каждого входного байта
ldi  out,0x00
sbrs in,5
ldi  out,0x80
sts  (out_array+18), out


HarryStar писал(а):
Вывод видео специфическая задача. Во время прохода строки времени очень мало

Далаадна... С вашими-то разрешениями да современными процами :wink:

Flexz писал(а):
У вас же SPI по сути, почему его не использовать?

+1. Если между знакоместами допустимы промежутки, то удобно использовать SPI

У вас какой процессор и кварц?

Добавлено спустя 1 час 7 минут 49 секунд:
Сейчас попробовал написать. (Вслепую. Не отлаживал и не собираюсь :))
Использует знакогенератор символов из флэш. Частота вывода пикселей - 5Мгц (при кварце 20). 32 символа в строке (256 пикселей). Это примерно 51 с чем-то микросекунды. В начале строки выводится один лишний пиксель (черный).
Недостаток - занимает весь порт, но использует только младшую ногу порта (так проще).
Код:
init:   
   ; Тут сохраняем регистры, если надо, выравниваем времена и т.п.
   ; в ZH кладем адрес нужной строки знакогенератора
   ; в Y кладем адрес экранного буфера

   ldi   cnt,32   ; в cnt кладем число символов в строке
   ldi   sh1,0   ; в sh1 кладем нолик, это "лишний" бит - он будет черный.
   rjmp   entry   ; Поехали

loop:   out   sh1   ;1===   Седьмой
   lsr   sh1   ;1
entry:   ld   ZL,Y+   ;2   Берем код символа из экранного буфера
   out   sh1   ;1===   Выводим последний бит (сразу после входа - черный)
   lpm   tmp,Z   ;3   Берем нужный байт из знакогенератора
   out   tmp   ;1===   Сразу выводим первый бит
   mov   sh1,tmp   ;1   Перекидываем в "сдвиговый регистр"...
   lsr   sh1   ;1   ...и сдвигаем
   nop      ;1
   out   sh1   ;1===   Выводим второй бит
   lsr   sh1   ;1   ...и сдвигаем
   nop      ;1
   nop      ;1
   out   sh1   ;1===   Третий
   lsr   sh1   ;1
   nop      ;1
   nop      ;1
   out   sh1   ;1===   Четвертый
   lsr   sh1   ;1
   nop      ;1
   nop      ;1
   out   sh1   ;1===   Пятый бит
   lsr   sh1   ;1   сдвигаем
   mov   tmp,sh1   ;1   запоминаем результат  в tmp
   lsr   sh1   ;1   и сразу сдвигаем еще раз, чтобы потом быстро вывести
   out   tmp   ;1===   Шестой бит из tmp
   dec   cnt   ;1   Есть еще байты?
   brne   loop   ;2   Если да, зацикливаемся

   nop      ;1
   out   sh1   ;1===   Седьмой бит последнего символа в строке
   lsr   sh1   ;1
   nop      ;1
   nop      ;1
   out   sh1   ;1===   Последний бит последнего символа в строке

   ; Можно добавить инкремент строки знакогенератора, экранного буфера, подсчет строк, времени и т.п.
   ; Тут восстанавливаем регистры, если надо


Кучу нопов... можно занять чем-нибудь "полезным" :)


Последний раз редактировалось Michael_K 22 сен 2011, 12:38, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 88 ]  На страницу 1, 2, 3, 4, 5, 6  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO