Страница 19 из 22
Re: Хитрые, необычные алгоритмы и код
Добавлено: Сб дек 07, 2024 13:54:02
ПростоНуб
[uquote="safocl",url="/forum/viewtopic.php?p=4657432#p4657432"]1. Что за проблемные требования? А как программа может содержать нечто, что не содержится в ЯП?[/uquote]
Смотря, что Вы подразумеваете под "содержится в ЯП". Если "содержится в стандарте ЯП", то любая программа должна решать проблемную задачу, иначе она просто не нужна. Следовательно, ничего о решении целевой проблемы в стандарте Вы не найдете. В программе будет содержаться логика решения проблемной задачи. Будь это коммуникация по MQTT или динамическое связывание с учетом ограничений ABI.
[uquote="safocl",url="/forum/viewtopic.php?p=4657432#p4657432"]2. Ссылки не открываются у меня... но я понял про что, и оно к теме именно программирования в том числе прошивок не имеет никакого отношения.[/uquote]
Официальная "ARM for Embedded Developer Guide"? Ну-ну )))
[uquote="safocl",url="/forum/viewtopic.php?p=4657432#p4657432"]3. Конечно лучше изучить даташит, вот только чем он может тут помочь преминимо к нашему обсуждению?[/uquote]
Это лишь наиболее очевидный пример того, что невозможно программировать, зная лишь стандарт языка.
В более общем случае, попробуйте почитать требования к вакансиям. С удивлением там обнаружите, что кодер (знающий только ЯП) вообще никому не нужен. В обязательных требованиях будет, для примера, Kafka, ClickHouse, gRPC, ProtoBuf, RabbitMQ, MQTT, PostgreSQL k8s и прочее, чего в стандарте ЯП обнаружить не удастся. И в итоге выяснится, что знания о конкретном ЯП для разработчика - лишь незначительная часть того, что ему действительно необходимо знать.
[uquote="safocl",url="/forum/viewtopic.php?p=4657432#p4657432"]К примеру могу привести отсутствие какой либо нужды знать конкретные реализации той же самой линковки -- поскольку никаким образом не может привести к изменению в коде...[/uquote]
Внимательно перечитайте мои примеры выше. Переход от статического связывания к динамическому на C++ обязательно потребует изменений в коде.
Re: Хитрые, необычные алгоритмы и код
Добавлено: Сб дек 07, 2024 15:39:41
safocl
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4657635#p4657635"]Следовательно, ничего о решении целевой проблемы в стандарте Вы не найдете. В программе будет содержаться логика решения проблемной задачи. Будь это коммуникация по MQTT или динамическое связывание с учетом ограничений ABI.[/uquote] -- поскольу это несколько отличается от предыдущих вариаций твоих постов, то отвечу -- я не говорил вообще что в стандарте должо быть решение какой то задачи, в том числе описание того как надо писать логику -- это уже прерогатива каких-то гайдлайнов... Относительно к стандарту я указывал на общие концепции, которые применимы в коде, ты же начал внедрять неверный свой вывод, что требуется знать ABI как сущность ЯП и в соответствии с ABI кодировать так или иначе. При этом ты подразумеваешь, что необходимо как либо использовать сущности, которые должны пользоваться этим ABI. Хотя таковое вообще не предусмотрено ЯП -- о чем я уже многократно высказывался -- по этому прекращай вести этот нелепый спитч про сущности, которые не могут никаким образом повлиять на процесс программирования на определенном ЯП (в частности у нас тут обсуждение С++ было). Никакого механизма для управления dynamic linkage ЯП С++ не подразумевает в себе -- он даже не содержит такого понятия -- такого не существует в нем... В своей программе ты можешь задать какую угодно логику взаимодействия, используя средства ЯП -- ничего больше не требуется.
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4657635#p4657635"]Это лишь наиболее очевидный пример того, что невозможно программировать, зная лишь стандарт языка.
В более общем случае, попробуйте почитать требования к вакансиям. С удивлением там обнаружите, что кодер (знающий только ЯП) вообще никому не нужен. В обязательных требованиях будет, для примера, Kafka, ClickHouse, gRPC, ProtoBuf, RabbitMQ, MQTT, PostgreSQL k8s и прочее, чего в стандарте ЯП обнаружить не удастся. И в итоге выяснится, что знания о конкретном ЯП для разработчика - лишь незначительная часть того, что ему действительно необходимо знать.[/uquote] -- а можно вообще привести хоть один мой пост, в котором указывается, что вообще ничего кроме ЯП знать не надо для кодирования? Ведь я говорил про то, что нет никакой необходимости знать, как это будет устроено после обработки компилятором и воспринято операционной системой... А не в общем случае про знания для программирования... Я же явно пометил про "к нашему обсуждению" неоставив никаких иных истолковательных вариантов.
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4657635#p4657635"]Внимательно перечитайте мои примеры выше. Переход от статического связывания к динамическому на C++ обязательно потребует изменений в коде.[/uquote] -- какие же в коде должны быть изменения? Я как и впредь предложу обратить внимание на тот факт -- что ты возможно пытаешься не там изменять для достижения своей цели? Такое называется "костылями" как я считаю.
Остальное входит в разряд повторений и по таким ответам я больше не буду по кругу ходить -- читай выше -- можешь спросить, как реально все работает -- я постараюсь ответить, что бы больше таких постов не возникало... Только если есть вопрос, лучше его задать поконкретнее.
Re: Хитрые, необычные алгоритмы и код
Добавлено: Сб окт 25, 2025 17:59:03
Вячеслав М.
У меня джиттера нет, ввод/вывод происходит после прерывания когда процессор спал, засыпает он всегда не позднее 950 мкс, когда завершит все текущие одномиллисекундные задачи. Сначала все активные задачи основные, после процессор запускает ADC на 700_й микросекунде, по очереди каналы, сам находится во сне во время работы ADC, просыпается только переключить канал и сохранить результат, после в сон до прерывания 1 миллисекунда, далее уже повторю - ввод/вывод по SPI.
Re: Хитрые, необычные алгоритмы и код
Добавлено: Сб окт 25, 2025 18:12:38
Gudd-Head
Эт чё за херня?
Re: Хитрые, необычные алгоритмы и код
Добавлено: Сб окт 25, 2025 18:17:48
Вячеслав М.
Это по теме - хитрый алгоритм, но тебе похоже это не под силу понять.
Re: Хитрые, необычные алгоритмы и код
Добавлено: Сб окт 25, 2025 18:56:25
КРАМ
[uquote="Вячеслав М.",url="/forum/viewtopic.php?p=4757700#p4757700"]Это по теме - хитрый алгоритм[/uquote]
Любой "хитрый алгоритм" - это джиттер. Джиттер почти отсутствует только у аппаратного процесса, да и то нужно постараться.
Например, триггер Шмитта - это гарантированный высокий уровень джиттера. А практически все ноги современных МК по входу - триггеры Шмитта.
Re: Хитрые, необычные алгоритмы и код
Добавлено: Сб окт 25, 2025 21:33:59
veso74
Простой способ изменить порядок битов в байте.
Идея отсюда:
In C/C++ what's the simplest way to reverse the order of bits in a byte?
напр. 0b10010011 -> 0b11001001
С листом бумаги и карандашом за минуту (и меньше) ясно, что делает метод

