![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
...или "не поймите меня правильно".
Раньше я частенько забавлялся подобными логически безупречными фразами, которые при ближайшем рассмотрении вызывают небольшой когнитивный диссонанс (требуются ли пояснения, почему? ;)).
Но вот сегодня я осознал всю глубину своего невежества.
И ведь дело-то в чём?! В простейшем электронном устройстве - элементарном RS-триггере!

Не знакомым с логикой и электроникой будет трудно оценить (или переоценить... или недооценить). Но я всё равно напишу, потому как познавательно. И потому как вспоминаю, что всё-таки программист, и было бы совсем не худо дискуссионные вопросы и мысли в блоге излагать, а не только на специализированных форумах.
В общем, спросили меня про вот эту формулу в википедийной статье про триггер:
К стыду своему, знак в виде лежащей на боку галочки (венъюнкция) я увидел впервые.
В общем, навскидку понятно, что тут в формальную математическую запись упихали состояние памяти. Ну там ссылка есть, где написано, что за зверь такой - секвенциальная логика.
Здесь уместно небольшое "философское" отступление.
Математика - это специальный язык (для формализации), одно из свойств которого - упрощение записи, свёртка обычного текста, описывающего явление или процесс.
Ну вот есть у нас файл большой и здоровый, и мы сжимаем его архиватором, чтобы уменьшить размер, сэкономить трафик и всё такое. И здесь у нас есть описание поведения триггера на обычном человеческом языке, которое проходит ряд последовательных трансформаций (переводов на формальные математические языки), в результате чего запись становится всё более короткой и всё менее понятной ;)
Начинаем, как водится, с неформального словесного описания: выходной сигнал триггера Q устанавливается в 1 импульсом по входу S (Set) и сбрасывается импульсом по входу R (Reset), сохраняя состояние при отсутствии обоих входных сигналов.
Попытка формализовать описание начинается с перечисления всех возможных случаев. Получается таблица состояний:
Разумеется, таблица обычно компактнее словесного описания, но, главное, она не даст возможности забыть и упустить из виду какой-либо вариант! Чем и ценна.
Ну, рассмотренный случай проще некуда, а для реальных логических схем таблица разрастётся до невозможности, поэтому напрямую используется редко.
Проведём следующий сеанс упаковки математическим формализмом (алгебра логики).
Но обычная (комбинационная) логика не допускает таких понятий, как "не определено"!
Что делать? Договориться, чему должен быть равен результат при единице на обоих входах.
Проще всего его обнулить. Тогда получим систему:
1) Q = 0, R=1
2) Q = Q | S, R=0
То есть вход сброса получает приоритет, и плевать на другой сигнал вообще, как и на прежнее значение выхода.
Собственно, так я всегда и делал в своих системах имитационного моделирования. Просто потому, что один раз принял такое, довольно логичное, решение - и сегодня напрочь забыл о том, что чисто с математической стороны (как и со стороны электроники) неопределённость разрешается по-другому...
Ну а дальше по цепочке - произведём ещё одно сжатие записи, применив операцию венъюнкции, которую, вероятно, изучают математики, но далеко не все инженеры:
Таким образом, всё выглядит точь-в-точь как в приведённой аналогии с размером файла: более высокая степень сжатия требует усложнённого способа упаковки и, соответственно, увеличения накладных расходов на работу архиватора! ;)
Всё бы хорошо, но вернёмся к невежеству.
Честно признаюсь, мне эта запись в принципе не нравится. Потому что хоть она и компактна, я её нифига не понимаю. Да, я прочитал Википедию и справочник. И этого не хватило. И да, мне лениво искать и читать учебник. Потому я вижу, что где-то здесь ошибка. Но серьёзные люди считают, что всё в порядке. И я оставляю своё непонимание до лучших времён, которые вряд ли когда настанут.
«Муки совести переносимы» – вот одно из маленьких неприятных открытий, которые делаешь с возрастом. (Стругацкие, "Волны гасят ветер")...
Раньше я частенько забавлялся подобными логически безупречными фразами, которые при ближайшем рассмотрении вызывают небольшой когнитивный диссонанс (требуются ли пояснения, почему? ;)).
Но вот сегодня я осознал всю глубину своего невежества.
И ведь дело-то в чём?! В простейшем электронном устройстве - элементарном RS-триггере!

