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

Есть ли в Cortex-M3 инструкция копирования битов?

1 час назад, Eddy_Em сказал:

просто сразу же готовлю правильный экранный буфер

И я готовлю. Только беда: контроллер одновременно поддерживает два вида подключения модулей - "паравозиком" и "параллельно".

Есть 8 модулей (например, цены на АЗС) их могут подключить паравозиком, но неисправность одного модуля приведет к неработоспособности оставшейся части.

Поэтому есть альтернативное подключение: 8 портов для индивидуального подключения модулей.

Первый тип, очевидно, SPI+DMA. Второй - FSMC+DMA (как бы octo-spi).

Второй буфер получается из первого транспонированием. Транспонировать проще (меньше матана) чем два варианта setpixel.

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


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

Если в контролере есть достаточно памяти, то можно не заниматься перекладыванием данных побитно, а перекодировать с помощью массива констант. Например для перекодирования 8 битов достаточно массива на 256 байтов. Если битов больше, можно массивы порезать (например по байтам). Тогда для перекодировки 32х битов понадобится 4 массива из 256 32х битных слов

 

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


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

20.04.2022 в 01:08, adnega сказал:

(например, битик в протоколе потребуется поменять местом или раскладка матричной клавиатуры поменяется из-за снабжения).

Это решаемо с помощью макроов.

20.04.2022 в 08:52, Arlleex сказал:

Я это понимаю прекрасно, и Вы дальше правильно развили свою же мысль - сколько тактов будет занимать все это дело? Давайте просто прикинем: UBFX / BFI - это 1-тактные инструкции, LDR / STR - 2-тактные, и сделать их 1-тактными не получится (конвейеризовать)

Я не знаю сколько именно тактов занимает запись одного слова в bit-band-область памяти, но думаю что больше, чем запись в обычное ОЗУ. Так как в реальности процессору нужно выполнить операцию "чтение-модификация-запись" над словом в ОЗУ. Вряд-ли ОЗУ в МК поддерживает побитную адресацию. А значит чтение-модификацию-запись слова нужно организовать в ядре.

Это не считая прочих расходов тактов.

19 часов назад, Arlleex сказал:

Сканировать нужно так, чтобы данные каждого столбца защелкивались с частотой не менее 2.5 кГц, и оценка "нажатия" ведется по одинаковым значениям семплов в течение 20 мс интервала времени.

Имхо - Вы здесь излишне ужесточаете работу. Здесь у Вас из-за излишне высокой частоты опроса, тратится гораздо больше тактов, чем после пытаетесь сэкономить на перекодировании. На порядки больше!

Какой смысл опрашивать с частотой 2.5кГц, чтобы обнаруживать дребезг, длящийся десятки мс??

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


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

24 минуты назад, jcxz сказал:

Какой смысл опрашивать с частотой 2.5кГц, чтобы обнаруживать дребезг, длящийся десятки мс??

Смысл в том, что никакой опрос кнопок через десяток мс не поможет при жестком ЭМС-воздействии. Там на линиях начинается какой-то ахтунг, поэтому приходится много семплировать и решение о нажатии принимать именно так, как я описал. Клавиатуры еще и пленочные, т.е. их относительно высокое сопротивление тоже на ЭМС-испытаниях не в мою пользу.

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


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

29 минут назад, xvr сказал:

Если в контролере есть достаточно памяти, то можно не заниматься перекладыванием данных побитно, а перекодировать с помощью массива констант. Например для перекодирования 8 битов достаточно массива на 256 байтов. Если битов больше, можно массивы порезать (например по байтам). Тогда для перекодировки 32х битов понадобится 4 массива из 256 32х битных слов

В описанной задаче, содержимое одного вых.байта определяется содержимым 8 вх.байтов. Как именно вы собрались перекодировать с помощью таблиц такое? Предлагаете забабахать таблицу размером 0x10000000000000000 байт?  :biggrin:

16 часов назад, adnega сказал:

