Хитрые, необычные алгоритмы и код
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Хитрые, необычные алгоритмы и код
[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++ обязательно потребует изменений в коде.
Смотря, что Вы подразумеваете под "содержится в ЯП". Если "содержится в стандарте ЯП", то любая программа должна решать проблемную задачу, иначе она просто не нужна. Следовательно, ничего о решении целевой проблемы в стандарте Вы не найдете. В программе будет содержаться логика решения проблемной задачи. Будь это коммуникация по 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: Хитрые, необычные алгоритмы и код
[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] -- какие же в коде должны быть изменения? Я как и впредь предложу обратить внимание на тот факт -- что ты возможно пытаешься не там изменять для достижения своей цели? Такое называется "костылями" как я считаю.
Остальное входит в разряд повторений и по таким ответам я больше не буду по кругу ходить -- читай выше -- можешь спросить, как реально все работает -- я постараюсь ответить, что бы больше таких постов не возникало... Только если есть вопрос, лучше его задать поконкретнее.
[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] -- какие же в коде должны быть изменения? Я как и впредь предложу обратить внимание на тот факт -- что ты возможно пытаешься не там изменять для достижения своей цели? Такое называется "костылями" как я считаю.
Остальное входит в разряд повторений и по таким ответам я больше не буду по кругу ходить -- читай выше -- можешь спросить, как реально все работает -- я постараюсь ответить, что бы больше таких постов не возникало... Только если есть вопрос, лучше его задать поконкретнее.
-
Вячеслав М.
- Нашел транзистор. Понюхал.
- Сообщения: 174
- Зарегистрирован: Пн янв 13, 2025 15:24:02
Re: Хитрые, необычные алгоритмы и код
У меня джиттера нет, ввод/вывод происходит после прерывания когда процессор спал, засыпает он всегда не позднее 950 мкс, когда завершит все текущие одномиллисекундные задачи. Сначала все активные задачи основные, после процессор запускает ADC на 700_й микросекунде, по очереди каналы, сам находится во сне во время работы ADC, просыпается только переключить канал и сохранить результат, после в сон до прерывания 1 миллисекунда, далее уже повторю - ввод/вывод по SPI.
- Gudd-Head
- Друг Кота
- Сообщения: 20091
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Хитрые, необычные алгоритмы и код
Эт чё за херня?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
-
Вячеслав М.
- Нашел транзистор. Понюхал.
- Сообщения: 174
- Зарегистрирован: Пн янв 13, 2025 15:24:02
Re: Хитрые, необычные алгоритмы и код
Это по теме - хитрый алгоритм, но тебе похоже это не под силу понять.
- КРАМ
- Друг Кота
- Сообщения: 25121
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Хитрые, необычные алгоритмы и код
[uquote="Вячеслав М.",url="/forum/viewtopic.php?p=4757700#p4757700"]Это по теме - хитрый алгоритм[/uquote]
Любой "хитрый алгоритм" - это джиттер. Джиттер почти отсутствует только у аппаратного процесса, да и то нужно постараться.
Например, триггер Шмитта - это гарантированный высокий уровень джиттера. А практически все ноги современных МК по входу - триггеры Шмитта.
Любой "хитрый алгоритм" - это джиттер. Джиттер почти отсутствует только у аппаратного процесса, да и то нужно постараться.
Например, триггер Шмитта - это гарантированный высокий уровень джиттера. А практически все ноги современных МК по входу - триггеры Шмитта.
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1903
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: Хитрые, необычные алгоритмы и код
Простой способ изменить порядок битов в байте.
Идея отсюда: In C/C++ what's the simplest way to reverse the order of bits in a byte?
напр. 0b10010011 -> 0b11001001
С листом бумаги и карандашом за минуту (и меньше) ясно, что делает метод
.
Давно пользуюсь, например для зарядки данных в TM1637 по протоколу I2C (аппаратная или программная, без адреса).
Идея отсюда: 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;
}- Gudd-Head
- Друг Кота
- Сообщения: 20091
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Хитрые, необычные алгоритмы и код
Хочется сказать, что ноги завязаны на тактовую частоту МКА практически все ноги современных МК по входу - триггеры Шмитта.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- КРАМ
- Друг Кота
- Сообщения: 25121
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Хитрые, необычные алгоритмы и код
[uquote="Gudd-Head",url="/forum/viewtopic.php?p=4757845#p4757845"]ноги завязаны на тактовую частоту МК[/uquote]
Это зависит от архитектуры. Но программное чтение порта несомненно завязано. Однако ТШ сам по себе способен вызвать джиттер, Особенно для сигналов с не крутыми фронтами.
Есть пины способные работать асинхронно с внутренней аппаратной периферией. И тогда ТШ станет камнем преткновения.
Это зависит от архитектуры. Но программное чтение порта несомненно завязано. Однако ТШ сам по себе способен вызвать джиттер, Особенно для сигналов с не крутыми фронтами.
Есть пины способные работать асинхронно с внутренней аппаратной периферией. И тогда ТШ станет камнем преткновения.
Re: Хитрые, необычные алгоритмы и код
[uquote="veso74",url="/forum/viewtopic.php?p=4757753#p4757753"]Простой способ изменить порядок битов в байте.[/uquote]Хорошая идея, но неплохо было-бы уточнить для какого процессорa. Понятно, что на С будет работать на любом, но в АРМ это делается одной командой RBIT процессора. Кроме того, для использования аппаратного SPI (не I2C) драйвера с TM1637 в них имеется выбор засылки данных начиная с msb или с lsb, так что программное инвертирование битов не требуется. В аппаратных I2C драйверах такого выбора не встречал, так что может иметь смысл. Однако, при программной реализации I2C можно выталкивать биты сдвигом байта влево или вправо, так что дополнительное инвертирование порядка битов не требуется.
Re: Хитрые, необычные алгоритмы и код
[uquote="veso74",url="/forum/viewtopic.php?p=4757753#p4757753"...напр. 0b10010011 -> 0b11001001
С листом бумаги и карандашом за минуту (и меньше) ясно, что делает метод[/uquote]
Такой код выполняется за 17 тактов. Даже карандаш с бумагой доставать не надо. К тому же позволяет выполнить любую перетасовку битов.
С листом бумаги и карандашом за минуту (и меньше) ясно, что делает метод
Код: Выделить всё
{
b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
return b;
}Такой код выполняется за 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- HardWareMan
- Мучитель микросхем
- Сообщения: 429
- Зарегистрирован: Ср сен 02, 2015 07:47:20
Re: Хитрые, необычные алгоритмы и код
[uquote="akl",url="/forum/viewtopic.php?p=4758449#p4758449"]Такой код выполняется за 17 тактов. Даже карандаш с бумагой доставать не надо. К тому же позволяет выполнить любую перетасовку битов.
[/uquote]
Для простого разворота я всегда использовал пару сдвигов через С ROL/ROR (те же самые 16 тактов на байт). Но если нужна особая перестановка, то использование BST/BLD, конечно, без вариантов.
Код: Выделить всё
.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Для простого разворота я всегда использовал пару сдвигов через С ROL/ROR (те же самые 16 тактов на байт). Но если нужна особая перестановка, то использование BST/BLD, конечно, без вариантов.
Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ
Актуальность репозитория: 22 апреля 2026 года
Если чего-то не хватает с сайта st.com - пишите, докачаю.
/!\ Обновлений для STM32PowerMon и STM32PowerMon-UCPD временно не будет.
Актуальность репозитория: 22 апреля 2026 года
Если чего-то не хватает с сайта st.com - пишите, докачаю.
/!\ Обновлений для STM32PowerMon и STM32PowerMon-UCPD временно не будет.
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1903
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: Хитрые, необычные алгоритмы и код
Ser60, для AVR, PIC, STM8/32, CH32, GD32, APM32, Teensy, ESP32 и другие.
Пo I2c oсобенно эффективно для МК с небольшим количеством пинам и ресурсам, при наличии других периферийных устройств на стандартном I2c. Прогр. код для комуникации с дисплея уже написан и не нужно писать новый (bit-banging).

---
Нашел для APM (Keil, arm_acle.h), спасибо, буду использовать.
П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);
}- КРАМ
- Друг Кота
- Сообщения: 25121
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Хитрые, необычные алгоритмы и код
[uquote="Ser60",url="/forum/viewtopic.php?p=4758428#p4758428"]Кроме того, для использования аппаратного SPI (не I2C) драйвера с TM1637 в них имеется выбор засылки данных начиная с msb или с lsb, так что программное инвертирование битов не требуется. В аппаратных I2C драйверах такого выбора не встречал, так что может иметь смысл. Однако, при программной реализации I2C можно выталкивать биты сдвигом байта влево или вправо, так что дополнительное инвертирование порядка битов не требуется.[/uquote]
Инвертирование порядка бит является фундаментальной процедурой FFT. Именно поэтому в любом процессоре рассчитанном на БПФ есть реверс битов как отдельная инструкция.
Инвертирование порядка бит является фундаментальной процедурой FFT. Именно поэтому в любом процессоре рассчитанном на БПФ есть реверс битов как отдельная инструкция.
Re: Хитрые, необычные алгоритмы и код
[uquote="HardWareMan",url="/forum/viewtopic.php?p=4758459#p4758459"]Для простого разворота я всегда использовал пару сдвигов через С ROL/ROR (те же самые 16 тактов на байт). Но если нужна особая перестановка, то использование BST/BLD, конечно, без вариантов.[/uquote]Для байта то - зачем так? Неужто нет места на один 256-байтный массив? Для архитектур, где нет спец.команды, проще и быстрее имхо - трансляцией через массив.
- Starichok51
- Модератор
- Сообщения: 19039
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Хитрые, необычные алгоритмы и код
jcxz, какой, на хрен, 256-байтный массив, чтобы развернуть биты в одном байте?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: Хитрые, необычные алгоритмы и код
[uquote="Starichok51",url="/forum/viewtopic.php?p=4758921#p4758921"]jcxz, какой, на хрен, 256-байтный массив, чтобы развернуть биты в одном байте?[/uquote]А что не так?
Исходное значение - индекс массива, результат = значению по данному индексу.
Исходное значение - индекс массива, результат = значению по данному индексу.
- Starichok51
- Модератор
- Сообщения: 19039
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Хитрые, необычные алгоритмы и код
jcxz, а если понадобиться развернуть двухбайтовое число, ты предложишь массив из 65536 байт?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- КРАМ
- Друг Кота
- Сообщения: 25121
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Хитрые, необычные алгоритмы и код
[uquote="Starichok51",url="/forum/viewtopic.php?p=4758968#p4758968"]а если понадобиться...?[/uquote]
В этом нет никакого смысла. поскольку проблема разворота бит - это проблема отсутствия адресации бит.
Поэтому двух, трех, четырех и так далее байтовые слова разворачиваются сначала внутри байтов и затем реверсируются адресным путем уже байты в слове, только действием с указателем.
В этом нет никакого смысла. поскольку проблема разворота бит - это проблема отсутствия адресации бит.
Поэтому двух, трех, четырех и так далее байтовые слова разворачиваются сначала внутри байтов и затем реверсируются адресным путем уже байты в слове, только действием с указателем.
- Starichok51
- Модератор
- Сообщения: 19039
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Хитрые, необычные алгоритмы и код
КРАМ, извини, но вопрос был задан не тебе.
и еще я не спрашивал, какие способы существуют и сколько их.
я спросил про конкретный способ, который предлагает jcxz.
и еще я не спрашивал, какие способы существуют и сколько их.
я спросил про конкретный способ, который предлагает jcxz.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.