|
веерная перетасовка бит в переменной Cortex M0 |
|
|
|
Feb 26 2016, 14:27
|
Местный
  
Группа: Участник
Сообщений: 257
Регистрация: 10-06-06
Из: Ставрополь
Пользователь №: 17 955

|
Все по той же матрично-светодидной теме -> Есть 32-битная переменная ,Надо ее преобразовать так (ниже номера бит) Было: 00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,12,21,22,23,24,25,26 ,27,28,29,30,31 Стало: хх,хх, 00,06,11,16,22,27,01,07,12,17,23,28,02,08,13,18,24,29,03,09,14,19,25,30,04,10,15 ,20,26,31 Тактов на все про все не больше 60-70 ... В лоб занимает > 200, табличный вариант оставил на крайний случай. Может есть какой-то хитрый метод ? В принципе задача сводится к пяти преобразованиям типа : ABCDxxxxxxx,,, в A00000B00000C00000D00000... где A-D это биты, с последующим суммированием . ps увы, в системе команд STM32F0 с битовыми операциями не густо и битбандинга нет
Сообщение отредактировал sherr - Feb 26 2016, 14:34
|
|
|
|
|
 |
Ответов
|
Feb 26 2016, 15:44
|
Местный
  
Группа: Участник
Сообщений: 257
Регистрация: 10-06-06
Из: Ставрополь
Пользователь №: 17 955

|
Цитата(jcxz @ Feb 26 2016, 18:34)  PS: Только что в голову пришёл самый быстрый метод - в зависимости от функционирования GPIO в Вашем МК, этот метод вообще может занимать всего пару тактов Выделяете 2-а 32-битных порта GPIO. Соединяете вых. линии первого порта с вх. линиями второго в соответствии с таблицей перестановки бит, выводите слово в первый порт, считываете со второго. На ядре M3 этот алгоритм может занимать всего два такта, если GPIO сидит на быстрой шине. Гениально ! Да только ног свободных столько нету... Цитата(jcxz @ Feb 26 2016, 18:08)  А почему такое неприятие табличного метода??? Просто быстро и универсально. Я плохо знаю систему команд M0, но думаю займёт тактов 20 примерно. И по памяти можно уложиться в 4 кБ флеша (хотя, если есть МНОГО памяти, можно за счёт неё ещё неск. тактов выиграть наверное). Там вообще-то минимум 32*6 32-битных слов в таблице - это и в ОЗУ влезет если надо,,,,
Сообщение отредактировал sherr - Feb 26 2016, 16:00
|
|
|
|
|
Feb 26 2016, 18:01
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(sherr @ Feb 26 2016, 18:44)  Там вообще-то минимум 32*6 32-битных слов в таблице - это и в ОЗУ влезет если надо,,,, Это как считали? У меня получается 16 32-битных слов. Пример 16-битный легко переделать в 32 бита. Исходное число: A1, B1, C1, D1, A2, B2, C2, D2, A3, B3, C3, D3, A4, B4, C4, D4. Результат: A1, A2, A3, A4, B1, B2, B3, B4, C1, C2, C3, C4, D1, D2, D3, D4. 0. Обнуляем результат. 1. Сдвигаем исходное число вправо на (16 - 4 * (1 + 0)) разрядов и делаем AND с 15. 2. Получаем A1 B1 C1 D1. 3. Используем как индекс в таблице и получаем из таблицы A1, 0, 0, 0, B1, 0, 0, 0, C1, 0, 0, 0, D1, 0, 0, 0. 4. Сдвигаем на 0 вправо и делаем OR с результатом. 5. Сдвигаем исходное число вправо на (16 - 4 * (1 + 1)) разрядов и делаем AND с 15. 6. Получаем A2 B2 C2 D2. 7. Используем как индекс в таблице и получаем из таблицы A2, 0, 0, 0, B2, 0, 0, 0, C2, 0, 0, 0, D2, 0, 0, 0. 8. Сдвигаем на 1 вправо и делаем OR с результатом. 9. Повторяем сдвиг на (16 - 4 * (1 + n)) исходного числа с последующим AND 15 и извлечением из таблицы. Данные из таблицы сдвигаем на n и делаем OR с результатом. Для n=2 и n=3. 10. В результате получаем то, что требовалось.
|
|
|
|
Сообщений в этой теме
sherr веерная перетасовка бит в переменной Cortex M0 Feb 26 2016, 14:27 jcxz Цитата(sherr @ Feb 26 2016, 20:27) Тактов... Feb 26 2016, 15:08 one_eight_seven ЦитатаНа ядре M3 этот алгоритм может занимать всег... Feb 26 2016, 19:35 adnega Сделал.
На картинке:
1 строка - входные биты
2 стр... Feb 26 2016, 19:46 sherr Цитата(adnega @ Feb 26 2016, 22:46) Сдела... Feb 26 2016, 20:26 scifi Цитата(sherr @ Feb 26 2016, 17:27) В прин... Feb 27 2016, 10:10 sherr А подскажите, как обратное преобразование сдел... Mar 4 2016, 05:57  adnega Цитата(sherr @ Mar 4 2016, 08:57) А подск... Mar 4 2016, 07:38   AlexRayne Цитата(adnega @ Mar 4 2016, 10:38) Побито... Mar 4 2016, 08:30
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|