С чего Вы взяли, что данный алгоритм нахождения медиан из 3 или 5 числе не универсален?
Алгоритмы лучше описывать псевдокодом, или на всем понятном Си. Разбор алгоритма на относительно новом языке должен начинаться с изучения этого языка - а оно точно надо?
Добавлено after 2 minutes:
ПростоНуб писал(а):
алгоритм нахождения медиан из 3 или 5 числе не универсален?
Универсален. Называется пузырьковая сортировка. На таких масштабах работает превосходно.
С чего Вы взяли, что данный алгоритм нахождения медиан из 3 или 5 числе не универсален?
Алгоритмы лучше описывать псевдокодом, или на всем понятном Си.
"Отучаемся говорить за всю сеть" (с) Я плохо представляю, насколько деформировано Ваше сознание, но сейчас полно разработчиков на МК, которые C вообще не знают, вполне себе обходясь MicroPython, JS или тем же Rust.
Каких таких? У меня медианный фильтр, например, сейчас применяется при обработке потока от ADC по DMA на ESP32-C3 с SPS на 200 КГц в течении 120-130 мс (смотря когда синусоида 50 Гц ноль пересечет). Ну да, это не 256 мегабайт, как в коде выше, а всего лишь 3.3-3.4 мегабайт. Но это тоже не мало.
сейчас полно разработчиков на МК, которые C вообще не знают, вполне себе обходясь MicroPython, JS или тем же Rust
Если это так, то это жопа - искусство программирования стагнирует в ремесло.
_________________ Платы для HLDI - установки лазерной засветки фоторезиста. ФоторезистыOrdyl Alpha 350 и AM 140. Жидкое олово для лужения плат (видео) - самое лучшее и только у меня. Паяльная маска XV501T-4 и KSM-S6189 (5 цветов). Заказ печатных плат - pcbsmac@gmail.com
Поэтому универсальных и алгоритмов не так уж и много. А хитрые, как правило, работают на узкой платформе.
А вот я придумал, как на 1 ногу МК повесить кнопку и светодиод, чтобы они работали независимо. Имхо, такого варианта, вроде, не было. Из накладных расходов 1 резистор аппаратно... И это будет работать на любых МК, допускающих вытекающий ток светодиода на своем пине.
Итак: на пин анодом ставится светодиод с резистором. Так же на пин ставится кнопка на общий с последовательным резистором в 1К. Регистр "направления" пина, использую AVRовскую терминологию, DDRn управляет свечением светодиода, регистр подтяжки PORTn всегда 1 (если у МК есть регистр выхода пина, то туда выводим тоже 1). По прерыванию (или в момент иного опроса кнопки) DDRn ставится в 0, и производится опрос регистра ввода PINn, если там 0, то кнопка нажата. А потом DDRn снова принимает уровень, нужный для светодиода (0 не горит, 1 горит). На время опроса пина светодиод не горит, но, т.к. длится это буквально 3-4 такта, этого не заметно.
Что скажете?
Добавлено after 4 minutes: Основная идея алгоритма основана на том, что подтяжка пина не способна обеспечить светодиод достаточным для свечения током. Например, у AVR подтяжка эквивалентна примерно 70К. Так же, нажатие кнопки шунтирует светодиод резистором 1К, что не перегружает пин и не влияет на яркость светодиода, но однозначно просадит подтяжку, когда DDRn переведется на ввод.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Основная идея алгоритма основана на том, что подтяжка пина не способна обеспечить светодиод достаточным для свечения током. Например, у AVR подтяжка эквивалентна примерно 70К.
У STM32 подтяжка 25-55К и светодиод чуть светится, по крайней мере в темноте будет видно.
медианные фильтры применяются вообще то к сигналам, да еще и в реальном времени.
Эти нюансы заботят только программиста. Для МК же всё равно, что там и как - задача чисто математическая: отсортировать несколько значений и выбрать среднее.
сейчас полно разработчиков на МК, которые C вообще не знают, вполне себе обходясь MicroPython, JS или тем же Rust
Если это так, то это жопа - искусство программирования стагнирует в ремесло.
Когда то, свыше полувека назад, Кнут для своей книги "Искусство программирования" использовал даже не С, а абстрактный MIX ассемблер. 20 лет назад он отказался от него в пользу RISC ассемблера. Следует ли из этого, что искусство программирования возможно только на ассемблере? То есть на C или Rust искусство программирования уже невозможно? А создать что-то вроде VS Code или Apache Airfow уже не искусство? Пока Вы будете писать HTTP(S) или MQTT сервер на ассемблере, он станет уже никому не нужен, в связи с развитием технологий. На гитхабе валяются несколько подобных заброшенных проектов для ESP8266, ставших ненужными после выхода ESP32 и, тем более, после перехода Espressif c Tensilica на RISC-V. Даже для ESP32 эффективный ассемблерный код стал резко проигрывать C и Rust с появлением в ESP32-S3 SIMD инструкций. Потому что код на языке высокого уровня достаточно просто перекомпилировать, а вот ассемблерный код нужно переписывать. Боюсь, Ваша терминология и семантика слова "искусство" очень далеки от общепринятых. Искусство программирования - это разработка эффективной архитектуры решения с выбором наиболее подходящих средств для её реализации. И без разницы, какие языки там будут использоваться. Java для Kafka, Erlang для MQTT, JS для WebApi или Rust с ассемблерными вставками в HAL.
медианные фильтры применяются вообще то к сигналам, да еще и в реальном времени.
Эти нюансы заботят только программиста. Для МК же всё равно, что там и как - задача чисто математическая: отсортировать несколько значений и выбрать среднее.
Сотни тысяч раз в секунду. Еще раз, это надо делать в реальном времени при обработке сигнала. Вы своей пузырьковой сортировкой, проигрывающей эффективному вычислению медианы на порядок, в ряде случаев вообще не успеете фильтровать сигнал. Причем, если код пузырьковой сортировки на ESP32-S3 не может быть реализован SIMD инструкциями, то мой код LLVM backend замечательно генерирует с использованием SIMD. В последнем случае, разница в производительности уже приближается к двум порядкам.
пузырьковой сортировкой, проигрывающей эффективному вычислению медианы на порядок
При работе с большими массивами это верно. При работе с пятью переменными - вряд ли. Уж точно не на порядок.
При чем тут массивы? Вы вообще знаете что такое медианный фильтр? Это вычисление медианы по заданному окну для каждого мгновенного значения сигнала. Если медианный фильтр применяется к потоку по DMA от ADC с SPS 400 КГц, то эта самая медиана с пятью переменными должна вычисляться 400 тысяч раз секунду. Если не будете успевать, то рано или поздно любой буфер переполнится.
искусство программирования возможно только на ассемблере?
да, и еще тысячу раз да! ни один компилятор с языка высокого уровня с любой оптимизацией не сравнится с программированием на ассемблере. на ассемблере можно делать такие "чудеса", на которые не способен никакой компилятор с языка высокого уровня. к тому же, рабочий код (хекс) с ассемблера в несколько раз короче аналогичного кода на Си.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
на ассемблере можно делать такие "чудеса", на которые не способен никакой компилятор с языка высокого уровня.
Можно, да. Но с каждым годом становится всё меньше и меньше человеков на это способных... Поэтому скоро ваша фраза будет звучать как: на ассемблере теоретически можно делать такие "чудеса", на которые не способен никакой компилятор с языка высокого уровня.
можно делать такие "чудеса", на которые не способен никакой компилятор.
К сожалению, чаще всего у этих человеков на выходе получается АСМ-спагетти-код. Потому что в погоне за беспонтовой компактностью и никчемной скоростью получается откроенная каша, поддерживать которую невозможно ни сейчас, ни в будущем. АСМ имеет смысл для написания самых критичных функций библиотек, которые в конце концов будут использованы в Си коде.
А не надо ничего поддерживать. Написал один раз идеальный код, и он потом сам
Бред сивой кобылы. Поддержка кода - это не исправление ошибок. Это возможность его модернизации под дополнительные задачи в существующем изделии, либо при использовании кода в другом изделии с иными вводными, что требует модификации кода.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения