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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> лог некой шины, Как это реализовать более оптимально?
Sirko
сообщение Jun 29 2011, 14:26
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Необходимо снять лог некой шины, у которой частота в районе мегагерца.
Код простой
Код
u08 array[1000];
u08* pArr = &array[999];
while(pArr >= array)
    *pArr-- = PINA;
У меня получается приблизительно 18 тактов на цикл. Можно ли это улучшить?
Go to the top of the page
 
+Quote Post
galjoen
сообщение Jun 29 2011, 14:54
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(Sirko @ Jun 29 2011, 18:26) *
У меня получается приблизительно 18 тактов на цикл

Странно. У меня, насколько я помню т.к. было очень давно, менее чем за 20 тактов не только байт в лог писался, но и CRC32 от него считалось. Тоже поток мегабайт в секунду шёл и 20 мГц процессор успевал.
Go to the top of the page
 
+Quote Post
kovigor
сообщение Jun 29 2011, 15:00
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(Sirko @ Jun 29 2011, 17:26) *
У меня получается приблизительно 18 тактов на цикл. Можно ли это улучшить?


А есть у этой шины строб ? И какая у шины разрядность, и куда лог пишете ? Во внешнее ОЗУ ? Я бы попробовал все это на асме переписать. По идее, все должно получиться ...
Go to the top of the page
 
+Quote Post
Sirko
сообщение Jun 29 2011, 16:08
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Цитата
менее чем за 20 тактов не только...
Возможно, у Вас размерность массива укладывалась в восемь бит. В любом случае, я далеко не виртуоз в в кодении, посему и прошу совета.

На счет стробов и прочего сказать ничего не могу, - для этого и нужно отсканить шину.
Под рукой есть только M162 в DIPе (что-б не паяться особо) и макетка с XMEGA128. Но для XMEGи придется мудрить с преобразованием напряжений на входах. Кстати вопрос - а не обидится ли XMEGA, если подать на ее входы пятивольтовые уровни через резисторы с пол килоома?

Цитата
Я бы попробовал все это на асме переписать

На асме я, к сожалению, не потяну, вернее, этот кусок вопросов особых не вызывает, а вот с остальной частью софта застряну на долго. Скомбинировать асм и си не умею. Да и правильно написанный сишный код (имеется ввиду конкретно цикл опроса входов) вряд ли получится оптимизировать на асме.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jun 29 2011, 16:10
Сообщение #5


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Sirko @ Jun 29 2011, 13:26) *
Можно ли это улучшить?

На асме можно улучшить до 3 тактов.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 29 2011, 17:37
Сообщение #6


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



У xMega есть DMA...
Правда xMega живьём не видел и не знаю можно-ли настроить DMA на чтение из порта.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Sirko
сообщение Jun 29 2011, 17:49
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Цитата
и не знаю
Аналогично.

Сам сегодня щупаю впервые. Все, что смог - это запустить от внешнего кварца и "хелло ворлд" на usart отправить.
Go to the top of the page
 
+Quote Post
kovigor
сообщение Jun 29 2011, 18:35
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(Sirko @ Jun 29 2011, 20:49) *
Сам сегодня щупаю впервые. Все, что смог - это запустить от внешнего кварца и "хелло ворлд" на usart отправить.


Слишком мало данных о шине. Как минимум о разрядности и наличии строба вы знать обязаны.

По поводу асма. Скачайте компилятор CodeVision, он генерит очень понятный асм - файл. Найдите там нужную процедурку и вручную ее оптимизируйте, после чего этот асм-файл компильните. Только не забудьте в опциях включить оптимизацию по времени выполнения. И все ...

Сообщение отредактировал kovigor - Jun 29 2011, 18:36
Go to the top of the page
 
+Quote Post
Sirko
сообщение Jun 29 2011, 20:34
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Цитата
На асме можно улучшить до 3 тактов.
В три такта можно только опросить порт с инкрементом, а в случае с массивом необходимо контролировать его диапазон.

Цитата
Скачайте компилятор CodeVision
Скачал, поглядел. Среда кажется довольно навороченной. С ней самой еще нужно освоиться, откровенно говоря, лениво как-то ради одного, двух сэкономленных тактов да и то может быть.
Почему-то я склонен верить, что -
Цитата
Да и правильно написанный сишный код (имеется ввиду конкретно цикл опроса входов) вряд ли получится оптимизировать на асме.


