Перейти к содержанию
    

SAM3 SPI поменять порядок бит

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

 

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

 

В задаче нужно загружать буфер со сменой направления отображения, порядка 8МБит/с. Усугубляет проблему не умение PDC выдавать данные с декрементом указателя.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

Где-то тут уже было на эту тему для Cortex-M3

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А нет возможности посчитать биты в слове без циклических проверок?

Очень бы пригодилось. Сейчас завел на clk таймера сигнал с sck&data SPI, но лучше бы заранее знать кол-во 1 в данных. Это улучшило бы алгоритм.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Где-то тут уже было на эту тему для Cortex-M3

да-да :)

http://electronix.ru/forum/index.php?showtopic=108830

 

А нет возможности посчитать биты в слове без циклических проверок?

Очень бы пригодилось. Сейчас завел на 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];

 

В общем как-то так

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нашел команду 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.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем Aal6

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если гасить единички по одной (начиная с младшей), то и 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, они хорошо гуглятся. И там целый раздел на подсчёт единичек.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо! Я и не знал что есть столько методов.

Да, clz не особо нужен, хотя код с ним будет обладать примерно той же эффективностью на ARM.

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

Изменено пользователем Aal6

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...