|
лог некой шины, Как это реализовать более оптимально? |
|
|
|
Jun 29 2011, 14:26
|
Местный
  
Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795

|
Необходимо снять лог некой шины, у которой частота в районе мегагерца. Код простой Код u08 array[1000]; u08* pArr = &array[999]; while(pArr >= array) *pArr-- = PINA; У меня получается приблизительно 18 тактов на цикл. Можно ли это улучшить?
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Jun 29 2011, 16:08
|
Местный
  
Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795

|
Цитата менее чем за 20 тактов не только... Возможно, у Вас размерность массива укладывалась в восемь бит. В любом случае, я далеко не виртуоз в в кодении, посему и прошу совета. На счет стробов и прочего сказать ничего не могу, - для этого и нужно отсканить шину. Под рукой есть только M162 в DIPе (что-б не паяться особо) и макетка с XMEGA128. Но для XMEGи придется мудрить с преобразованием напряжений на входах. Кстати вопрос - а не обидится ли XMEGA, если подать на ее входы пятивольтовые уровни через резисторы с пол килоома? Цитата Я бы попробовал все это на асме переписать На асме я, к сожалению, не потяну, вернее, этот кусок вопросов особых не вызывает, а вот с остальной частью софта застряну на долго. Скомбинировать асм и си не умею. Да и правильно написанный сишный код (имеется ввиду конкретно цикл опроса входов) вряд ли получится оптимизировать на асме.
|
|
|
|
|
Jun 29 2011, 17:49
|
Местный
  
Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795

|
Цитата и не знаю Аналогично. Сам сегодня щупаю впервые. Все, что смог - это запустить от внешнего кварца и "хелло ворлд" на usart отправить.
|
|
|
|
|
Jun 29 2011, 20:34
|
Местный
  
Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795

|
Цитата На асме можно улучшить до 3 тактов. В три такта можно только опросить порт с инкрементом, а в случае с массивом необходимо контролировать его диапазон. Цитата Скачайте компилятор CodeVision Скачал, поглядел. Среда кажется довольно навороченной. С ней самой еще нужно освоиться, откровенно говоря, лениво как-то ради одного, двух сэкономленных тактов да и то может быть. Почему-то я склонен верить, что - Цитата Да и правильно написанный сишный код (имеется ввиду конкретно цикл опроса входов) вряд ли получится оптимизировать на асме. Цитата Как минимум о разрядности и наличии строба вы знать обязаны. К сожалению. На вскидку (сужу по топологии разводки): 8 бит данных, 4 бита адрес, 2строба, 1бит - что-то. Возможно "что-то" и есть строб, а "строба" - выбор R/W. Шина объединяет между собой три микрушки на трех разных платах, одна плата управляет двумя другими. Микрухи - специфические, либо плиски (что мало вероятно), либо заказные. Во всяком случае, даташитов на них нет. Адрес, данные и "что-то" - на всех трех платах. А стробы идут индивидуально, по одному на плату. Но суть топика - это вопрос: как "Правильно" сделать еще правильнее?
|
|
|
|
|
Jun 30 2011, 06:05
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jun 30 2011, 09:48
|
Местный
  
Группа: Участник
Сообщений: 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Файлы в обоих случаях студийные. Ну да ладно, источник проблемы пойман, дальше разберусь. Кардинально. P.S. А в пятой студии свой компилятор? Мой листинг немного другой. Компилятор WinAVR-20100110.
|
|
|
|
|
Jun 30 2011, 15:41
|
Гуру
     
Группа: Участник
Сообщений: 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-битный адрес.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|