У меня задача сложнее была нужно было выполнять транспонирование битов: есть 8 байт, нужно первые биты всех байт по порядку сложить в первый выходной байт, вторые биты - во второй и т.д. И делать это 100 раз в секунду, и байтов там под тыщу - вывод картинки на матрицу светодиодов. Делал с использованием BB.

С помощью bit-band делать такое - самый тормозной путь. имхо.

Тупо, в лоб: загрузить (LDMIA) 2 слова, потом в регистрах пересортировать их и выгрузить (STMIA) - должно быть значительно быстрее.

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


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

19 часов назад, adnega сказал:

У меня задача сложнее была нужно было выполнять транспонирование битов: есть 8 байт, нужно первые биты всех байт по порядку сложить в первый выходной байт, вторые биты - во второй и т.д. И делать это 100 раз в секунду, и байтов там под тыщу - вывод картинки на матрицу светодиодов. Делал с использованием BB. Вот бы одну инструкцию или трюк какой...

Не знаю о каком именно CPU речь и что такое "первые биты" и что такое "первый байт", но вот накидал для >= Cortex-M4:

Скрытый текст

               SECTION  .text:CODE:NOROOT(2)
               PUBLIC   ResortBits
;extern "C" void ResortBits(u32 *, u32 const *, uint n);
               THUMB
ResortBits:    PUSH     {R4-R6, LR}
               MOV      R12, #80808080h

ResortBits_01: LDMIA    R1!, {R3, R4}

               USUB8    LR, R4, R12
               MRS      R6, APSR
               LSLS     R4, R4, #1
               LSLS     R6, R6, #12
               USUB8    LR, R3, R12
               MRS      LR, APSR
               LSLS     R3, R3, #1
               UBFX     LR, LR, #16, #4
               BFI      R6, LR, #24, #4

               USUB8    LR, R4, R12
               MRS      LR, APSR
               LSLS     R4, R4, #1
               UBFX     LR, LR, #16, #4
               BFI      R6, LR, #20, #4
               USUB8    LR, R3, R12
               MRS      LR, APSR
               LSLS     R3, R3, #1
               UBFX     LR, LR, #16, #4
               BFI      R6, LR, #16, #4

               USUB8    LR, R4, R12
               MRS      LR, APSR
               LSLS     R4, R4, #1
               UBFX     LR, LR, #16, #4
               BFI      R6, LR, #12, #4
               USUB8    LR, R3, R12
               MRS      LR, APSR
               LSLS     R3, R3, #1
               UBFX     LR, LR, #16, #4
               BFI      R6, LR, #8, #4

               USUB8    LR, R4, R12
               MRS      LR, APSR
               LSLS     R4, R4, #1
               UBFX     LR, LR, #16, #4
               BFI      R6, LR, #4, #4
               USUB8    LR, R3, R12
               MRS      LR, APSR
               LSLS     R3, R3, #1
               UBFX     R5, LR, #16, #4
               ORRS     R6, R5

               USUB8    LR, R4, R12
               MRS      R5, APSR
               LSLS     R4, R4, #1
               LSLS     R5, R5, #12
               USUB8    LR, R3, R12
               MRS      LR, APSR
               LSLS     R3, R3, #1
               UBFX     LR, LR, #16, #4
               BFI      R5, LR, #24, #4

               USUB8    LR, R4, R12
               MRS      LR, APSR
               LSLS     R4, R4, #1
               UBFX     LR, LR, #16, #4
               BFI      R5, LR, #20, #4
               USUB8    LR, R3, R12
               MRS      LR, APSR
               LSLS     R3, R3, #1
               UBFX     LR, LR, #16, #4
               BFI      R5, LR, #16, #4

               USUB8    LR, R4, R12
               MRS      LR, APSR
               LSLS     R4, R4, #1
               UBFX     LR, LR, #16, #4
               BFI      R5, LR, #12, #4
               USUB8    LR, R3, R12
               MRS      LR, APSR
               LSLS     R3, R3, #1
               UBFX     LR, LR, #16, #4
               BFI      R5, LR, #8, #4

               USUB8    LR, R4, R12
               MRS      LR, APSR
               UBFX     LR, LR, #16, #4
               BFI      R5, LR, #4, #4
               USUB8    LR, R3, R12
               MRS      LR, APSR
               UBFX     R4, LR, #16, #4
               ORRS     R5, R4

               SUBS     R2, R2, #1
               STMIA    R0!, {R5, R6}
               BNE      ResortBits_01

               POP      {R4-R6, PC}

 