.
Давно пользуюсь, например для зарядки данных в TM1637 по протоколу I2C (аппаратная или программная, без адреса).
Код: Выделить всё
// https://stackoverflow.com/questions/2602823/in-c-c-whats-the-simplest-way-to-reverse-the-order-of-bits-in-a-byte
uint8_t rev_data(uint8_t b) {
b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
return b;
}
Re: Хитрые, необычные алгоритмы и код
Добавлено: Вс окт 26, 2025 10:46:11
Gudd-Head
А практически все ноги современных МК по входу - триггеры Шмитта.
Хочется сказать, что ноги завязаны на тактовую частоту МК
Re: Хитрые, необычные алгоритмы и код
Добавлено: Вс окт 26, 2025 11:23:32
КРАМ
[uquote="Gudd-Head",url="/forum/viewtopic.php?p=4757845#p4757845"]ноги завязаны на тактовую частоту МК[/uquote]
Это зависит от архитектуры. Но программное чтение порта несомненно завязано. Однако ТШ сам по себе способен вызвать джиттер, Особенно для сигналов с не крутыми фронтами.
Есть пины способные работать асинхронно с внутренней аппаратной периферией. И тогда ТШ станет камнем преткновения.
Re: Хитрые, необычные алгоритмы и код
Добавлено: Пн окт 27, 2025 23:32:05
Ser60
[uquote="veso74",url="/forum/viewtopic.php?p=4757753#p4757753"]Простой способ изменить порядок битов в байте.[/uquote]Хорошая идея, но неплохо было-бы уточнить для какого процессорa. Понятно, что на С будет работать на любом, но в АРМ это делается одной командой RBIT процессора. Кроме того, для использования аппаратного SPI (не I2C) драйвера с TM1637 в них имеется выбор засылки данных начиная с msb или с lsb, так что программное инвертирование битов не требуется. В аппаратных I2C драйверах такого выбора не встречал, так что может иметь смысл. Однако, при программной реализации I2C можно выталкивать биты сдвигом байта влево или вправо, так что дополнительное инвертирование порядка битов не требуется.
Re: Хитрые, необычные алгоритмы и код
Добавлено: Вт окт 28, 2025 04:53:17
akl
[uquote="veso74",url="/forum/viewtopic.php?p=4757753#p4757753"...напр. 0b10010011 -> 0b11001001
С листом бумаги и карандашом за минуту (и меньше) ясно, что делает метод
Код: Выделить всё
{
b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
return b;
}
[/uquote]
Такой код выполняется за 17 тактов. Даже карандаш с бумагой доставать не надо. К тому же позволяет выполнить любую перетасовку битов.
Код: Выделить всё
.include "tn2313def.inc"
.CSEG
Reset:
LDI R22,0b10010011
BST R22,7
BLD R0,0
BST R22,6
BLD R0,1
BST R22,5
BLD R0,2
BST R22,4
BLD R0,3
BST R22,3
BLD R0,4
BST R22,2
BLD R0,5
BST R22,1
BLD R0,6
BST R22,0
BLD R0,7
RJMP RESET
.EXIT
Re: Хитрые, необычные алгоритмы и код
Добавлено: Вт окт 28, 2025 06:56:25
HardWareMan
[uquote="akl",url="/forum/viewtopic.php?p=4758449#p4758449"]Такой код выполняется за 17 тактов. Даже карандаш с бумагой доставать не надо. К тому же позволяет выполнить любую перетасовку битов.
Код: Выделить всё
.include "tn2313def.inc"
.CSEG
Reset:
LDI R22,0b10010011
BST R22,7
BLD R0,0
BST R22,6
BLD R0,1
BST R22,5
BLD R0,2
BST R22,4
BLD R0,3
BST R22,3
BLD R0,4
BST R22,2
BLD R0,5
BST R22,1
BLD R0,6
BST R22,0
BLD R0,7
RJMP RESET
.EXIT
[/uquote]
Для простого разворота я всегда использовал пару сдвигов через С ROL/ROR (те же самые 16 тактов на байт). Но если нужна особая перестановка, то использование BST/BLD, конечно, без вариантов.
Re: Хитрые, необычные алгоритмы и код
Добавлено: Вт окт 28, 2025 07:51:11
veso74
Ser60, для AVR, PIC, STM8/32, CH32, GD32, APM32, Teensy, ESP32 и другие.
Пo I2c oсобенно эффективно для МК с небольшим количеством пинам и ресурсам, при наличии других периферийных устройств на стандартном I2c. Прогр. код для комуникации с дисплея уже написан и не нужно писать новый (bit-banging).

---
Нашел для APM (Keil, arm_acle.h), спасибо, буду использовать.
Код: Выделить всё
/* RBIT */
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
__rbit(uint32_t __t) {
return __builtin_arm_rbit(__t);
}
Re: Хитрые, необычные алгоритмы и код
Добавлено: Вт окт 28, 2025 11:40:40
КРАМ
[uquote="Ser60",url="/forum/viewtopic.php?p=4758428#p4758428"]Кроме того, для использования аппаратного SPI (не I2C) драйвера с TM1637 в них имеется выбор засылки данных начиная с msb или с lsb, так что программное инвертирование битов не требуется. В аппаратных I2C драйверах такого выбора не встречал, так что может иметь смысл. Однако, при программной реализации I2C можно выталкивать биты сдвигом байта влево или вправо, так что дополнительное инвертирование порядка битов не требуется.[/uquote]
Инвертирование порядка бит является фундаментальной процедурой FFT. Именно поэтому в любом процессоре рассчитанном на БПФ есть реверс битов как отдельная инструкция.
Re: Хитрые, необычные алгоритмы и код
Добавлено: Ср окт 29, 2025 11:58:59
jcxz
[uquote="HardWareMan",url="/forum/viewtopic.php?p=4758459#p4758459"]Для простого разворота я всегда использовал пару сдвигов через С ROL/ROR (те же самые 16 тактов на байт). Но если нужна особая перестановка, то использование BST/BLD, конечно, без вариантов.[/uquote]Для байта то - зачем так? Неужто нет места на один 256-байтный массив? Для архитектур, где нет спец.команды, проще и быстрее имхо - трансляцией через массив.
Re: Хитрые, необычные алгоритмы и код
Добавлено: Ср окт 29, 2025 12:13:46
Starichok51
jcxz, какой, на хрен, 256-байтный массив, чтобы развернуть биты в одном байте?
Re: Хитрые, необычные алгоритмы и код
Добавлено: Ср окт 29, 2025 12:36:41
jcxz
[uquote="Starichok51",url="/forum/viewtopic.php?p=4758921#p4758921"]jcxz, какой, на хрен, 256-байтный массив, чтобы развернуть биты в одном байте?[/uquote]А что не так?
Исходное значение - индекс массива, результат = значению по данному индексу.
Re: Хитрые, необычные алгоритмы и код
Добавлено: Ср окт 29, 2025 13:54:30
Starichok51
jcxz, а если понадобиться развернуть двухбайтовое число, ты предложишь массив из 65536 байт?
Re: Хитрые, необычные алгоритмы и код
Добавлено: Ср окт 29, 2025 14:25:33
КРАМ
[uquote="Starichok51",url="/forum/viewtopic.php?p=4758968#p4758968"]а если понадобиться...?[/uquote]
В этом нет никакого смысла. поскольку проблема разворота бит - это проблема отсутствия адресации бит.
Поэтому двух, трех, четырех и так далее байтовые слова разворачиваются сначала внутри байтов и затем реверсируются адресным путем уже байты в слове, только действием с указателем.
Re: Хитрые, необычные алгоритмы и код
Добавлено: Ср окт 29, 2025 15:08:55
Starichok51
КРАМ, извини, но вопрос был задан не тебе.
и еще я не спрашивал, какие способы существуют и сколько их.
я спросил про конкретный способ, который предлагает jcxz.