Хитрые, необычные алгоритмы и код

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 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++ обязательно потребует изменений в коде.
safocl
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Пн мар 18, 2024 22:04:17

Re: Хитрые, необычные алгоритмы и код

Сообщение 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] -- какие же в коде должны быть изменения? Я как и впредь предложу обратить внимание на тот факт -- что ты возможно пытаешься не там изменять для достижения своей цели? Такое называется "костылями" как я считаю.

Остальное входит в разряд повторений и по таким ответам я больше не буду по кругу ходить -- читай выше -- можешь спросить, как реально все работает -- я постараюсь ответить, что бы больше таких постов не возникало... Только если есть вопрос, лучше его задать поконкретнее.
Вячеслав М.
Нашел транзистор. Понюхал.
Сообщения: 174
Зарегистрирован: Пн янв 13, 2025 15:24:02

Re: Хитрые, необычные алгоритмы и код

Сообщение Вячеслав М. »

У меня джиттера нет, ввод/вывод происходит после прерывания когда процессор спал, засыпает он всегда не позднее 950 мкс, когда завершит все текущие одномиллисекундные задачи. Сначала все активные задачи основные, после процессор запускает ADC на 700_й микросекунде, по очереди каналы, сам находится во сне во время работы ADC, просыпается только переключить канал и сохранить результат, после в сон до прерывания 1 миллисекунда, далее уже повторю - ввод/вывод по SPI.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Хитрые, необычные алгоритмы и код

Сообщение Gudd-Head »

Эт чё за херня?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Вячеслав М.
Нашел транзистор. Понюхал.
Сообщения: 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: Хитрые, необычные алгоритмы и код

Сообщение 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;
}
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Хитрые, необычные алгоритмы и код

Сообщение Gudd-Head »

А практически все ноги современных МК по входу - триггеры Шмитта.
Хочется сказать, что ноги завязаны на тактовую частоту МК
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25121
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Хитрые, необычные алгоритмы и код

Сообщение КРАМ »

[uquote="Gudd-Head",url="/forum/viewtopic.php?p=4757845#p4757845"]ноги завязаны на тактовую частоту МК[/uquote]
Это зависит от архитектуры. Но программное чтение порта несомненно завязано. Однако ТШ сам по себе способен вызвать джиттер, Особенно для сигналов с не крутыми фронтами.
Есть пины способные работать асинхронно с внутренней аппаратной периферией. И тогда ТШ станет камнем преткновения.
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3780
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: Хитрые, необычные алгоритмы и код

Сообщение Ser60 »

[uquote="veso74",url="/forum/viewtopic.php?p=4757753#p4757753"]Простой способ изменить порядок битов в байте.[/uquote]Хорошая идея, но неплохо было-бы уточнить для какого процессорa. Понятно, что на С будет работать на любом, но в АРМ это делается одной командой RBIT процессора. Кроме того, для использования аппаратного SPI (не I2C) драйвера с TM1637 в них имеется выбор засылки данных начиная с msb или с lsb, так что программное инвертирование битов не требуется. В аппаратных I2C драйверах такого выбора не встречал, так что может иметь смысл. Однако, при программной реализации I2C можно выталкивать биты сдвигом байта влево или вправо, так что дополнительное инвертирование порядка битов не требуется.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Хитрые, необычные алгоритмы и код

Сообщение 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
Аватара пользователя
HardWareMan
Мучитель микросхем
Сообщения: 429
Зарегистрирован: Ср сен 02, 2015 07:47:20

Re: Хитрые, необычные алгоритмы и код

Сообщение 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, конечно, без вариантов.
Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ
Актуальность репозитория: 22 апреля 2026 года
Если чего-то не хватает с сайта st.com - пишите, докачаю.
/!\ Обновлений для STM32PowerMon и STM32PowerMon-UCPD временно не будет.
veso74
Поставщик валерьянки для Кота
Сообщения: 1903
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: Хитрые, необычные алгоритмы и код

Сообщение 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);
}
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 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. Именно поэтому в любом процессоре рассчитанном на БПФ есть реверс битов как отдельная инструкция.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Хитрые, необычные алгоритмы и код

Сообщение jcxz »

[uquote="HardWareMan",url="/forum/viewtopic.php?p=4758459#p4758459"]Для простого разворота я всегда использовал пару сдвигов через С ROL/ROR (те же самые 16 тактов на байт). Но если нужна особая перестановка, то использование BST/BLD, конечно, без вариантов.[/uquote]Для байта то - зачем так? Неужто нет места на один 256-байтный массив? Для архитектур, где нет спец.команды, проще и быстрее имхо - трансляцией через массив.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19039
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Хитрые, необычные алгоритмы и код

Сообщение Starichok51 »

jcxz, какой, на хрен, 256-байтный массив, чтобы развернуть биты в одном байте?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Хитрые, необычные алгоритмы и код

Сообщение jcxz »

[uquote="Starichok51",url="/forum/viewtopic.php?p=4758921#p4758921"]jcxz, какой, на хрен, 256-байтный массив, чтобы развернуть биты в одном байте?[/uquote]А что не так?
Исходное значение - индекс массива, результат = значению по данному индексу.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19039
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Хитрые, необычные алгоритмы и код

Сообщение Starichok51 »

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: Хитрые, необычные алгоритмы и код

Сообщение Starichok51 »

КРАМ, извини, но вопрос был задан не тебе.
и еще я не спрашивал, какие способы существуют и сколько их.
я спросил про конкретный способ, который предлагает jcxz.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Ответить

Вернуться в «Разные вопросы по МК»