1-аргумент ResortBits() - выходной буфер, 2-й - входные данные, 3й - кол-во входных данных (64-битных слов). Вх. и вых. буфера должны быть выравнены на 32 бита.

Все 7-е биты помещаются в 7-й байт; 6-е биты - в 6-й байт и т.д. Внутри вых.байтов расположение битов аналогично - самый старший бит соответствует самому старшему вх.байту.

Если у вас порядок в реальности другой, то код несложно будет доработать под него.

IAR показывает, что данный код тратит 85 тактов на одну итерацию цикла. Т.е. = 85 тактов на каждые 64 бита вх.данных. Что должно быть многократно быстрее медленного тасования битов через bit-band.

 

PS: Конечно если у Вас Cortex-M3, то такой код работать не будет. И придётся потратить больше тактов. Но всё равно - вычисления в регистрах CPU будут намного быстрее, чем через bit-band.

PPS: Вообще не вижу практического смысла использовать bit-band с целью ускорения каких-то операций. Он скорей всего не будет оптимальным для этого. Единственная практическая польза от bit-nand (имхо): использования его для атомарной модификации отдельных бит в слове.

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


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

On 4/21/2022 at 3:14 PM, jcxz said:

В описанной задаче, содержимое одного вых.байта определяется содержимым 8 вх.байтов. Как именно вы собрались перекодировать с помощью таблиц такое?

Я же писал - 8 таблиц по 256 байтов (если 8 байтов -> 1 байт)

При условии что у ТС чистая перестановка битов (как он в самом начале писал)

 

 

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


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

4 минуты назад, xvr сказал:

Я же писал - 8 таблиц по 256 байтов (если 8 байтов -> 1 байт)

Да хоть 28. Это невозможно. Или покажите алгоритм.

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


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

2 minutes ago, jcxz said:

Да хоть 28. Это невозможно. Или покажите алгоритм.

Входные данные - 8 байтов в виде 8 переменных b0, b1, ... b7

таблицы перекодировок - 8 штук типа uint8_t t0/1/.../7[256]={...}

Перекодировка:

result = t0[b0] | t1[b1] | t2[b2] | ... t7[b7];

 

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


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

4 минуты назад, xvr сказал:

Входные данные - 8 байтов в виде 8 переменных b0, b1, ... b7

таблицы перекодировок - 8 штук типа uint8_t t0/1/.../7[256]={...}

Перекодировка:


result = t0[b0] | t1[b1] | t2[b2] | ... t7[b7];

 

Прочитайте внимательнее обсуждаемый алгоритм. Там результат = массив из 8-и байт. Где он у вас?

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


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

Just now, jcxz said:

Прочитайте внимательнее обсуждаемый алгоритм. Там результат = массив из 8-и байт. Где он у вас?

Вы сами написали

On 4/21/2022 at 3:14 PM, jcxz said:

В описанной задаче, содержимое одного вых.байта определяется содержимым 8 вх.байтов.

Я и написал для 1 выходного байта. Нужно больше - расширяйте таблицы. uint64_t t0...7[256] вас спасёт. Код остаётся тот же

Не устраивают uint64_t - соберите выход из кусков поменьше (количество таблиц конечно увеличится)

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


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

Цитата

Я и написал для 1 выходного байта. Нужно больше - расширяйте таблицы. uint64_t t0...7[256] вас спасёт. Код остаётся тот же

