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

 
 
> Матрица 8х8 - как заменить столбцы строками ?, требуется БЫСТРЫЙ алгоритм обработки
french
сообщение Mar 10 2008, 12:36
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 21-09-04
Пользователь №: 688



Реальная задача для контроллера Мega128 (CVAVR):
есть две матрицы 8х8 бит - два массива по 8 байт
Код
// здесь какждый байт массива представляет собой столбец матрицы
char Vbuf[1][8] = {... типа данные};
// а этом случае каждый байт массива - это строка
char Hbuf[8][1] = {... типа данные};

в общем данные хранятся примерно так ...
Vbuf[1][8];                 Hbuf[8][1];

0  0  0  0  0  0  0  0     0 1 2 3 4 5 6 7
1  1  1  1  1  1  1  1     0 1 2 3 4 5 6 7
2  2  2  2  2  2  2  2     0 1 2 3 4 5 6 7
3  3  3  3  3  3  3  3     0 1 2 3 4 5 6 7
4  4  4  4  4  4  4  4     0 1 2 3 4 5 6 7
5  5  5  5  5  5  5  5     0 1 2 3 4 5 6 7
6  6  6  6  6  6  6  6     0 1 2 3 4 5 6 7
7  7  7  7  7  7  7  7     0 1 2 3 4 5 6 7

т.е. первый байт Vbuf представляет собой  0-ые биты каждого байта Hbuf
второй байт Vbuf представляет собой 1-ые биты каждого байта Hbuf и т.д....

Требуется преобразовать матрицу Vbuf в Hbuf.

Простейшее решение - побитовое копирование.
В это случае контроллер должен будет сделать (8х8)*(команды извлечения бита + команды копирования бита + куча команд для формиро циклов) операций. В итоге получается АЦКАЯ работа.
В моем случае таких матриц к примеру 80 и обработка занимает порядка 50мс.

Хотелось бы услышать дельные советы бывалых программеров о том как оптимизировать алгоритм (мега тактируестя 20МГц и менять ее на что-то более мощное не возможности). Может стоит по другому организовать хранение данных или есть типовые алгоритмы. Буду рад услышать любой совет !!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
=GM=
сообщение Mar 10 2008, 14:35
Сообщение #2


Ambidexter
*****

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



Цитата(french @ Mar 10 2008, 12:36) *
Реальная задача для контроллера Мega128 (CVAVR): есть две матрицы 8х8 бит - два массива по 8 байт
...
т.е. первый байт Vbuf представляет собой 0-ые биты каждого байта Hbuf, второй байт Vbuf представляет собой 1-ые биты каждого байта Hbuf и т.д. Требуется преобразовать матрицу Vbuf в Hbuf.

Простейшее решение - побитовое копирование.
В это случае контроллер должен будет сделать (8х8)*(команды извлечения бита + команды копирования бита + куча команд для формиро циклов) операций. В итоге получается АЦКАЯ работа.
В моем случае таких матриц к примеру 80 и обработка занимает порядка 50мс.

Хотелось бы услышать дельные советы бывалых программеров о том как оптимизировать алгоритм (мега тактируестя 20МГц и менять ее на что-то более мощное нет возможности). Может стоит по другому организовать хранение данных или есть типовые алгоритмы. Буду рад услышать любой совет !!!!

Разместите 8 байт вашего Vbuf в регистрах r0-r7 и делайте побитное копирование, например, вызывая такую подпрограмму:
Код
getHbyte:
   ror   r0
   ror   r8
   ror   r1
   ror   r8
   ror   r2
   ror   r8
   ror   r3
   ror   r8
   ror   r4
   ror   r8
   ror   r5
   ror   r8
   ror   r6
   ror   r8
   ror   r7
   ror   r8  ;готов n-й байт Hbuf
   ret
забираете готовый байт и повторяете ещё 7 раз. На один байт уйдёт 23МЦ, на одну конвертацию вгрубе уйдёт всего 8*23*0.05=9.2 мкс, на 80 уйдёт 80*9.2=736 мкс, откуда 50 мс?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- french   Матрица 8х8 - как заменить столбцы строками ?   Mar 10 2008, 12:36
- - Rst7   Алгоритм то есть. Не факт, правда, что на AVR он б...   Mar 10 2008, 13:01
- - vet   а цель какова? может, оно и не нужно вовсе, такое ...   Mar 10 2008, 13:03
- - SasaVitebsk   А зачем её поворачивать вообще? При обращении к о...   Mar 10 2008, 20:46
- - kv_addr   Транспонирование матрицы битов: Код b0 b1 b2 b3 ...   Mar 10 2008, 21:02
- - vetal   ЦитатаА зачем её поворачивать вообще? При обращен...   Mar 10 2008, 21:39
|- - kv_addr   Цитата(vetal @ Mar 11 2008, 01:39) +1 Ко...   Mar 10 2008, 22:26
- - Непомнящий Евгений   таблицу соответствия можно использовать - будет бы...   Mar 11 2008, 07:31
- - Rst7   Цитататаблицу соответствия можно использовать - бу...   Mar 11 2008, 07:34
|- - Непомнящий Евгений   Цитата(Rst7 @ Mar 11 2008, 10:34) Это про...   Mar 11 2008, 07:51
- - Rst7   ЦитатаУпс, поспешил. Этот вариант не подходит. Им...   Mar 11 2008, 07:59
|- - singlskv   Цитата(Rst7 @ Mar 11 2008, 10:59) ....., ...   Mar 11 2008, 20:32
- - Непомнящий Евгений   А вариант Код#define TESTBIT(v, n) ( ...   Mar 11 2008, 08:13
- - french   Правильно задать вопрос - пол проблемы решить ...   Mar 11 2008, 09:13
|- - kv_addr   Цитата(french @ Mar 11 2008, 13:13) класс...   Mar 11 2008, 10:11
- - Rst7   Цитатано пишу на Си, регистры все заняты компилято...   Mar 11 2008, 10:11
- - french   ЦитатаНапишите именно эту процедуру на ассемблере....   Mar 11 2008, 10:34
- - Rst7   Ну и зачем его хранить в горизонтальном виде? Хран...   Mar 11 2008, 10:38
- - french   в том то и фикус , что я все делаю в вертикальном...   Mar 11 2008, 10:43
- - Rst7   Так делайте в горизонтальном, не сильно то много р...   Mar 11 2008, 10:49
- - french   ЦитатаА вообще, было бы неплохо огласить, че за ус...   Mar 11 2008, 12:02
- - Rst7   ЦитатаКак максимально быстро скопировать бит. Моя...   Mar 11 2008, 12:48
- - Rst7   ЦитатаНеа, судя по всему сдвиги будут рулить и на ...   Mar 12 2008, 06:13
- - CDT   Что - то трудно понимаемое. Вы на выходной порт вс...   Mar 14 2008, 12:11


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

 


RSS Текстовая версия Сейчас: 19th August 2025 - 14:15
Рейтинг@Mail.ru


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