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

 
 
 
Reply to this topicStart new topic
> SAM3 SPI поменять порядок бит
Aal6
сообщение Jan 22 2013, 16:29
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 2-03-06
Пользователь №: 14 880



Озадачен невозможностью сменить порядок вывод битов по SPI c MSB->LSB наоборот.

Нет какой-либо возможности быстро перекинуть биты в байте без пересчета софтом?

В задаче нужно загружать буфер со сменой направления отображения, порядка 8МБит/с. Усугубляет проблему не умение PDC выдавать данные с декрементом указателя.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jan 22 2013, 17:00
Сообщение #2


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Aal6 @ Jan 22 2013, 18:29) *
Озадачен невозможностью сменить порядок вывод битов по SPI c MSB->LSB наоборот.
Нет какой-либо возможности быстро перекинуть биты в байте без пересчета софтом?


Две команды на разворот битов одновремённо в 4 байтах либо в двух 16-битных словах (если второй командой сделать циклический сдвиг, а не логический).
Где-то тут уже было на эту тему для Cortex-M3


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Aal6
сообщение Jan 22 2013, 21:31
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 2-03-06
Пользователь №: 14 880



Спасибо! Очень выручили.
Лучше чем биты строить.
Go to the top of the page
 
+Quote Post
Aal6
сообщение Jan 23 2013, 12:53
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 2-03-06
Пользователь №: 14 880



А нет возможности посчитать биты в слове без циклических проверок?
Очень бы пригодилось. Сейчас завел на clk таймера сигнал с sck&data SPI, но лучше бы заранее знать кол-во 1 в данных. Это улучшило бы алгоритм.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jan 23 2013, 13:33
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(ReAl @ Jan 22 2013, 21:00) *
Где-то тут уже было на эту тему для Cortex-M3

да-да sm.gif
http://electronix.ru/forum/index.php?showtopic=108830

Цитата(Aal6 @ Jan 23 2013, 16:53) *
А нет возможности посчитать биты в слове без циклических проверок?
Очень бы пригодилось. Сейчас завел на clk таймера сигнал с sck&data SPI, но лучше бы заранее знать кол-во 1 в данных. Это улучшило бы алгоритм.

какая разрядность? Если 8 бит, то, потратив немного памяти, проще табличным методом.
То есть:
Код
const uint8_t bits[256] = {0, 1, 1, 2, 1, 2, 2, 3, 1, ...};
uint8_t count, value;

count = bits[value];


В общем как-то так
Go to the top of the page
 
+Quote Post
Aal6
сообщение Jan 23 2013, 14:43
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 2-03-06
Пользователь №: 14 880



По факту таблица лишь чуть быстрее, чем пробежаться бегущей 1 по регистру. Плюс затраты памяти.

Нашел команду clz - считает кол-во 0 в 32 битовом регистре. В sam3 реализация аппаратная, посмотрел дизассемблером.

Похоже то что нужно.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 23 2013, 14:56
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Aal6 @ Jan 23 2013, 16:43) *
Нашел команду clz - считает кол-во 0 в 32 битовом регистре. В sam3 реализация аппаратная, посмотрел дизассемблером.

Похоже то что нужно.

Уверены, что эта команда - то что нужно?

clz == Count Leading Zeros.

Цитата
The CLZ instruction counts the number of leading zeros in the value in Rm and returns the result in Rd.
The result value is 32 if no bits are set in the source register, and zero if bit[31] is set.

Go to the top of the page
 
+Quote Post
Aal6
сообщение Jan 23 2013, 15:28
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 2-03-06
Пользователь №: 14 880



Судя по всему не то. Хотя помочь немного может, если гасить единицы последовательно.

Сообщение отредактировал Aal6 - Jan 23 2013, 15:30
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jan 23 2013, 19:19
Сообщение #9


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Если гасить единички по одной (начиная с младшей), то и clz не нужен (это называется «Brian Kernighan's way»):
Код
uint_fast8_t cnt_1(uint32_t val)
{
        uint_fast8_t cnt = 0;
        while (val) {
                ++cnt;
                val &= (val-1);
        }
        return cnt;
}


А вообще нужно запомнить слова Bit twiddling hacks, они хорошо гуглятся. И там целый раздел на подсчёт единичек.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Aal6
сообщение Jan 24 2013, 07:14
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 2-03-06
Пользователь №: 14 880



Спасибо! Я и не знал что есть столько методов.
Да, clz не особо нужен, хотя код с ним будет обладать примерно той же эффективностью на ARM.
Посмотрим, это пока на потом оставил. Если скорости хватит, сделаю расчет через софт или, если останемся в этом кристалле, выделю канал UART-SPI и таймер исключительно под эту задачу и сделаю аппаратный подсчет.

Сообщение отредактировал Aal6 - Jan 24 2013, 07:20
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 04:17
Рейтинг@Mail.ru


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