Вы несёте бред.

Перекодирование через этот массив равнозначно функции y=f(x); где разрядность x=64 бита. В вашем массиве uint64_t t0...7[256] разрядность x = 8 бит.

Ещё раз повторю:

В описанной задаче, содержимое одного вых.байта определяется содержимым 8 вх.байтов. А значит массив должен быть такой: uint64_t t0...7[0x10000000000000000]

 

PS: Советую наконец-то включить голову и не писать чушь....

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


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

On 4/22/2022 at 4:54 PM, jcxz said:

Перекодирование через этот массив равнозначно функции y=f(x); где разрядность x=64 бита. В вашем массиве uint64_t t0...7[256] разрядность x = 8 бит.

Разрядность x равна 8*8 = 64. Перекодировка будет работать.

On 4/22/2022 at 4:54 PM, jcxz said:

В описанной задаче, содержимое одного вых.байта определяется содержимым 8 вх.байтов.

Именно так.

On 4/22/2022 at 4:54 PM, jcxz said:

А значит массив должен быть такой: uint64_t t0...7[0x10000000000000000]

Нет, не так. В данном случае используется свойство самой функции f(x)

On 4/22/2022 at 4:54 PM, jcxz said:

PS: Советую наконец-то включить голову и не писать чушь....

Советую снять корону и ещё раз внимательно прочитать, что именно предлагается. Пока чушь пишете вы

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


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

Вот скрипт на питоне, который создаёт те самые таблицы (питон 3, 64 бита)

bit_enc = [
63,62,61,60,59,58,57,56,
55,54,53,52,51,50,49,48,
47,46,45,44,43,42,41,40,
39,38,37,36,35,34,33,32,
31,30,29,28,27,26,25,24,
23,22,21,20,19,18,17,16,
15,14,13,12,11,10,9,8,
7,6,5,4,3,2,1,0
]

def encode1(enc_vector, table_name):
    table_image = []
    for idx in range(0,256):
        acc = 0
        for i in range(0, 8):
            if (idx >> i) & 1:
                acc |= 1 << enc_vector[i]
        table_image.append(acc)
    lines = []
    for l in range(0, 256, 8):
        lines.append(','.join(f'0x{i:016X}' for i in table_image[l : (l+8)]))
    line = ',\n'.join(lines)
    print(f'uint64_t {table_name}[] = {{\n{line}\n}};')

for i in range(0, 8):
    encode1(bit_enc[(i*8) : (i*8+8)], f't{i}')

Массив bit_enc задаёт таблицу перестановки битов: В N ячейке массива должен быть номер бита, куда нужно будет переставить N входной бит

 

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


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

21 час назад, xvr сказал:

Разрядность x равна 8*8 = 64. Перекодировка будет работать.

...

Нет, не так. В данном случае используется свойство самой функции f(x)

У вас что случилось с логикой? Знаете такое слово?  :unknw:

Возьмите калькулятор и возведите 2 в степень 64, получите = 0x10000000000000000. Это диапазон значений вашего x, разрядность коего =64. Массив такого размера нужен для вашего метода.

Цитата

Советую снять корону и ещё раз внимательно прочитать, что именно предлагается. Пока чушь пишете вы

Что именно предлагается? где?? Код в студию!

Пока что единственный работающий код привёл только я. От вас пока вразумительного кода или алгоритма так и не поступило.

Из ваших "предложений" наблюдаю только:

22.04.2022 в 16:41, xvr сказал:

Входные данные - 8 байтов в виде 8 переменных b0, b1, ... b7

таблицы перекодировок - 8 штук типа uint8_t t0/1/.../7[256]={...}

Перекодировка:


result = t0[b0] | t1[b1] | t2[b2] | ... t7[b7];

где тут требуемое выходное 64-битное значение? Где? Вижу только result, который очевидно имеет разрядность = 8.

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


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

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

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

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

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

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

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

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

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

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