Aal6 0 22 января, 2013 Опубликовано 22 января, 2013 · Жалоба Озадачен невозможностью сменить порядок вывод битов по SPI c MSB->LSB наоборот. Нет какой-либо возможности быстро перекинуть биты в байте без пересчета софтом? В задаче нужно загружать буфер со сменой направления отображения, порядка 8МБит/с. Усугубляет проблему не умение PDC выдавать данные с декрементом указателя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 22 января, 2013 Опубликовано 22 января, 2013 · Жалоба Озадачен невозможностью сменить порядок вывод битов по SPI c MSB->LSB наоборот. Нет какой-либо возможности быстро перекинуть биты в байте без пересчета софтом? Две команды на разворот битов одновремённо в 4 байтах либо в двух 16-битных словах (если второй командой сделать циклический сдвиг, а не логический). Где-то тут уже было на эту тему для Cortex-M3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aal6 0 22 января, 2013 Опубликовано 22 января, 2013 · Жалоба Спасибо! Очень выручили. Лучше чем биты строить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aal6 0 23 января, 2013 Опубликовано 23 января, 2013 · Жалоба А нет возможности посчитать биты в слове без циклических проверок? Очень бы пригодилось. Сейчас завел на clk таймера сигнал с sck&data SPI, но лучше бы заранее знать кол-во 1 в данных. Это улучшило бы алгоритм. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 23 января, 2013 Опубликовано 23 января, 2013 · Жалоба Где-то тут уже было на эту тему для 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]; В общем как-то так Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aal6 0 23 января, 2013 Опубликовано 23 января, 2013 · Жалоба По факту таблица лишь чуть быстрее, чем пробежаться бегущей 1 по регистру. Плюс затраты памяти. Нашел команду clz - считает кол-во 0 в 32 битовом регистре. В sam3 реализация аппаратная, посмотрел дизассемблером. Похоже то что нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 23 января, 2013 Опубликовано 23 января, 2013 · Жалоба Нашел команду 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 0 23 января, 2013 Опубликовано 23 января, 2013 (изменено) · Жалоба Судя по всему не то. Хотя помочь немного может, если гасить единицы последовательно. Изменено 23 января, 2013 пользователем Aal6 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 23 января, 2013 Опубликовано 23 января, 2013 · Жалоба Если гасить единички по одной (начиная с младшей), то и 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 0 24 января, 2013 Опубликовано 24 января, 2013 (изменено) · Жалоба Спасибо! Я и не знал что есть столько методов. Да, clz не особо нужен, хотя код с ним будет обладать примерно той же эффективностью на ARM. Посмотрим, это пока на потом оставил. Если скорости хватит, сделаю расчет через софт или, если останемся в этом кристалле, выделю канал UART-SPI и таймер исключительно под эту задачу и сделаю аппаратный подсчет. Изменено 24 января, 2013 пользователем Aal6 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться