Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SAM3 SPI поменять порядок бит
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Aal6
Озадачен невозможностью сменить порядок вывод битов по SPI c MSB->LSB наоборот.

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

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


Две команды на разворот битов одновремённо в 4 байтах либо в двух 16-битных словах (если второй командой сделать циклический сдвиг, а не логический).
Где-то тут уже было на эту тему для Cortex-M3
Aal6
Спасибо! Очень выручили.
Лучше чем биты строить.
Aal6
А нет возможности посчитать биты в слове без циклических проверок?
Очень бы пригодилось. Сейчас завел на clk таймера сигнал с sck&data SPI, но лучше бы заранее знать кол-во 1 в данных. Это улучшило бы алгоритм.
toweroff
Цитата(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];


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

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

Похоже то что нужно.
_Артём_
Цитата(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.

Aal6
Судя по всему не то. Хотя помочь немного может, если гасить единицы последовательно.
ReAl
Если гасить единички по одной (начиная с младшей), то и 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, они хорошо гуглятся. И там целый раздел на подсчёт единичек.
Aal6
Спасибо! Я и не знал что есть столько методов.
Да, clz не особо нужен, хотя код с ним будет обладать примерно той же эффективностью на ARM.
Посмотрим, это пока на потом оставил. Если скорости хватит, сделаю расчет через софт или, если останемся в этом кристалле, выделю канал UART-SPI и таймер исключительно под эту задачу и сделаю аппаратный подсчет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.