adnega 11 21 апреля, 2022 Опубликовано 21 апреля, 2022 · Жалоба 1 час назад, Eddy_Em сказал: просто сразу же готовлю правильный экранный буфер И я готовлю. Только беда: контроллер одновременно поддерживает два вида подключения модулей - "паравозиком" и "параллельно". Есть 8 модулей (например, цены на АЗС) их могут подключить паравозиком, но неисправность одного модуля приведет к неработоспособности оставшейся части. Поэтому есть альтернативное подключение: 8 портов для индивидуального подключения модулей. Первый тип, очевидно, SPI+DMA. Второй - FSMC+DMA (как бы octo-spi). Второй буфер получается из первого транспонированием. Транспонировать проще (меньше матана) чем два варианта setpixel. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 21 апреля, 2022 Опубликовано 21 апреля, 2022 · Жалоба Если в контролере есть достаточно памяти, то можно не заниматься перекладыванием данных побитно, а перекодировать с помощью массива констант. Например для перекодирования 8 битов достаточно массива на 256 байтов. Если битов больше, можно массивы порезать (например по байтам). Тогда для перекодировки 32х битов понадобится 4 массива из 256 32х битных слов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 21 апреля, 2022 Опубликовано 21 апреля, 2022 · Жалоба 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кГц, чтобы обнаруживать дребезг, длящийся десятки мс?? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 189 21 апреля, 2022 Опубликовано 21 апреля, 2022 · Жалоба 24 минуты назад, jcxz сказал: Какой смысл опрашивать с частотой 2.5кГц, чтобы обнаруживать дребезг, длящийся десятки мс?? Смысл в том, что никакой опрос кнопок через десяток мс не поможет при жестком ЭМС-воздействии. Там на линиях начинается какой-то ахтунг, поэтому приходится много семплировать и решение о нажатии принимать именно так, как я описал. Клавиатуры еще и пленочные, т.е. их относительно высокое сопротивление тоже на ЭМС-испытаниях не в мою пользу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 21 апреля, 2022 Опубликовано 21 апреля, 2022 · Жалоба 29 минут назад, xvr сказал: Если в контролере есть достаточно памяти, то можно не заниматься перекладыванием данных побитно, а перекодировать с помощью массива констант. Например для перекодирования 8 битов достаточно массива на 256 байтов. Если битов больше, можно массивы порезать (например по байтам). Тогда для перекодировки 32х битов понадобится 4 массива из 256 32х битных слов В описанной задаче, содержимое одного вых.байта определяется содержимым 8 вх.байтов. Как именно вы собрались перекодировать с помощью таблиц такое? Предлагаете забабахать таблицу размером 0x10000000000000000 байт? 16 часов назад, adnega сказал: У меня задача сложнее была нужно было выполнять транспонирование битов: есть 8 байт, нужно первые биты всех байт по порядку сложить в первый выходной байт, вторые биты - во второй и т.д. И делать это 100 раз в секунду, и байтов там под тыщу - вывод картинки на матрицу светодиодов. Делал с использованием BB. С помощью bit-band делать такое - самый тормозной путь. имхо. Тупо, в лоб: загрузить (LDMIA) 2 слова, потом в регистрах пересортировать их и выгрузить (STMIA) - должно быть значительно быстрее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 21 апреля, 2022 Опубликовано 21 апреля, 2022 · Жалоба 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 (имхо): использования его для атомарной модификации отдельных бит в слове. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 22 апреля, 2022 Опубликовано 22 апреля, 2022 · Жалоба On 4/21/2022 at 3:14 PM, jcxz said: В описанной задаче, содержимое одного вых.байта определяется содержимым 8 вх.байтов. Как именно вы собрались перекодировать с помощью таблиц такое? Я же писал - 8 таблиц по 256 байтов (если 8 байтов -> 1 байт) При условии что у ТС чистая перестановка битов (как он в самом начале писал) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 22 апреля, 2022 Опубликовано 22 апреля, 2022 · Жалоба 4 минуты назад, xvr сказал: Я же писал - 8 таблиц по 256 байтов (если 8 байтов -> 1 байт) Да хоть 28. Это невозможно. Или покажите алгоритм. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 22 апреля, 2022 Опубликовано 22 апреля, 2022 · Жалоба 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]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 22 апреля, 2022 Опубликовано 22 апреля, 2022 · Жалоба 4 минуты назад, xvr сказал: Входные данные - 8 байтов в виде 8 переменных b0, b1, ... b7 таблицы перекодировок - 8 штук типа uint8_t t0/1/.../7[256]={...} Перекодировка: result = t0[b0] | t1[b1] | t2[b2] | ... t7[b7]; Прочитайте внимательнее обсуждаемый алгоритм. Там результат = массив из 8-и байт. Где он у вас? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 22 апреля, 2022 Опубликовано 22 апреля, 2022 · Жалоба Just now, jcxz said: Прочитайте внимательнее обсуждаемый алгоритм. Там результат = массив из 8-и байт. Где он у вас? Вы сами написали On 4/21/2022 at 3:14 PM, jcxz said: В описанной задаче, содержимое одного вых.байта определяется содержимым 8 вх.байтов. Я и написал для 1 выходного байта. Нужно больше - расширяйте таблицы. uint64_t t0...7[256] вас спасёт. Код остаётся тот же Не устраивают uint64_t - соберите выход из кусков поменьше (количество таблиц конечно увеличится) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 22 апреля, 2022 Опубликовано 22 апреля, 2022 · Жалоба Цитата Я и написал для 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: Советую наконец-то включить голову и не писать чушь.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 23 апреля, 2022 Опубликовано 23 апреля, 2022 · Жалоба 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: Советую наконец-то включить голову и не писать чушь.... Советую снять корону и ещё раз внимательно прочитать, что именно предлагается. Пока чушь пишете вы Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 23 апреля, 2022 Опубликовано 23 апреля, 2022 · Жалоба Вот скрипт на питоне, который создаёт те самые таблицы (питон 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 входной бит Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 24 апреля, 2022 Опубликовано 24 апреля, 2022 · Жалоба 21 час назад, xvr сказал: Разрядность x равна 8*8 = 64. Перекодировка будет работать. ... Нет, не так. В данном случае используется свойство самой функции f(x) У вас что случилось с логикой? Знаете такое слово? Возьмите калькулятор и возведите 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться