|
|
  |
SAM3 SPI поменять порядок бит |
|
|
|
Jan 22 2013, 16:29
|
Участник

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

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

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

|
Спасибо! Очень выручили. Лучше чем биты строить.
|
|
|
|
|
Jan 23 2013, 12:53
|
Участник

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

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

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

|
Цитата(ReAl @ Jan 22 2013, 21:00)  Где-то тут уже было на эту тему для Cortex-M3 да-да 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]; В общем как-то так
|
|
|
|
|
Jan 23 2013, 14:43
|
Участник

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

|
По факту таблица лишь чуть быстрее, чем пробежаться бегущей 1 по регистру. Плюс затраты памяти.
Нашел команду clz - считает кол-во 0 в 32 битовом регистре. В sam3 реализация аппаратная, посмотрел дизассемблером.
Похоже то что нужно.
|
|
|
|
|
Jan 23 2013, 14:56
|
Гуру
     
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Jan 23 2013, 15:28
|
Участник

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

|
Судя по всему не то. Хотя помочь немного может, если гасить единицы последовательно.
Сообщение отредактировал Aal6 - Jan 23 2013, 15:30
|
|
|
|
|
Jan 23 2013, 19:19
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 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, они хорошо гуглятся. И там целый раздел на подсчёт единичек.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jan 24 2013, 07:14
|
Участник

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

|
Спасибо! Я и не знал что есть столько методов. Да, clz не особо нужен, хотя код с ним будет обладать примерно той же эффективностью на ARM. Посмотрим, это пока на потом оставил. Если скорости хватит, сделаю расчет через софт или, если останемся в этом кристалле, выделю канал UART-SPI и таймер исключительно под эту задачу и сделаю аппаратный подсчет.
Сообщение отредактировал Aal6 - Jan 24 2013, 07:20
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|