Не знакомым с логикой и электроникой будет трудно оценить (или переоценить... или недооценить). Но я всё равно напишу, потому как познавательно. И потому как вспоминаю, что всё-таки программист, и было бы совсем не худо дискуссионные вопросы и мысли в блоге излагать, а не только на специализированных форумах.
В общем, спросили меня про вот эту формулу в википедийной статье про триггер:
К стыду своему, знак в виде лежащей на боку галочки (венъюнкция) я увидел впервые.
В общем, навскидку понятно, что тут в формальную математическую запись упихали состояние памяти. Ну там ссылка есть, где написано, что за зверь такой - секвенциальная логика.
Здесь уместно небольшое "философское" отступление.
Математика - это специальный язык (для формализации), одно из свойств которого - упрощение записи, свёртка обычного текста, описывающего явление или процесс.
Ну вот есть у нас файл большой и здоровый, и мы сжимаем его архиватором, чтобы уменьшить размер, сэкономить трафик и всё такое. И здесь у нас есть описание поведения триггера на обычном человеческом языке, которое проходит ряд последовательных трансформаций (переводов на формальные математические языки), в результате чего запись становится всё более короткой и всё менее понятной ;)
Начинаем, как водится, с неформального словесного описания: выходной сигнал триггера Q устанавливается в 1 импульсом по входу S (Set) и сбрасывается импульсом по входу R (Reset), сохраняя состояние при отсутствии обоих входных сигналов.
Попытка формализовать описание начинается с перечисления всех возможных случаев. Получается таблица состояний:
S | R | Q |
0 | 0 | Qn-1 (сохраняет состояние) |
0 | 1 | 0 (сброс) |
1 | 0 | 1 (установка) |
1 | 1 | ? (неопределённое состояние) |
Разумеется, таблица обычно компактнее словесного описания, но, главное, она не даст возможности забыть и упустить из виду какой-либо вариант! Чем и ценна.
Ну, рассмотренный случай проще некуда, а для реальных логических схем таблица разрастётся до невозможности, поэтому напрямую используется редко.
Проведём следующий сеанс упаковки математическим формализмом (алгебра логики).
Но обычная (комбинационная) логика не допускает таких понятий, как "не определено"!
Что делать? Договориться, чему должен быть равен результат при единице на обоих входах.
Проще всего его обнулить. Тогда получим систему:
1) Q = 0, R=1
2) Q = Q | S, R=0
То есть вход сброса получает приоритет, и плевать на другой сигнал вообще, как и на прежнее значение выхода.
Собственно, так я всегда и делал в своих системах имитационного моделирования. Просто потому, что один раз принял такое, довольно логичное, решение - и сегодня напрочь забыл о том, что чисто с математической стороны (как и со стороны электроники) неопределённость разрешается по-другому...
Ну а дальше по цепочке - произведём ещё одно сжатие записи, применив операцию венъюнкции, которую, вероятно, изучают математики, но далеко не все инженеры:
Таким образом, всё выглядит точь-в-точь как в приведённой аналогии с размером файла: более высокая степень сжатия требует усложнённого способа упаковки и, соответственно, увеличения накладных расходов на работу архиватора! ;)
Всё бы хорошо, но вернёмся к невежеству.
Честно признаюсь, мне эта запись в принципе не нравится. Потому что хоть она и компактна, я её нифига не понимаю. Да, я прочитал Википедию и справочник. И этого не хватило. И да, мне лениво искать и читать учебник. Потому я вижу, что где-то здесь ошибка. Но серьёзные люди считают, что всё в порядке. И я оставляю своё непонимание до лучших времён, которые вряд ли когда настанут.
«Муки совести переносимы» – вот одно из маленьких неприятных открытий, которые делаешь с возрастом. (Стругацкие, "Волны гасят ветер")...
no subject
Date: 2016-08-18 08:39 am (UTC)no subject
Date: 2016-08-18 08:42 am (UTC)Только у меня всё это и есть основной хлеб :)
no subject
Date: 2016-08-18 09:29 am (UTC)no subject
Date: 2016-08-18 09:49 am (UTC)no subject
Date: 2016-08-20 05:56 am (UTC)А я еще вот лично видел буквально на этой неделе аппарат, у которого оба входа на триггер это Т-выходы с других триггеров причем со встроенными кондерами, то есть сигнал идет при превышении определенного порога и только. Как вот их звонить нормально? Подумай об этом. Порви себе мозг. И поставь себя на мое место (ребенок внутри визжит "Дииимааааа! Ну когда уже ты из отпуска???")
:-)
P.S. А оказалось, что непостижимым образом ground signal на плате коротнулся от одного из входных с выходным. В результате чего аппарат впал в маразм, как ты понимаешь.
no subject
Date: 2016-08-20 07:24 pm (UTC)Ну да, с триггером ясно. От реализации зависит. А у меня не железо, а софт, который не должен допускать неопределённостей...
no subject
Date: 2016-08-20 08:41 pm (UTC)Например в большинстве кассовых аппаратах есть батарайка "таблетка" на матплате (тут правда это называется БУ, блок управления). Три вольта ноль целых хрен десятых ампер. При этом аппарат может жрать 24 вольта и 2.5 ампера снаружи, но! Цепь устроена таким образом, что в случае, когда батарейка "провисает", иногда на наш любимый лпц1768 приходит вроде бы не ноль, а "что-то там, вроде бы единица, я хрен знает". И чем больше стареет батарейка, тем чаще такое происходит. Ну и результаты, как ты понимаешь, самые своеобразные. И хорошо если спроектировано нормально и проц просто уходит в техсброс. Тогда хотя бы понятно, в чем дело.
Ну и вот ты берешь БУ и решаешь заменить батарейку а она не на колодке, как у нормальных людей, а приварена за контакты в плату (не припаяна, да, приварена!). Свинчиваешь плату (четыре болта, два крепления rs-232), выпаиваешь концы, впаиваешь колодку, ставишь батарейку, а, черт, задел транзистор, это зря, ой зря, ладно щас на всякий случай новый поставим БЛЯДЬ! А тут какой стоял, PNP или NPN? Черт, это ж фуджитсу, к нему инструкции-то нет не на японском....
Вот что не так, дружище, и вот чем софт отличается от харда. Надеюсь, я объяснил если не суть, то эмоцию.
no subject
Date: 2016-08-20 08:46 pm (UTC)Но мы-то делаем микропроцессорные устройства, где вся функциональность задаётся софтом.
И я как раз хотел сказать, что софт должен работать по известным (потребителю) правилам, а не по взятым с потолка умолчаниям.
А с этим завсегда проблема.
no subject
Date: 2016-08-20 08:55 pm (UTC)- развинтить аппарат и добраться до проца
- вытащить его из колодки
- найти колодку программатора (тут важно не перепутать, их ажно три под этот размер, нам нужна та где на конце 28U а еще маркером на жопе написано ОРИОН)
- вставить процессор в колодку
- вспомнить, как эта колодка правильно вставляется в программатор ChipProg
- отодрав бумажку с гостом посмотреть какой именно у нас процессор (ну там winbond или atmel 24c256 или там philips p89c51d2)
- обнулить его, загрузив соответственный блок в программатор и нажав "начать"
Но так никто и никогда не делает. Делают знаешь как?
Включают аппарат и замыкают отверткой конденсатор, обозначенный на принципиальной схеме как С37. И в проц приходят те самые "две единицы" на вторую и седьмую ногу. По сути, происходит нечто, чего не может быть, потому что не может быть никогда. Проц говорит "охнихуясебе" и обнуляется самостоятельно.
Вот так-то. И этого ты никогда не сможешь полностью учесть, работая только с софтом.
no subject
Date: 2016-08-20 09:41 pm (UTC)Только "полностью учесть" мне не надо - я ж не занимаюсь моделированием какой-то машинки. Я даю инструмент для управления ею.
Собственно, чем мне и нравится высокоуровневое программирование - оно абстрагируется от аппаратной части и всегда должно делать то, что должно. Иначе подсистема самодиагностики должна сказать, что ящик неисправен и выдать на реле отказ.
Пляски с бубном начинаются немного в других местах - в многопроцессорных системах, где есть фоновые процессы и прерывания, где есть одинаковая обработка запросов от USB и от специального контролера связи, подключенного через двухпортовую память, и т.д. и т.п. во множестве вариантов.
И воевать приходится не с железом (с ним разобрались, написав однажды фильтры входных сигналов и самодиагностику), а с взаимодействием разных программных компонентов в разнородной среде... Как-то так. :)
no subject
Date: 2016-08-21 02:32 pm (UTC)И вот ты вытаскиваешь из коробки новый аппарат, с новым шнуром, тык - и ноль. Ты прозваниваешь БП. Ты прозваниваешь аппарат. Весь (если ты думаешь, что это легко и быстро, ты зря так думаешь). Ты прозваниваешь шланг (это я по первости все честно делал, да). А потом выясняется, что "порт занят приложением AVR Studio". То есть он его забрал, пока я штрих-фрк прошивал, и назад не отдает. Забыл. Ему видите ли нужнее.
И главное, ты не понимаешь, как. Базовые админские навыки у тебя вроде есть, но тут что-то неясное происходит. Слава Зевсу, у меня есть волшебное заклинание. А именно,
— КИРИЛЛ!!!
Он разберется. Точно так же как я разберусь если ему понадобится физика (он сам паяльника побаивается).
no subject
Date: 2016-08-22 09:15 am (UTC)Но вот когда порт честно освобождён, но продолжает быть недоступным - приходится ругаться на "самый большой вирус". Вплоть до перезагрузки компа...
И ещё одна штука есть: USB как программно-аппаратный комплекс не предназначен для бесперебойной работы 24х7. Что постоянно и демонстрирует. Ладно, что в 90% случаев лечится перетыканием кабеля...