Цитата
Как минимум о разрядности и наличии строба вы знать обязаны.
К сожалению.
На вскидку (сужу по топологии разводки): 8 бит данных, 4 бита адрес, 2строба, 1бит - что-то.
Возможно "что-то" и есть строб, а "строба" - выбор R/W.
Шина объединяет между собой три микрушки на трех разных платах, одна плата управляет двумя другими. Микрухи - специфические, либо плиски (что мало вероятно), либо заказные. Во всяком случае, даташитов на них нет.
Адрес, данные и "что-то" - на всех трех платах.
А стробы идут индивидуально, по одному на плату.

Но суть топика - это вопрос: как "Правильно" сделать еще правильнее?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 30 2011, 04:32
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Sirko @ Jun 29 2011, 18:26) *
У меня получается приблизительно 18 тактов на цикл. Можно ли это улучшить?
Цифра в 18 тактов показалась мне неоправданно большой. Решил перепроверить Ваши данные. Оттранслировал Вашу программу в IAR 5.51 и получил 9 тактов на цикл - очень даже приемлемый результат, который вряд ли удастся улучшить.
Go to the top of the page
 
+Quote Post
V_G
сообщение Jun 30 2011, 05:02
Сообщение #11


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

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Цитата(demiurg_spb @ Jun 30 2011, 04:37) *
У xMega есть DMA...
Правда xMega живьём не видел и не знаю можно-ли настроить DMA на чтение из порта.

Можно.
DMA читает с заданного адреса источника (с включенным или выключенным автоинкрементом) и пишет в заданный адрес назначения (с включенным или выключенным автоинкрементом). Т.к. все порты имеют адрес в памяти, то чтение из порта через DMA идет без проблем.
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Jun 30 2011, 06:05
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Цитата
У меня получается приблизительно 18 тактов на цикл. Можно ли это улучшить?


Откомпилировал в AVRStudio5. Посмотрел листинг:

Код
in    r18, 0x19
st    -Z, r18
cp    r30, r24
cpc    r31, r25
brne    .-10


Цикл занимает 5 команд, да еще инициализация регистров - 4 команды. Вполне нормально. На асме можно убрать одну команду если только использовать размер массива не более 256
Go to the top of the page
 
+Quote Post
Sirko
сообщение Jun 30 2011, 09:48
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Странновато как-то:
Попробовал на ноуте скомпилить.
Получилось
Код
IN    R24, 0x19
STD    Z+0, R24
SBIW    R30, 0x01
CP    R30, R28
CPC    R31, R29
BRNE    PC-0x05


Выполняется за девять тактов проца. Результат очень таки разнится с прошлым вариантом.
И студия и компилятор на обоих компах одинаковые, оптимизация -0S, MakeФайлы в обоих случаях студийные.

Ну да ладно, источник проблемы пойман, дальше разберусь. Кардинально. smile3009.gif

P.S. А в пятой студии свой компилятор?
Мой листинг немного другой.
Компилятор WinAVR-20100110.

Go to the top of the page
 
+Quote Post
=GM=
сообщение Jun 30 2011, 13:09
Сообщение #14


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Sirko @ Jun 29 2011, 19:34) *
В три такта можно только опросить порт с инкрементом, а в случае с массивом необходимо контролировать его диапазон

Ну, тут вы немного погорячились. Для 1000 отсчётов нужно развернуть цикл и повторить 1000 раз фрагмент "прочитать порт в регистр + сохранить регистр с автоинкрементом". Вот вам три такта и будет.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Jun 30 2011, 15:41
Сообщение #15


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(alexeyv @ Jun 30 2011, 10:05) *
Откомпилировал в AVRStudio5. Посмотрел листинг:

Код
in    r18, 0x19
st    -Z, r18
cp    r30, r24
cpc    r31, r25
brne    .-10


Цикл занимает 5 команд, да еще инициализация регистров - 4 команды. Вполне нормально. На асме можно убрать одну команду если только использовать размер массива не более 256

Или кратно 256 и буфер на границе. 5 команд - но 7 тактов (или 6, если контроль на 1 байт). Однако вполне можно сократить до 5 тактов, причем с контролем на 16-битный адрес.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 09:51
Рейтинг@Mail.ru


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