Типы брандмауэров

часть 2 Варианты обхода брандмауэров
часть 3 IDS Системы обнаружения вторжений
часть 4 Варианты обхода IDS
часть 5 Honeypot, типы и обнаружение

Брандмауэры, вероятно, являются одной из самых распространенных вещей, о которых люди думают, когда речь идет о безопасности. Мы собираемся рассмотреть множество различных способов, которыми брандмауэры защищают системы, рассмотреть различные архитектуры брандмауэров и рассмотреть различные способы, которыми они защищают эти системы от определенных классов атак. Брандмауэры — очень фундаментальный элемент управления безопасностью, и это одна из вещей, о которых мы чаще всего думаем, когда слышим о безопасности информационных систем. Брандмауэры стали настолько распространены, что в наши дни даже дома вы часто найдете несколько брандмауэров. В Windows есть встроенный брандмауэр, в большинство домашних маршрутизаторов встроен брандмауэр, и как только мы перейдем к корпоративным сетям, у нас обычно будет несколько брандмауэров, часто это очень высококлассное оборудование, защищающее различные системы в сети. Брандмауэры являются основой контроля безопасности. Существует множество различных архитектур брандмауэров, и вскоре мы рассмотрим некоторые из них. Очень часто межсетевые экраны располагаются между разными сегментами сети. Вы можете найти брандмауэр, правильно настроенный для пропуска веб- трафика, но это не остановит злоумышленника, доставляющего полезную нагрузку через HTTP с использованием порта 80.

Брандмауэры, как правило, контролируют двунаправленный поток трафика, поэтому представьте себе брандмауэр перед организацией, отделяющий ее от общедоступного Интернета. Он должен иметь возможность блокировать входящий трафик, чтобы попытаться удержать злоумышленников, но он также должен иметь возможность разрешать исходящий трафик, потому что людям нужно просматривать веб-страницы, отправлять электронные письма и иметь связь, которая выходит за пределы сети.

Реализации брандмауэра

Мы часто используем термин брандмауэр, но он может означать очень разные реализации концепции, и, вероятно, одним из самых основных приложений брандмауэра является брандмауэр Windows, встроенный в современные версии операционных систем. Это довольно простой брандмауэр. Он определит разрешенные классы входящего трафика и классы исходящего трафика. Это хост-брандмауэр, работающий на компьютерах. Представьте, что ваш компьютер находится в вашей собственной доверенной сети, но у вас все еще есть брандмауэр между вашей машиной и любой другой машиной в ней. Часто у вас будет несколько разных классов брандмауэров для разных точек в сетевой среде. Я говорю только о небольшой домашней сети, но то же самое верно и для организационных сетей. Одна вещь, которая сильно отличается между личным решением и корпоративной средой, заключается в следующем. На предприятии вы увидите такое оборудование, как межсетевой экран Cisco. Это физическое устройство, устанавливаемое в стойку, и этот класс машин предназначен для сегментации сети, о которой мы говорили ранее. Он предназначен для размещения между сегментами общедоступной сети и сегментами частной сети. Мы также видим аппаратные брандмауэры, встроенные в такие устройства, как домашние маршрутизаторы, за исключением того, что они предназначены для совершенно другого класса использования, но предпосылка наличия брандмауэра, который является просто программным продуктом, по сравнению с брандмауэром, который является выделенной частью инфраструктуры, одна и та же. Действительно, многие вещи, которые делают эти два различных класса межсетевых экранов, также очень похожи. Например, большинство из них выполняют простую фильтрацию пакетов.

Архитектура брандмауэра

Мы рассмотрим три различные архитектуры брандмауэров, но я хочу начать с определения, и это важно, и оно относится не только к брандмауэрам, но и к любому хосту, который полностью подвержен атаке. Концепция бастионного брандмауэра заключается в том, что это будет брандмауэр, обращенный к общедоступной сети. Перед ним нет защиты. Он должен нести все последствия атаки, направленной на сеть. Хост-бастион является критически важной частью инфраструктуры просто потому, что это первая линия обороны. Это термин, который используется не только для брандмауэров, но и для любого актива, который полностью подвержен атаке. Он находится между Интернетом и внутренней сетью, выступая в качестве первой линии защиты, и полностью незащищен. Хост-бастион все еще может иметь пару разных реализаций, так, например, это может быть односетевой брандмауэр, чтобы у него был один сетевой интерфейс, и весь трафик входил и выходил через этот интерфейс, а затем программное обеспечение сделало бы фильтрацию. Он может быть двухсетевым, чтобы иметь два сетевых интерфейса, и действительно, это более типичная реализация, особенно в продуктах коммерческого уровня. Мы говорим о внешнем трафике, поступающем в один порт, и внутреннем трафике через другой. У нас по-прежнему есть программное обеспечение для фильтрации и определения того, какой трафик проходит, а какой отбрасывается, но у нас есть большая сегментация сетей благодаря двум сетевым адаптерам, также известным как карты сетевого интерфейса. Это брандмауэр узла-бастиона, поэтому давайте перейдем к следующему, называемому брандмауэром экранированной подсети. Экранированный брандмауэр подсети также называется тройным брандмауэром, который будет иметь три сетевых интерфейса и разделяет трафик на три логических сетевых сегмента. Есть общедоступный интернет, внутренняя сеть, так что это будет то же самое, что и типичный бастион с двойным подключением.

Немного о DMZ

Идея DMZ заключается в том, что мы говорим о сети демилитаризованных зон. Проще говоря, DMZ — это не что иное, как отдельная подсеть в сети. Он содержит активы, которые вы хотите выставить на всеобщее обозрение, поэтому он должен быть доступен через Интернет. Одна и та же подсеть также будет доступна для внутренней сети, хотя для каждой из них могут быть доступны разные службы. Это распространенная структура для организации, где у них есть активы, которые они хотели бы выставить на всеобщее обозрение, и у них есть другие активы, а именно их внутренняя сеть, которую они хотят отделить. Брандмауэр экранированной подсети должен быть в состоянии обеспечить наличие этих средств контроля доступа. С обоими типами брандмауэров мы по-прежнему хотим, чтобы трафик шел во всех направлениях. Например, мы хотим, чтобы внутренняя сеть могла отправлять HTTP- запросы в Интернет, поэтому брандмауэр должен пропускать этот трафик, а затем нам нужны ответы, поэтому он должен разрешить HTTP через порт 80 и неизбежно порт 443 для HTTPS, он должен позволить этому трафику вернуться во внутреннюю сеть. Это снова двунаправленный поток трафика. В таком случае также необходимо разрешить HTTP-запросам из Интернета проходить в демилитаризованную зону, а затем возвращать эти ответы. Однако в такой модели мы можем не захотеть, чтобы Интернет создавал FTP-соединения с демилитаризованной зоной. Ничего страшного, если внутренняя сеть FTP подключена к DMZ, потому что именно они контролируют активы на этих внешних веб-сайтах, но это должно быть отделено от самого Интернета в целом. Экранированный брандмауэр подсети должен жонглировать целой кучей различных правил с точки зрения того, откуда и куда может поступать трафик, а также портов и протоколов.

Брандмауэры с фильтрацией пакетов

Брандмауэр с фильтрацией пакетов — одна из наиболее распространенных сегодня реализаций средств контроля безопасности. Обычно вы увидите, что он реализован как модель узла-бастиона, обращенная к атакующим без какой- либо другой линии защиты перед ним. Брандмауэр с фильтрацией пакетов во многих отношениях довольно прост. У нас есть исходный входящий трафик, набор элементов управления на уровне пакетов, а затем допустимый проходящий трафик. Давайте внимательно посмотрим на эти элементы управления. Например, брандмауэр с фильтрацией пакетов может определять допустимые IP-адреса источника и получателя. В одном месте вы можете увидеть, что если есть вредоносный трафик, исходящий с определенного IP-адреса, брандмауэр с фильтрацией пакетов может занести его в черный список и заблокировать любые запросы, поступающие с этого конкретного IP-адреса. Структура самого заголовка TCP также является тем, на что может смотреть брандмауэр с фильтрацией пакетов. Например, что такое исходный и конечный порты? Должен ли брандмауэр разрешать порт 80 для HTTP и порт 443 для HTTPS? Что-то еще не разрешено? протоколы; HTTP это хорошо. Может быть, SMTP тоже хорош, но все остальное, например FTP или ICMP, будет заблокирован? Это довольно рудиментарно, хотя вы можете захотеть заблокировать такие вещи, как FTP, потому что вы беспокоитесь, что он может быть использован для эксфильтрации данных, также могут быть атаки, которые приходят через HTTP, и брандмауэр с фильтром пакетов пропустит эту атаку, потому что он не просматривает сами данные, а также не просматривает любую другую информацию в этих заголовках запросов. Это очень рудиментарный элемент управления, но это первая линия защиты. Далее рассмотрим другие брандмауэры, которые затем могут располагаться за сетью, но помните, что они должны учитывать трафик, идущий с другой стороны.

А как насчет трафика, поступающего с внутреннего сервера и возвращающегося обратно к клиенту? Это важно, потому что, что, если злоумышленник скомпрометировал сам сервер, и теперь он пытается эксфильтровать данные. Брандмауэр с фильтрацией пакетов может ограничить возможность злоумышленника отправлять эти данные обратно из сети. Брандмауэр с фильтрацией пакетов либо пропустит запрос, либо отбросит его, так что он вообще не пройдет. Это очень упрощенная реализация, которая не особенно интеллектуальна, но одна из причин, по которой брандмауэры с фильтрацией пакетов остаются распространенными, заключается в том, что они также недорогие.

Брандмауэр шлюза

С точки зрения модели OSI, также известной как модель взаимодействия компьютерных сетей с открытыми системами, контрольной точкой, на которой выполняются различные атаки и средства контроля, является транспортный уровень. Транспортный уровень также известен как четвертый уровень, и именно здесь, например, TCP-запросы передаются вперед и назад. Когда мы говорим о брандмауэре шлюза на уровне канала, мы собираемся немного подняться по стеку. Мы говорим о сеансовом уровне, также известном как уровень 5, и он находится там как прокладка между прикладным и транспортным уровнями, так что это более высокоуровневая, более абстрактная концепция, чем то, что мы просто рассматриваем в TCP. Много раз, когда вы просматриваете Интернет, вы общаетесь через брандмауэр шлюза на уровне канала. Очень вероятно, что помимо брандмауэра с фильтрацией пакетов, брандмауэр также может выполнять несколько ролей. Роль брандмауэра шлюза на уровне канала заключается в передаче запросов между двумя отдельными хостами, например, клиентом и сервером. Мы можем увидеть, как TCP-запрос поступает на брандмауэр, а затем передается на сервер. В этом примере представьте, что брандмауэр действует как шлюз, а затем ответ вернется через этот брандмауэр и, в конечном итоге, вернется к клиенту. Здесь важно то, что эти две конечные точки, клиент и сервер, никогда не устанавливают прямое соединение. Все проходит через межсетевой экран шлюза на уровне канала. Поэтому этот брандмауэр создает два соединения: одно к клиенту и одно к серверу. Он сидит там и отслеживает такие вещи, как трехстороннее рукопожатие TCP, и, таким образом, он может установить, является ли этот запрос правомерным или нет.

Например, кто-то пытается извлечь данные из сети и как в случае с брандмауэром с фильтрацией пакетов, брандмауэр шлюза на уровне канала по-прежнему будет пропускать большое количество данных, которые потенциально могут быть использованы для злоумышленных целей. Например, если шлюз предназначен для обеспечения HTTP-связи, а клиент активно использует риск SQL-инъекций на самом сервере, то брандмауэр разрешит запросы и ответы через законный HTTP-трафик, по крайней мере, с точки зрения соответствия. к ожидаемой структуре брандмауэра. Например, если это HTTP на порту 80, он пропустит его, но не обеспечит никакой защиты на уровне пакетов. Это просто подтверждает, что эти связи являются законными. Еще одна модель брандмауэра, которую вы обычно видите в таких вещах, как домашние кабельные модемы и маршрутизаторы, и вы часто увидите, как она реализует NAT, также известную как преобразование сетевых адресов, поэтому вы можете иметь несколько клиентов, сидящих за этим брандмауэром, и все они используют один выход в Интернет. Как и брандмауэр с фильтрацией пакетов, это важная часть инфраструктуры, но очень примитивная. Ситуация становится более сложной, когда мы переходим к межсетевому экрану шлюза уровня приложений.

Брандмауэры приложений

Этот брандмауэр находится намного выше в этой модели OSI. Он находится на седьмом
уровне, прямо на вершине стека OSI. Часто вы можете увидеть, что это называется прокси, особенно внутри корпоративных сетей, и они также включают аутентификацию для определения того, кто является клиентом. В некотором смысле он похож на брандмауэр шлюза на уровне канала в том смысле, что он будет ретранслировать эти запросы взад и вперед между двумя разными хостами, но отличается тем, что находится в стеке. Например, мы можем видеть, как он перехватывает HTTP-трафик, но это не просто HTTP, он может сидеть там и просматривать FTP, SMTP или другие протоколы, зависящие от приложения. Важной особенностью брандмауэра шлюза уровня приложений является возможность проверять содержимое трафика. В зависимости от направления трафика этот класс межсетевых экранов может выполнять самые разные задачи. Когда он действует как шлюз, когда клиент находится внутри корпоративной сети и отправляет внешние запросы, он может делать такие вещи, как блокировка определенных сайтов. С другой стороны, когда он сидит перед активом, таким как сервер, он может проверять содержимое трафика, может начать искать типичные схемы атак. Это то, что, например, Cloudflare делает со своим брандмауэром в качестве сервисного продукта. Он задает такие вопросы, как: потенциально ли этот запрос является атакой с внедрением SQL? Шлюзовый брандмауэр прикладного уровня, находящийся на седьмом уровне и способный интерпретировать и понимать содержимое этих запросов, может быть гораздо более эффективным, чем простые реализации, такие как брандмауэр с фильтрацией пакетов. Он будет передавать данные вперед и назад, как и другие брандмауэры. Он должен иметь возможность принимать запросы, а затем отвечать соответствующим образом, но он может сделать это с более высоким уровнем сложности.

Другой пример: если трафик SMTP ходит вперед и назад через этот брандмауэр, он может разрешить приветственный комментарий, который клиент использует для идентификации себя на сервере, но затем он может заблокировать команду проверки, которая часто используется, чтобы установить, имеет ли сервер определенный адрес или нет. Тот же порт, тот же протокол, но гораздо более детальный контроль с точки зрения того, какой трафик идет через брандмауэр. Таким образом, это более высокое состояние осознания того, что делает трафик, а затем то, какой считается хорошим, а какой плохим. Есть еще одна модель брандмауэра, которой я хочу поделиться с вами, — брандмауэр с многоуровневой проверкой состояния.

Брандмауэры с отслеживанием состояния

Межсетевой экран многоуровневой проверки с отслеживанием состояния — это еще одна эволюция предыдущих моделей, о которых мы говорили. Как правило, он сочетает в себе аспекты трех последних рассмотренных нами моделей брандмауэров: фильтрацию пакетов, шлюз на уровне каналов и шлюз на уровне приложений. Мы будем говорить об инспекции, происходящей на нескольких уровнях коммуникации. Мы будем говорить о модели TCP/IP в отличие от модели OSI, но логически обе они охватывают одни и те же аспекты сети. Важно то, что когда мы говорим о многоуровневой проверке с отслеживанием состояния, мы говорим обо всем стеке, то есть о возможности пройти весь путь от этого низкого уровня пакетов TCP до протоколов связи приложений. Это означает, что эта модель брандмауэра может делать все то, о чем мы говорили до сих пор. Например, проверять содержимое HTTP-запросов, но, поскольку он сохраняет состояние, он также может работать с пакетами и запросами и выполнять такие действия, как разрешение пакетов только от известных активных соединений. Он должен смотреть на более широкое понятие, которое представляет собой связь. Это дает ему возможность делать такие вещи, как проверка пакетов с отслеживанием состояния, также известная как SPI, поэтому вместо того, чтобы обрабатывать каждый отдельный сетевой пакет по отдельности, например, брандмауэр без учета состояния, он может использовать подход с отслеживанием состояния и рассматривать пакеты более целостно. Ранее мы рассмотрели такую модель, как брандмауэр с фильтрацией пакетов, который не имеет состояния и не знает, является ли пакет частью существующего соединения или нет. Следовательно, модель с отслеживанием состояния поддерживает соединение. Все это означает, что межсетевой экран многоуровневой проверки с отслеживанием состояния может начать принимать решения о фильтрации на основе совокупных данных, то есть не только информации, которая проходит через него прямо сейчас, и не только отдельных пакетов.

Это привело нас к четырем уровням сложности брандмауэра. Фильтрация пакетов, шлюз на уровне каналов, шлюз на уровне приложений и многоуровневый межсетевой экран с отслеживанием состояния. Все эти классы брандмауэров производятся многими разными производителями, причем множество различных продуктов предназначено для самых разных аудиторий. Существует огромное количество продуктов для брандмауэров. Одна из вещей, которую противник хочет сделать очень рано, — это выяснить, какой брандмауэр стоит между ним и его целью.

Брандмауэры нового поколения

Межсетевые экраны нового поколения, появились на рынке относительно недавно. Такие компании, как Cisco или Palo Alto, уже используют многие концепции брандмауэров нового поколения. Межсетевые экраны нового поколения всегда будут включать межсетевой экран с отслеживанием состояния. Они будут охватывать брандмауэр, так что это будет его ядром, но это также добавит идею осведомленности о приложениях. Осведомленность о приложениях означает, что наш брандмауэр может отличить HTTP- сообщение, отправляемое на веб-сайт, от того, что кто-то помещает вредоносный код в HTTP-сообщение, чтобы попытаться провести атаку. Кроме того, он поставляется с пользовательским контролем, который не предназначен для контроля пользователей, а скорее для определения того, к чему у наших пользователей есть доступ. Когда мы используем эти брандмауэры нового поколения на границе нашего Интернета, мы получаем много возможностей контролировать, к каким конкретным ресурсам в Интернете могут получить доступ наши пользователи. Мы надеемся, что это поможет нам контролировать и предотвращать переход пользователей на заведомо вредоносные интернет-ресурсы. Для этого у нас также есть системы обнаружения вторжений, встроенные в брандмауэр нового поколения. Например, фильтры URL-адресов, чтобы предотвратить переход пользователей на вредоносные веб-сайты, или, если мы хотим, мы можем контролировать, на какие сайты пользователь может перейти.


ссылка на оригинал статьи https://habr.com/ru/post/680010/

Главные финансовые новости за неделю: рецессия в США уже началась, но рынки при этом бодро растут

Если вы зарабатываете погромированием 300кк/сек., но при этом у вас есть какой-то иррациональный FOMO на предмет того, что вы пропустите какие-то важные новости и попадете на бабло — то вот вам всё самое важное, что произошло за неделю в мире финансов как в России, так и в мире: Набиуллина готовится к прекращению биржевых торгов долларами, нерезидентам планируют потихоньку позволить продавать акции на Мосбирже, а Interactive Brokers продолжает щемить российских клиентов.

Видеоверсия есть вот здесь, а под катом — всё то же самое текстом.

ЦБ РФ продолжает разруливать ситуацию с валютой

Российский Центробанк опубликовал у себя на сайте ответ на вопрос, который как бы намекает, что самые жесткие валютные ограничения по иностранным счетам, установленные Указом президента № 79 в феврале этого года, уходят в прошлое.

Грубо говоря, раньше Указ № 79 запрещал вообще любые зачисления валюты на зарубежные счета, кроме горстки разрешенных исключений. А теперь вышел новый Указ № 430, который повернул ситуацию в обратную сторону: разрешено всё, что прямо не запрещено — гуляем!

Эльвира Сахипзадовна знает, как порадовать инвесторов: сначала им нужно всё запретить, а потом чего-нибудь немножко разрешить
Эльвира Сахипзадовна знает, как порадовать инвесторов: сначала им нужно всё запретить, а потом чего-нибудь немножко разрешить

Также в пятницу в Forbes появилась статья о том, что в ЦБ уже пару месяцев как готовятся к вводу западных санкций на российскую биржевую инфраструктуру (Мосбиржа и Национальный клиринговый центр) — в этом случае, помимо всего прочего неприятного, исчезнет сама возможность биржевых торгов долларами и евро.

Вот Центробанк и готовит схему, как ему в этом случае высчитывать официальные курсы этих валют к рублю — путем, так сказать, опроса десяти крупнейших банков страны. Представляю, как в этом случае будет бомбить у тех, кто последние четыре месяца возмущался «нарисованным» курсом рубля к доллару… При расчете «справедливого» курса по новой методике придется придумывать уже какую-то новую метафору — ну типа, как в том анекдоте: «курс рубля, напетый Рабиновичем по памяти».

Как бы то ни было, для обычного частного инвестора этот звоночек еще раз напоминает о том, что в новой реальности надежное сохранение капитала в долларах или евро внутри России становится всё более и более призрачным. Ну, если вы, конечно, не успели набить матрас хрустящими долларами (или хотя бы виртуальный криптоматрас кошерными стейблкоинами).

Дружественных нерезидентов планируют запустить на Мосбиржу

Помните наше обсуждение того, что внутри российского фондового рынка оказалось заперто огромное количество нерезидентов, которые не могут продать свои акции (что и обуславливает скрытый потенциал падения всего рынка)?

Так вот, Мосбиржа решила начать их потихоньку размораживать: с 8 августа получат возможность торговать нерезиденты из «дружественных» стран, а также нерезиденты, которыми в конечном итоге владеют бенефициары-россияне.

Недружественный нерезидент ждет, когда подойдет его очередь на разморозку активов внутри Мосбиржи. Холст, масло.
Недружественный нерезидент ждет, когда подойдет его очередь на разморозку активов внутри Мосбиржи. Холст, масло.

Кроме того, 15 августа уже начнется автоматическая расконвертация депозитарных расписок на российские акции. Чуете, к чему дело идет? Объем предложения российских ценных бумаг разной степени размороженности в августе должен подрасти — а это, как нас учит неумолимый закон спроса и предложения, обычно означает, что цена будет падать.

Ну или, по крайней мере, в этом твердо уверена тусовка отечественных трейдеров. Хотя, если все в этом уверены — значит, это уже заложено в текущую цену акций? Короче, на этой вашей бирже ничего толком не понятно… Кроме одного: никогда не принимайте всерьез торговые сигналы от непонятных чуваков из интернета!

Interactive Brokers обрубает для россиян доступ к рыночным данным американских бирж

Популярный американский брокер Interactive Brokers разослал своим клиентам с российским резидентством «письмо счастья» о том, что с 1 августа они перестанут получать актуальные рыночные данные по биржам NYSE и Nasdaq.

Важное уведомление от IB: «Уважаемый клиент! Торгуйте вслепую. Такие условия. Надеемся на понимание.»
Важное уведомление от IB: «Уважаемый клиент! Торгуйте вслепую. Такие условия. Надеемся на понимание.»

Это значит, что торговать на этих биржах по-прежнему будет можно — но заявки на покупку и продажу ценных бумаг придется выставлять вслепую, перекрестясь и уповая исключительно на Божье провидение. Ведь посмотреть текущую котировку или проинспектировать биржевой стакан в приложении Interactive Brokers больше не получится.

В общем-то, ничем страшным это большинству клиентов IB не грозит — тем более, что многие из них и так не платили брокеру лишние $1,5 в месяц за онлайн-котировки американских бирж, а вместо этого пользовались бесплатными данными с задержкой. Ну, сейчас придется иногда подглядывать в сторонние приложения, это да — неудобно, но не фатально (если вы не внутридневной трейдер).

Рецессия Шредингера в США

На неделе выяснилось, что за 2-й квартал американский ВВП сократился на 0,9% годовых. Если вспомнить, что в 1-м квартале экономика Штатов тоже падала — то по факту мы имеем на руках рецессию (которую чаще всего определяют как падение экономики в течение минимум двух кварталов подряд).

Но с этим тезисом согласны далеко не все! Например, Джанет Йеллен (глава Минфина США) заявила, что никакой рецессии нет — а есть только «необходимое замедление после роста». Видимо, в скором времени стоит ждать от ребят пассажей вроде «в результате хлопка инфляции произошло плановое высвобождение рабочей силы и отрицательный рост мощной, как никогда, американской экономики!»

Джанет Йеллен здесь как бы говорит: «Слушай, дорогой, ну какая рецессия – ты вообще нормальный, такие слова вслух произносить?!»
Джанет Йеллен здесь как бы говорит: «Слушай, дорогой, ну какая рецессия – ты вообще нормальный, такие слова вслух произносить?!»

Мнение Йеллен хором поддерживают и Джо Байден, и глава ФРС Джером Пауэлл. Типа, рынок труда в США чувствует себя отлично – вот на это и давайте смотреть. А то, что экономика уже полгода падает – это… кхм… ну, в общем, следующий вопрос!

Федрезерв США продолжает поднимать ставку

В среду Федрезерв на очередном заседании повысил базовую ставку процента еще на 0,75% – до 2,25–2,50% годовых.

Надо понимать, что делает он это не от хорошей жизни: обычно, когда экономика страны начинает барахлить и кашлять (см. «рецессия» в предыдущем разделе), ФРС старается ставку максимально снизить – чтобы кредиты в экономике подешевели, деньги потекли по финансовым трубам более напористо, ну и так далее.

В частности, именно такими методами (в сочетании с Quantitative Easing – «количественным смягчением») спасали американскую экономику в ковидном 2020-м. И ведь успешно спасли! Несмотря на все эти локдауны-шмокдауны, экономического коллапса не случилось – а рынок акций дак вообще вырос за два года с марта 2020-го по март 2022-го аж в два раза.

Как вы, наверное, знаете – в научной литературе такая экономическая политика (низкая процентная ставка + QE) называется термином «Money Printer Go BRRR!».

Money Printer Go BRRR в исполнении главы ФРС Джерома Пауэлла
Money Printer Go BRRR в исполнении главы ФРС Джерома Пауэлла

Так вот, в текущей ситуации (начинающийся рецессионный спад в экономике Штатов) Пауэллу было бы в самый раз побырбыркать печатным станком. И он сам бы рад! Если бы не инфляция, которая к настоящему моменту достигла в США уже 9% – что немножко (в четыре с половиной раза) выше целевого уровня инфляции в 2%.

Получается, Федрезерв США сейчас немного подвис между молотом и наковальней. Не будешь поднимать ставку – сохранится инфляция и реднеки из южных штатов скоро возьмутся за вилы. Будешь поднимать ставку слишком агрессивно – экономике придет кирдык, и опять придется на вилы…

TradingView: Динамика базовой ставки ФРС (синий) против темпа инфляции в США (оранжевый)
TradingView: Динамика базовой ставки ФРС (синий) против темпа инфляции в США (оранжевый)

Сейчас ФРС многие ругают за то, что они держали ставку слишком низкой слишком долго. Весь 2021 год Пауэлл всех кормил сказкой про то, что «инфляция – это дело временное, сейчас вот-вот упадет обратно!». А она всё время почему-то только росла. Так что сейчас приходится уже всем рассказывать, что в этом исключительно Путин виноват. Не, ну не может же проблема в действиях самого Пауэлла и Money Printer Go BRRR быть?!

Несмотря ни на что, рынки растут

В США, по сути, подтвердилась рецессия, ставку процента продолжают повышать рекордными темпами – как вы думаете, что при этом должно происходить с рынком акций? А вот и нет: американский рынок за прошедшую неделю подрос на 4,2%, а вообще же с середины июня подъем составил уже 12,6%.

TradingView: Динамика индекса S&P500 за 2022 год
TradingView: Динамика индекса S&P500 за 2022 год

Дело в том, что поведением рынка управляют не столько сами происходящие факты, сколько ожидания инвесторов относительно будущего. Если произошло что-то плохое для акций, а они при этом растут – это всего лишь означает, что инвесторы ожидали еще более печального развития событий. Так что на горизонте дней, недель и месяцев рынок подвержен большому влиянию настроений народных масс; и только на длинных горизонтах (годы и десятилетия) всё в итоге сводится к фундаментальным экономическим факторам.

Помимо традиционных рынков, растут и наши любимые криптыши: Биткоин за последние полтора месяца подрос с низов на 25%, а Эфир – дак вообще на все 70%! Ведь Виталик Бутерин обещает вот-вот наконец превратить Эфириум из гадкого анти-экологичного проекта в прекрасный зеленый блокчейн будущего, работающий по принципу Proof-of-Stake (то есть, без необходимости беспрерывно майнить циферки на китайских видеокартах).


Если подборка показалась вам интересной и вы за то, чтобы я начал публиковать аналогичные выпуски еженедельно – жмите статье лайк! В случае хорошего отклика сделаю таки регулярной рубрикой. =)

Ну и, как обычно, буду благодарен за подписку на мой Телеграм-канал RationalAnswer, где я пытаюсь найти разумные подходы к личным финансам и инвестициям.


ссылка на оригинал статьи https://habr.com/ru/post/680078/

Микроконтроллеры по 5 рублей. Программируем микросхемы PADAUK

Пролог

Мой интерес к дешёвым микроконтроллерам, которые могут применяться в серийных изделиях, возник не на пустом месте. Разрабатывая электронику для одного из своих проектов, я столкнулся с тем, что себестоимость одного изделия (даже при оптовом заказе комплектующих) получается неприемлемо высокой.

В основу изделия заложены микроконтроллеры ATtiny13 в корпусах DFN10. И как сейчас помню, закупался этими контроллерами в розницу (ДКО Электронщик) по цене 28,7 рублей за штуку (июнь 2020 года). С тех пор многое изменилось…

И теперь ATtiny13 в корпусе DFN10 в магазине LCSC при заказе от одной штуки стоит около 80-100 рублей, а при заказе от 500 штук 20-30 рублей (по курсу на июль 2022 года). На площадке отечественного дистрибьютера компонентов «ДКО Электронщик» позиции по запросу ATtiny13 во многих корпусах отсутствуют вообще (в частности DFN10). Те, что имеются в наличии идут от 100 рублей за штуку. В магазине «ЧИП и ДИП» цена микроконтроллеров ATtiny13 (в основном в корпусах SOIC) поднялась до 400 – 500 рублей.

Нежелание мириться с таким положением дел подталкивало на поиски какой-либо альтернативы. Поиски привели меня к микроконтроллерам PADAUK.

Какие существуют альтернативы?

Здесь, на Хабре, публиковался перевод статьи, посвящённой обзору производителей микроконтроллеров, выпускающих свою продукцию по впечатляюще низкой стоимости. В основном это компании из Китая и Тайваня. Среди моделей, упоминавшихся в обзоре, моё внимание привлёк именно PADAUK, потому что имеется документация на английском языке, так ещё и вокруг этих контроллеров образовалось целое сообщество разработчиков, которые смогли создать набор бесплатных инструментов (средства разработки и программатор) для работы с этими контроллерами.

Отношение цены и функционала этих контроллеров показалось мне идеальным для применения в своём проекте, поэтому выбор я остановил именно на них.

Особенности микроконтроллеров PADAUK

Анализируя модельный ряд микросхем PADAUK, можно выявить следующие характерные особенности:

  • микроконтроллеры в различных корпусах, от SOT 23-6 у (PMS150, 4 порта ввода/вывода) до SOP28 (PFC460, до 26 портов ввода/вывода), примечательно, что для одного и того же микроконтроллера имеется различные варианты корпуса;

  • объём памяти программ от 512 до 4096 слов, объём оперативной памяти от 64 до 256 байт;

  • тактовая частота до 16МГц (от внутреннего тактового генератора), большинство процессорных команд выполняются за один такт;

  • у микроконтроллеров отсутствую аппаратные интерфейсы (UART, I2C, SPI и т.д.), встроенный в IDE генератор кода предлагает реализовывать их программными средствами;

  • имеются модели с flash памятью (MTP) и однократно программируемые (OTP);

  • некоторые микроконтроллеры оснащены, так называемыми «программируемыми пользователем процессорными матрицами» (field-programmable processor array, FPPA), о том, что это такое и как это может быть использовано мы поговорим ниже.

На официальном сайте производителя имеется документация на все модели контроллеров на английском и китайских языках. Доступна для скачивания полнофункциональная среда разработки FPPA IDE (про установку и работу с ней поговорим далее). Программы можно писать на классическом ассемблере, однако производитель предлагает ещё и вариацию языка C – Mini.C, что мне показалось очень интересным.

Микроконтроллер с несколькими ядрами

Все микроконтроллеры PADAUK строятся на схожей архитектуре. Набор инструкций процессора сильно напоминает PIC микроконтроллеры, естественно с некоторыми усовершенствованиями и доработками. Вектор прерывания только один. После срабатывания прерывания они автоматически отключаются на время выполнения подпрограммы обработки и автоматически включаются после возвращения в основную программу.

Наиболее интересной особенностью является наличие FPPA. У некоторых микроконтроллеров всего один модуль FPPA и они функционируют как хорошо знакомые нам AVR или PIC контроллеры. У некоторых моделей количество модулей FPPA составляет 2 или 4. Для примера обратимся к документации на микроконтроллер PCM232, а именно на раздел, описывающий архитектуру.

Внутри микроконтроллера PMC232 есть два процессорных блока FPPA. Каждый модуль FPPA имеет свой собственный счетчик программ и аккумулятор для выполнения программы (рабочие регистры), регистр флага для записи состояния и указатель стека для операции перехода. Такая архитектура позволяет каждому FPPA выполнять свою собственную программу независимо, таким образом, можно получить параллельное выполнение программы.

Два блока FPP имеют совместный доступ к одной и той же памяти программ OTP 2k × 16 бит, памяти данных 160 байт (SRAM) и всем портам ввода-вывода. Блоки FPP работают с взаимоисключающими тактовыми циклами, полагаю, чтобы избежать конфликтов в чтении/записи общих ячеек памяти. В микросхему встроен единый переключатель задач (Task Switch), который определяет какому блоку FPP должно быть передано управление на текущем такте.

Каждый блок FPP имеет половину вычислительной мощности всей системы; например, APP0 и APP1 будут работать на 4 МГц, если тактовая частота равна 8 МГц. Причём, имеется возможность использовать только один из FPPA, переключение производится из программы, но после сброса система инициализируется с FPPA0. Примечательно, что арифметико-логическое устройство у процессора одно, блоки FPPA0 и FPPA1 используют его совместно, по очереди загружая в него данные из своих рабочих регистров для выполнения операций. Вся эта система, по сути, реализует переключение контекста процессора, чтобы арифметико-логическое устройство могло по очереди обслуживать два вычислительных потока, естественно, ценой понижения тактовой частоты для каждого из потоков. В документации также приводятся примеры использования памяти для режимов с одним и несколькими FPPA.

Смущает здесь только адрес входа в обработчик прерывания с пометкой «FPP0 only», не уж то переход в обработчик прерывания производиться только в FPPA0? Хотя, надо полагать переключатель контекста (task switch) как-то разруливает это без участия программиста.

В чём смысл такого подхода? Самый очевидный вариант – реализация недостающих интерфейсов на одном из модулей FPPA, в то время как другой будет занят выполнением основной программы. Поскольку FPPA работают независимо друг от друга, программа интерфейса не будет оказывать влияния на выполнения основного алгоритма и разработчику не придётся заботиться о разрешении коллизий и занятости процессора. Получается у нас их два, внутри одного контроллера. Почему бы сразу не воткнуть в микроконтроллер интерфейсы? Полагаю, это привело бы к увеличению их цены, а если ни одним из них разработчик не пожелает воспользоваться (кстати, это мой случай!), то зачем за него переплачивать?

Ещё одной фишкой микроконтроллеров с несколькими FPPA является расширение набора инструкций процессора. Например, у PMC232, в дополнении к хорошо всем знакомой команде nop (нет операции, на которых строятся большинство функций задержки, типа delay(X)) присутствует команда delay, при выполнении которой просто декрементируется значение аргумента. Максимальное время задержки может составлять 256 тактов.

Кстати, если говорить про время, то все микроконтроллеры PADAUK имеют сторожевой таймер, тактирующийся от внутреннего низкочастотного генератора.В зависимости от модели имеется 8 битный или 16 битный таймер счётчик с возможностью генерировать ШИМ, а также отдельный 3 канальный 11 битный ШИМ генератор «Super LED», специально для RGB светодиодов. Наличие АЦП, аппаратного контроллера сенсорных кнопок и поддержка режимов пониженного энергопотребления, внешних прерываний присутствует не во всех моделях.

Что? Где? Почём? О доступности продукции PADAUK для отечественного разработчика

Ещё в начале года (декабрь — январь 2022), когда я искал, где закупиться контроллерами PADAUK, я с удивлением обнаружил две позиции в каталоге «ЧИП и ДИП», однако ни цена, ни сроки поставки меня не устроили. Но при подготовке этой публикации (июнь 2022), я ещё раз заглянул к ним в каталог. Ассортимент значительно расширился, появились и новые модели, и программатор, и эмуляторы. В «ДКО Электронщик» контроллеры PADAUK также доступны для заказа. При этом, стоимость не сильно отличается от их стоимости на LCSC, что не может не радовать.

Кстати, на сайте PADAUK есть перечень сертифицированных дистрибьютеров их продукции.

Для экспериментов были заказаны следующие позиции. Стоимость указана для магазина LCSC на 18.07.2022.

  1. Программатор PADAUK Tech 5S-P-003. Позволяет программировать MTP и OTP микроконтроллеры, поддерживает автономную загрузку прошивки в контроллер (без ПК). Классический промышленный программатор. Язык интерфейса: английский, что приятно.

    Стоимость: 126$.

  2. Микроконтроллер PFC161-S08B. Это микроконтроллер с перезаписываемой (flash) памятью программ (2KW) в корпусе SOIC-8. Из периферии: 16 битный таймер, два 8 битных таймера с ШИМ, аналоговый компаратор, контроллер сенсорных кнопок, внешние прерывания (3 назначаемых пина). Также имеется схема контроля напряжения питания, в наличии режим пониженного энергопотребления, при этом, любой пин может быть использован для вывода контроллера из этого режима.

    Стоимость: 0,4$ (от 100 штук 0,26$).

  3. Микроконтроллер PFC161-U06. Тоже самое, только в корпусе SOT23-6.

    Стоимость: 0,45$ (от 100 штук 0,29$).

  4. Микроконтроллер PMS150C-U06. Микроконтроллер с однократно программируемой памятью программ (OTP 1KW). Из периферии: 16 битный таймер, 8 битный таймер с ШИМ, аналоговый компаратор, один конфигурируемый пин внешнего прерывания. Присутствуют режимы пониженного энергопотребления.

    Стоимость: 0,089$ (от 150 штук 0,07$).

  5. Микроконтроллер PMS152-S08. Всё почти тоже самое, но с большим объёмом памяти программ (1,25KW), 11 битным ШИМ контроллером SuperLED, двумя пинами внешних прерываний и на 2 ножки больше.

    Стоимость: 0,088$ (от 150 штук 0,064$).

Выбор пал именно на эти модели, так как они наиболее миниатюрные представители линейки PADAUK. В проекте, под который закупались данные микросхемы габариты платы – один из важнейших параметров. Кроме корпусов SOIC и SOT23 производитель декларирует в даташите и корпуса QFN16 (для PMS152), но найти их в каталоге мне не удалось.

Все они имеют только один модуль FPPA, так что с «мультиядерными» микроконтроллерами поиграемся в другой раз.

План был такой: пишем и отлаживаем программу на PFC161 с перезаписываемой памятью, затем переносим всё на PMS152 или PMS150 и устанавливаем их в серийное изделие. Понятно, что пару OTP камушков будет израсходовано на отладку, но учитывая их стоимость в 5 рублей – небольшая потеря.

Отладочная плата для PFC161

Для экспериментов была разработана отладочная плата. В документации на микроконтроллер PFC161 сказано, что микроконтроллер поддерживает режим внутрисхемного программирования. Для этого используется пять проводов программатора: ICPCK, ICPDA, VDD, GND и ICVPP. Они подключаются соответственно к пинам микроконтроллера: PA3, PA6, VDD, GND и PA5.

Символ «звёздочка» может обозначать как резисторы, так и конденсаторы. Они используются для изоляции проводов программного сигнала от периферийной цепи. Сопротивление должно составлять около 10 КОм, если используется ёмкость, то она должна составлять около 220 пФ.

Используется программирование с ограничением напряжения (низковольтное программирование), при этом:

  • не надо подключать между VDD и GND стабилитрон на напряжение менее 5,0 В, программатор сам подаёт питание на программируемый МК, поэтому всё что висит на питании не должно потреблять больше 20мА;

  • не надо подключать конденсатор ёмкостью больше 500 мкФ между VDD и GND;

  • линии программирования PA3, PA5 и PA6 не следует использовать для питания какой-либо нагрузки.

В общем, вроде требования вполне понятные, на всякий случай добавил DIP переключатель, отключающий линии микроконтроллера, использующиеся при программировании, от остальной платы.

Получилась вот такая схема обвязки микроконтроллера:

Разъём XS5 (IDC-6), собственно, и используется для подключения к программатору. Также на плату была добавлена пара Н – мостов для коммутации нагрузки (микроконтроллер в целевой плате будет управлять биполярным шаговым двигателем).

Вот такая красивая получилась моделька:

И вот такая получилась реализация:

Сигнальные и силовые дорожки, толщиной 0,25мм сделаны исключительно для того, чтобы протестировать возможности ЛУТ технологии. Интересно получились миниатюрные обозначения контактов (выделены крупно на виде печатной платы). Сначала я думал они бесследно исчезнут при переносе рисунка или при травлении, но нет, сохранились! Толщина линии символа 0,07мм.

 После сборки и проверки отладочной платы можно переходить к созданию проекта и написании прошивки.

Первый проект в FPPA IDE

Как уже отмечалось выше, среда разработки полностью бесплатная и доступна для скачивания на официальном сайте производителя [5].

После скачивания и распаковки архива в нём будет единственный exe файл. Запускаем его и наблюдаем за работой чудо-программы установки, которая не спросит у вас абсолютно ничего, а только отчитается об успешной установке. На рабочем столе появится пара иконок.

FPPA IDE — собственно среда разработки. Writer – утилита для работы с программатором, она также доступна из IDE.

Запускаем IDE. Открывается последний проект или файл, а если запускаем первый раз, то Applicatiun Note, доступный также из верхней панели. Здесь содержится документация на процессорные команды, описание языка программирования mini.C, описание генератора кода.

Всё выглядит вполне знакомо и стандартно. С левой стороны менеджер файлов, внизу сообщения компилятора, в центральной части окно редактора кода. На верхней панели набор инструментов.

Создаём проект: file/New Project…

Задаём имя проекта, в указанном месте будет создана папка с именем проекта. Выбираем серию и модель микроконтроллера. Остальные настройки пока не трогаем, с ними разберёмся потом. Нажимаем ОК и смотрим на получившийся проект.

В файловом менеджере сразу появился файл с расширением «.c» – исходный код проекта на языке Mini.C, также файл extern.h, в который мы наверно пишем какие-то макросы, и файл с расширением «.PRE», содержащий, по-видимому, инструкции для компилятора.

В редакторе кода уже создано много всего. Подключен файл extern.h, создана главная функция и обработчик прерывания. Вроде всё понятно, сразу ясно что и куда писать.

Перед компиляцией нужно настроить кое-какие опции. Переходим во вкладку Execute/Code Option, открывается вот такое окно.

Здесь можно внести изменения, которые отражаются в файле PRE. Во-первых, нужно отключить CS_Sel, чтобы PA7 или PB7 функционировали как нормальные порты ввода/вывода. Опция CS_Sel относится к контроллеру сенсорных кнопок, в нашем проекте использоваться не будет. Во-вторых, отключить EMI. В даташите на контроллер сказано, что если эта галочка установлена, то частота тактового генератора плавает для оптимизации производительности… Как это работает не понятно, ибо об этом всего одно предложение сказано. Но эксперименты показывают, что без этой штуки всё работает стабильнее.

Нажимаем F7 или Execute/Build или маленькую, хорошо знакомую по другим IDE, иконку на верхней панели. Компилятор отрапортовал об успешной сборке проекта и выдал предупреждение, что мы никак не используем прерывание.

В папке проекта появляется файл с расширением .PDK. Это результат компиляции программы. Этот файл мы впоследствии будем скармливать программатору.

Загрузка прошивки в микроконтроллер

Для загрузки прошивки в микроконтроллер PFC161 потребуется программатор 5S-P-003, где 003, как я понимаю, это его версия. Более ранние версии не поддерживают этот микроконтроллер, да и в продаже их почти и нету.

Программатор питается от сетевого адаптера 9В 2А, который поставляется в комплекте (нужен переходник на евро-розетку). Связь с компьютером через USB (но питание по UAB не подаётся). Выглядит точь-в-точь как на иллюстрациях в инструкции. При подключении к ПК, он автоматически определяется windows10, в явной установке драйверов не нуждается.

Для запуска утилиты общения с программатором в IDE выбираем Execute/Writer, открывается окно программатора. При первом подключении, возможно, он потребует обновления прошивки, соглашаемся, дальше система всё сделает сама.

Теперь собственно главный вопрос, как нам подключать микроконтроллер к программатору. Для этого служит разъём на передней панели и группа контактов под задней крышкой программатора. Там есть целая куча этих контактов и один 8-контактный джампер, который по умолчанию замыкает разъём JP2.

Если посмотреть окошко writer, то в консоли будет выведено вот это:

Раздел Check Jump показывает, как должны быть установлены перемычки и в какую позицию нужно устанавливать микросхему на лицевой панели для различных корпусов этого контроллера.

Например, для корпуса S08A (SOIC8, ножки питания 1 и 8):

Необходимо убедиться, что джампер замыкает JP2. И установить микроконтроллер в разъём на передней панели, сместив его вниз на 4 контакта (естественно используя переходник SOIC-DIP).

Однако, у нас корпус S08B (SOIC8, ножки питания 3 и 4):

Для него написано: JP7.

Заглянув в инструкцию к программатору, находим раздел, в котором идёт описание того… как пользователь должен изготовить «переходник» для разъёма JP7, чтобы подключить в разъём на лицевой панели микроконтроллер… чегоооо?

Вообще, как я понял, для программирования любого микроконтроллера PADAUK используется максимум 8 линий (6 сигнальных и 2 питания). Для внутрисхемного программирования вообще 5 линий (3 сигнальных и 2 питания). Согласно документации, в разъёме JP7 они выведены на контакты с 29 по 36.

Я по началу наивно полагал, что достаточно к ним соответствующие провода кинуть и готово. Однако, как выяснилось позже, программатор перед загрузкой прошивки проверяет состояние линий микроконтроллера, а проверять он может только контактами 1-28 разъёма JP7. Без проверки он выдаёт ошибку подключения, поэтому как ни крути, надо колхозить эту «переходную плату».

Ладно, понятно, а в какой из 28 первых контактов подключать линии программирования?

Переходим обратно в окно Writer и жмём иконку Convert.

Этот раздел позволят вносить изменения в PDK файл, чтобы объяснить программатору что ему нужно делать. Нам нужен раздел To Package, позволяющий сконфигурировать разъём на передней панели под наш корпус. После нажатия на кнопку нам предлагают выбрать наш PDK файл. Открываем его. Появляется окно, где можно настроить параметры.

Выбираем чип: PFC161. Корпус: S08B.

Дальше раздел O/S Test Select указываем какие пины нужно протестировать, перед загрузкой прошивки. Можно вручную снимать галочки, а можно указать Only Program PIN, тогда программатор будет тестировать только пины, необходимые для загрузки прошивки. В нашем случае это PA5, PA3, PA6.

Ещё нужно поставить галочку On-board Program.

В левой части будет схематично показан разъём передней панели и показано каким образом в него необходимо установить микроконтроллер. Если посмотреть на имена активных (подсвеченных) пинов и нумерацию, то увидим, что они совпадают с распиновкой корпуса нашего микроконтроллера.

Жмём ОК. Нам предлагают сохранить модифицированный файл PDK в папку проекта. Сохраняем его под другим именем (система по умолчанию добавляет в конец имени файла маркировку корпуса S08B). Теперь отправляем этот файл на программатор. Для этого в окне Writer ищем иконку Load File, указываем модифицированный PDK файл. Теперь на дисплее программатора появляется имя файла, модель контроллера и надпись «remove». То есть файл загружен, но контроллер пока не обнаружен. Собственно, с этого момента программатор может работать отдельно от компьютера и в автономном режиме грузить прошивки в контроллеры.

Переходим к подключению микроконтроллера.

Разъём JP7 (двухрядный PLS) является отражением разъёма на лицевой панели. Они прозваниваются зеркально. Поэтому нам всего лишь нужно сделать вот такие перемычки для JP7. Джампер на JP2 оставляем на своём месте.

Теперь можно подключать наш микроконтроллер к лицевой панели. Поскольку программировать мы будем внутрисхемно, то нужен провод, который будет соединять разъём на отладочной плате и зажимную панельку на лицевой панели программатора. Сделаем ещё один переходник, подключив соответствующие пины, на разъёме отладочной платы к разъёму программатора. На экране программатора появится надпись «IC ready», означающая, что микроконтроллер готов к прошивке.

В окне Writer нажимаем иконку Auto Program или кнопку Program на самом программаторе. Начнётся процедура загрузки прошивки. После которой на экране увидим сообщение об успешной операции.

Теперь можно отсоединять программатор и подключать питание отладочной платы.

Правда вот незадача, прошивка наша ничего не делает…

Программирование на Mini.C

Для начала я попробовал реализовать простой алгоритм управления шаговым моторчиком при помощи драйвера, расположенного на печатной плате. По нажатию на одну из кнопок он должен вращаться в одну сторону на заданное количество шагов, по нажатию на другую кнопку – делает то же количество шагов в обратную сторону. Поскольку прошивки под большинство проектов я пишу на С, для этих контроллеров я выбрал Mini.C, в надежде, что освоится с ним будет проще.

Что сказать об особенностях этого языка и компилятора… Действительно, синтаксис как у языка Си. Компилятор не поддерживает передачу аргументов в функцию. Также функция не может вернуть значение. Зато есть указатели и глобальные переменные.

Типы данных тут несколько отличаются по названию, но в целом, несут тот же смысл, что и в классическом СИ. Не поддерживаются вычисления с плавающей точкой. Вся арифметика только целочисленная.

Среда разработки крайне не любит кириллицу в комментариях. Нет, формально комментарии писать можно. И при компиляции ошибки не выдаёт. Но, по какой-то причине при сохранении файла и его повторном открытии часть символов меняется на знак вопроса. Так-то ладно… но! При попытке выполнить rebuild компилятор повисает, и среда вылетает. Я долго мучился и не мог понять в чём причина. Причём ошибка плавающая. То есть заново созданный файл с комментариями, содержащими кириллицу, поддаётся «пересборке», а повторно открытый уже нет. Чудеса… однако…

В целом… жить можно… Приноровиться надо. Дешёвый контроллер окупает всё веселье!

Ниже листинг программы с комментариями.

Полный код программы
#include"extern.h"  // H-bridge pins #define AP 7 #define AN 5 #define BP 3 #define BN 6  // motor operating modes #define STOP     0 #define FORWRD   1 #define BACKWARD 2  #define DEADTIME 30 #define PHASE_DEL 3000  BYTE motorDirection = STOP; BYTE stepperPhase[10];  WORD pntStart, pntEND, phaseCounter; WORD delCounter; WORD delValue = 0;  WORD stepCounter = 0;  void delay_tick (void) { while(delValue > 0) { delValue -= 1; nop; } }  voidFPPA0 (void) { .ADJUST_ICSYSCLK=IHRC/8, Init_RAM;  // phases of motor step stepperPhase[1] = (0<<AP)|(0<<AN)|(1<<BN)|(0<<BP); stepperPhase[2] = (0<<AP)|(1<<AN)|(1<<BN)|(0<<BP); stepperPhase[3] = (0<<AP)|(1<<AN)|(0<<BN)|(0<<BP); stepperPhase[4] = (0<<AP)|(1<<AN)|(0<<BN)|(1<<BP); stepperPhase[5] = (0<<AP)|(0<<AN)|(0<<BN)|(1<<BP); stepperPhase[6] = (1<<AP)|(0<<AN)|(0<<BN)|(1<<BP); stepperPhase[7] = (1<<AP)|(0<<AN)|(0<<BN)|(0<<BP); stepperPhase[8] = (1<<AP)|(0<<AN)|(1<<BN)|(0<<BP);  // нельзя просто так взять и написать stepperPhase[phaseCounter]   // поэтому используем указатели pntStart = & stepperPhase[0]; pntEND = & stepperPhase[9]; phaseCounter = pntStart+1;  delCounter = 1;   PA = 0b00000000; // AP настоятельно рекомендует обнулить регистр данных порта перед внесение изменений в конфигурацию PAC = 0b11101000;  PB = 0b00000000; PBC = 0b00000000;  while(1) { // buttons control if(PA.4 == 0) { motorDirection = FORWRD; stepCounter = 50; } if(PB.0 == 0) { motorDirection = BACKWARD; stepCounter = 50; }  while(stepCounter > 0)  { if(motorDirection == FORWRD)  { phaseCounter += 1; delCounter += 1; } else if(motorDirection == BACKWARD) { phaseCounter -= 1; delCounter -=1; }  // phase control if(phaseCounter == pntStart)  { phaseCounter = pntEND - 1; } else if(phaseCounter == pntEND) {  phaseCounter = pntStart + 1;  }  // delay control if(delCounter == 0) { delCounter = 2; } else if(delCounter == 3) { delCounter = 1; }   // curent step send on pins  PA = (PA & 0b00010111) | (*phaseCounter);       /* чтобы не замусорить значения регистра данных PA.4,        *  сначала читаем содержимое,        *  накладываем маску и только потом вставляем текущую фазу двигателя       */  delValue = PHASE_DEL; if(delCounter == 1) { delValue = DEADTIME; }  delay_tick();        /* да, тут можно было обойтись и без рукописной функции,       *  а просто командой .DELAY 4000        *  (в которую тоже нельзя передать переменную),        *  но было интересно как это сработает       */   stepCounter -=1; }  // disable stepper motorDirection = STOP; PA = (PA & 0b00010111);  } }    voidInterrupt (void) { pushaf;  if (Intrq.T16) {//T16 Trig //User can add code Intrq.T16=0; //... }  popaf; } 

После нескольких экспериментов получаем исправно работающую прошивку. Небольшая видео демонстрация работы устройства:

Заключение

Что можно сказать в итоге. У меня остались приятные впечатления после знакомства с экосистемой PADAUK. Микроконтроллеры с низкой себестоимостью – не такая уж и плохая штука. Если сравнивать с другими 8 разрядными микроконтроллерами вроде Tiny13 или Tiny10 или PIC10, которые известны несравненно шире, то PFC161 не уступает этим товарищам ни в производительности, ни в объёме памяти программ, ни в богатстве периферии. Но выигрывает в цене, причём даже модели с перезаписываемой памятью. Кроме того, исходный код можно без труда портировать под PMS152 (с OTP памятью) и изделия на его основе уже можно тиражировать (при условии что вам не требуется специфическая периферия, вроде контроллера сенсорных кнопок).

Конечно, есть и особенности. Придётся покупать фирменный программатор. Ну или собирать свой, благо имеется открытый проект. Среда разработки и компилятор Mini.C, конечно, с особенностями…

В скором времени попробую перенести свой проект на эти микроконтроллеры, посмотрю что из этого получится и поделюсь результатами работы.

Список используемых источников

  1. Официальный сайт PADAUK с документацией

  2. Обзорная статья: WHAT’S UP WITH THESE 3-CENT MICROCONTROLLERS?

  3. Обзорная статья: Padauk Microcontrollers: Exploration and Usage

  4. Открытый проект программатора и ПО для работы с микроконтроллерами PADAUK: Free PDK

  5. Серия видеоуроков по работе с микроконтроллерами PADAUK с использованием инструментов от производителя: EEVblog #1132 — The 3 Cent Microcontroller

  6. Серия видеоуроков по настройке Free PDK: EEVblog #1306 (1 of 5): 3 Cent Micro — Open Source Programmer


ссылка на оригинал статьи https://habr.com/ru/post/678330/

Децентрализованный мир: как выглядит блокчейн-разработка и зачем ее сегодня изучать

За два года на Бали я успел убедиться, что это настоящая Мекка для людей, связанных с криптовалютой. Сюда стекаются инвесторы, трейдеры, разработчики и основатели стартапов, здесь постоянно запускаются новые проекты и проводятся свои форумы. Чем больше общаешься с представителями местного криптосообщества, тем лучше понимаешь, что число связанных с криптовалютой проектов растет огромными темпами. Мне как руководителю HR-агентства в сфере IT интересно за этим наблюдать с профессиональной точки зрения: сервисы, связанные с криптой, пишутся на блокчейне — так что увеличение их числа автоматически повышает спрос на блокчейн-разработчиков. 

Впрочем, это не только мои наблюдения: на Indeed (крупнейшая международная площадка по поиску работы) число вакансий в области крипты и блокейна в прошлом году выросло на 118%. В США примерно за тот же период спрос на этих специалистов увеличился в 6 раз. Разработчиков на блокчейне ищут не только стартапы, но и крупные компании — например, банк JPMorgan.

Рынок труда

Оценивать спрос на блокчейн-разработчиков по вакансиям на рекрутинговых площадках не очень удобно: часто поиск ведется внутри криптосообщества или на специализированных ресурсах. Но даже если изучить Linkedin, только в Евросоюзе сейчас ищут более 2 тысяч специалистов по программированию на блокчейне, в Северной Америке — 6,8 тысяч, в Азиатско-Тихоокеанском регионе — 4,6 тысячи. Причем львиная доля компаний ищет сотрудников на удаленку — то есть эти предложения доступны и для соискателей из России, которые не хотят релоцироваться. Например, в Северной Америке удаленный формат предполагает почти половина вакансий.

В России спрос пока не очень высок: на Linkedin размещено всего 32 вакансии, на HeadHunter и Хабр.Карьере — по 22. Причем многие из работодателей — международные компании или стартапы, которые базируются за рубежом. Зарплату, как часто происходит в IT, указывают редко — но если ориентироваться по HeadHunter, в среднем это $3-9 тысяч. 

За пределами России ценник выше: по данным сайта Cryptocurrency Jobs, в 2021 году средняя зарплата блокчейн-разработчика на удаленке составила 123 тысячи в год, то есть больше $10 тысяч в месяц. Другой ресурс, Web3 Jobs, приводит более свежие (и внушительные) цифры: от 100 до 750 тысяч долларов в год. Если взять средний показатель, это $35,5 тысяч в месяц.

Перспективы индустрии

По сравнению с другими сегментами IT спрос на блокчейн-специалистов сейчас сложно назвать очень высоким. Но как показывают прогнозы развития рынка, что потребность в кадрах будет очень быстро увеличиваться. Так, среднегодовые темпы роста индустрии оцениваются в пределах 68%73%. Это значит, что к 2028 году ее объем будет близок к $200 млрд — в 40 раз больше, чем в 2021 году. 

Биткоин постепенно добивается признания в качестве средства платежа: такие законы уже действуют в Сальвадоре и Центральноафриканской республике. А криптовалюты — основная сфера, где используется блокчейн, хотя области применения этой технологии постепенно расширяются. Сейчас это главным образом DeFi (децентрализованные финансы), искусство, развлечения, гейминг и IT.

Развитие рынка блокчейна и криптовалют повышает спрос на разработчиков, так что, думаю, уже в ближайшее время мы увидим новый кадровый рынок в IT. Я это замечаю даже по своей компании: если еще пару лет назад запросов на блокчейн-специалистов не было совсем, сейчас они стабильно возникают раз в два три-четыре месяца.

Для самих разработчиков сейчас, возможно, лучшее время освоить профессию — пока технология относительно новая, и компании не требуют солидного опыта работы.

О принципах блокчейна максимально коротко

Чтобы наметить точки входа в профессию, сначала нужно коротко обозначить, что такое в принципе разработка на блокчейне — для тех, кому эта тема незнакома.

Специфика блокчейна в его децентрализации: в системе нет единого сервера для данных, поэтому они хранятся у всех участников цепочки (отсюда название технологии — распределенный реестр). Чтобы совершить действия в блокчейне, участникам цепи нужно, условно говоря, договариваться: все новые записи должны быть верифицированы каждым узлом в сети. Свод правил верификации называется протоколом блокчейна, а сам механизм проверки — алгоритмом консенсуса. Алгоритмы бывают разные: Proof of Work, Proof-of-Stake, Delegated Proof-of-Stake — но мы не будем сейчас подробно на них останавливаться.  

Для создания приложений на основе блокчейна не требуется какого-то особого оборудования: разработка так же, как и в классическом варианте, ведется в IDE — например, в том же JetBrains. Существуют и специализированные IDE — скажем, Remix Solidity IDE. 

Технологический стек

Разные блокчейны отличаются своими протоколами и технологическим стеком. Приложения чаще всего пишутся на Ethereum, среди других популярных — Solana и Cardano. Это блокчейны с открытым исходным кодом, которые позволяют любому пользователю создавать на них свои проекты. Языки программирования для них могут быть уникальными или универсальными: к примеру, для Etherium был разработан собственный язык Solidity, а в Solana используются более привычные  Rust, C и C++.

Логику блокчейна запускают смарт-контракты — программы, которые позволяют участникам сети договориться об изменениях в блокчейне. Говоря упрощенно, такой контракт заключает в себе условия, которые должны быть выполнены в определенных обстоятельствах. Пишутся смарт-контракты на высокоуровневых языках программирования — Solidity, Vyper, Haskell, Rust, JavaScript, C++, Python и других. 

C распределенными реестрами связано множество других инструментов: так, чтобы подключить к Ethereum фронтальную часть сайта или приложения, нужно обратиться к библиотекам Web3.js или Ethers.js, в блокчейне есть свои фреймворки, API и SDK.

Самая большая сфера применения блокчейна — проекты, связанные с криптовалютами, поскольку сама крипта работает на основе технологии распределенных реестров. Но в создании таких сервисов могут участвовать разработчики и из других областей: например, когда часть, связанная с покупками и продажами валют строится на блокчейне, а интерфейс приложения и его логика — на классических технологиях.

Что требуют работодатели

В университете на блокчейн-разработчиков почти не учат. Почти — потому что в российских вузах есть несколько программ повышения квалификации и курсов: например, в МГУ и СПбГУ, а в МФТИ можно даже закончить магистратуру. Дисциплины, связанные с распределенными реестрами, включены в некоторые другие программы высшего образования в сфере IT и финансов. Есть и зарубежные магистратуры — например, во Франкфурте или на Мальте.

Но особой необходимости получать диплом в сфере блокчейна нет: во-первых (как и почти везде в IT), технологии в этой сфере очень быстро развиваются, а ландшафт профессии меняется. Поэтому то, что актуально сегодня, уже завтра может устареть. Во-вторых, сами работодатели не ищут соискателей с академическим образованием. Требования обычно включают в себя опыт работы с блокчейн-технологиями, которые применяются в их проекте. 

Продолжительность опыта работы обычно не указывается: компании понимают, что специалистов, которые годами создавали проекты на блокчейне, на рынке мало — поэтому на первый план выходят реальные навыки кандидата. Кроме того, часто работодатели ищут специалистов с хорошей экспертизой в бэкенде, и здесь уже указывают цифры: обычно 5 лет и больше. Обязательный пункт почти во всех вакансиях — знание английского.

Где получить опыт

Все эти навыки можно получить самостоятельно. Во-первых, сейчас есть колоссальное количество онлайн-курсов по блокчейну. Я не буду приводить здесь примеры, поскольку это отдельная большая тема — но в интернете можно найти множество подборок таких программ и обзоров на них.

Во-вторых, у специалиста обязательно должна быть практическая база. Самая известная площадка для ее наработки — ресурс CryptoZombies. Это забавная, но очень качественная игровая обучалка по написанию смарт-контрактов на Solidity: пользователи создают свою армию зомби, сражаются с зомби-войсками других игроков, попутно изучая принципы работы со смарт-контрактами и применяя их в игре.

Но важнейший источник развития в блокчейн технологиях — это огромное живое комьюнити, построенное на принципах взаимопомощи. В области блокчейна и криптовалют очень много профессиональных сообществ: в Твиттере, Дискорде, Телеграме, на форумах — где участники активно задают вопросы, делятся опытом, обсуждают идеи и запускают совместные проекты. Многие эксперты ведут свои блоги, выпускают видео и подкасты (но здесь важно убедиться, что вы не столкнулись с инфоцыганом, поскольку желающих заработать на хайповой теме много). Есть даже специализированные сайты для поиска работы в сфере блокчейна и криптовалют: например, CryptoJobsList или Cryptocurrency Jobs.

В блокчейн-комьюнити часто возникают ситуации, когда, например, дизайнер хочет создать свой NFT-проект и обращается к разработчикам с просьбой помочь со смарт-контрактами. Это одна из возможностей наработать себе портфолио, получить реальный опыт или даже запустить свой стартап за счет помощи друг другу. Вся суть децентрализованного Web3-мира состоит в том, чтобы власть корпораций перешла к людям — и именно поэтому в комьюнити так развита взаимоподдержка.


ссылка на оригинал статьи https://habr.com/ru/post/680088/

Впечатления от Weekend Offer для бэкенд-разработчиков

В прошлой статье я рассказывал про One Day Offer Fronted, сегодня поделюсь впечатлениями об аналогичном мероприятии для бэкенд разработчиков.

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

Коротко о правилах: 4 задачи, на решение дается 3 часа. Минимальный порог для прохождения 100 баллов т.е. достаточно решить любые 2. Задачи можно решать на Java, С++ или Python.

Задача 1 Сложный массив (50 баллов)

Дан массив a, элементами которого могут быть целые числа или массивы такой же структуры. Некоторые массивы могут быть пустыми или содержать только один вложенный массив.

Например массив может иметь следующую структуру: [1, 2, 3, [5, 5], 6, [7, 8, 9, [10, 11]]].

Если интерпретировать массив как простую последовательность чисел, определите элементы в массиве, который встречается наибольшее количество раз.

В единственной строке записано представление массива. Элементы массива (числа и массивы) разделены запятой и пробелом. Перед первым элементом каждого массива записан символ '[', после последнего элемента записан символ ']'. Гарантируется, что все числа по абсолютной величине менее 10^{9}. В массиве есть хотя бы одно число. Размер входных данных не превышает 1MB.

Сложно сказать есть ли тут подвох и прошел бы вариант с парсингом json и использованием flatten. Но я решил действовать прямолинейно — удаляю все скобки и спличу по запятой.

решение
numbers = line     .replace(' ', '')     .replace('[', '')     .replace(']', '')     .split(',')      collections.Counter(numbers)

Задача 2 Лучшее приближение (50 баллов)

Расстояние Хэмминга (кодовое расстояние) — число позиций, в которых соответствующие символы двух слов одинаковой длины различны. В более общем случае расстояние Хэмминга применяется для строк одинаковой длины любых q-ичных алфавитов и служит метрикой различия (функцией, определяющей расстояние в метрическом пространстве) объектов одинаковой размерности.

Вам даны пары бинарных строк одинаковой длины (s, q). Найдите бинарную строку t, для которой величина max(hamming(s,t), hamming(d,t)) минимальна ( hamming(s,t) — расстояние Хемминга между строками s и t ). Если бинарных строк минимизирующих данную величину несколько, выведите любую из них.

пример

Ввод
5 3
01000 00110
00000 11111
00001 00111

Вывод
01100
01010
00011

Такого рода задачи в разных вариациях есть на литкоде, с формулировкой про монетки. Например, монетки надо перевернуть определенным образом, чтобы отсортировать последовательность за минимальное количество переворотов (или перестановок).

Тут похожий принцип. Максимальная величина будет минимальной, если строка tбудет отличаться от s и dна одинаковое расстояние.

решение
#любопытный факт: эта функция была сгенерирована copilot-ом, по сигнатуре def hamming def hamming(a, b):     return sum(c1 != c2 for c1, c2 in zip(a, b))  def getMinHamming(a, b):     # Количество переворотов равно половине расстояния между a и b     # Таким образом расстояние до a и до b будет одинаковым и следовательно максимум будет минимальным     flipCount = hamming(a, b) // 2      result = [char for char in a]     for i in range(len(b)):         #если значения не совпадают, меняем первые flipCount знаков         if b[i] != a[i]:             result[i] = b[i]             flipCount -= 1         if flipCount == 0:             break          return ''.join(result)

Задача 3 i10n (25 баллов)

Для некоторых терминов с большим количество букв принято использовать сокращения: l10n вместо localization или i18n вместо internationalization.

Вам дан набор из n строк длиной не более 20 символов. Для каждой строки w определим сокращение pNs, где p – некоторый непустой префикс строки w, s – некоторый непустой суффикс строки w, N – целое число больше единицы, которое задает количество пропущенных букв между префиксом и суффиксом. Будем рассматривать только такие сокращения, где длины p и s совпадают.

Из всех сокращений для каждого слова из набора найдите такое, что никакое другое слово не может быть сокращено таким же образом.

Выведите n строк, по одной строке для каждого слова из входных данных (в порядке следования во входных данных) – минимальное по длине подходящее под условие задачи сокращение, если подходящего сокращения нет, выведите слово без сокращения.

пример

Ввод

10
aaaa
abaa
abab
bbbb
baba
aaaaaaaaaaaaaaaaaaaa
abaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbb
sjfdhlsakdjfhsald
sdfasdfsadfafdsfdd

Вывод

aaaa
abaa
a2b
b2b
b2a
aa16aa
ab16aa
b18b
s15d
s16d

Заведем словарь где ключ сокращенное слово, а значение — слово которое можно сократить этим префиксом. Для каждой строки перебираем префиксы и проверяем есть ли они в словаре, если его там нет — сохраняем. Если есть увеличиваем префикс для слова в словаре и для i-гослова. Мне понадобилось еще несколько словарей, чтобы отслеживать строки которые уже появлялись в результатах, и связывать строку со сжатой. Код получился очень грязным, но свою задачу выполняет.

решение
#Для сохранения промежуточных результатов usedResults = {} #ключ - сжатый текст, значение - исходный текст result = {} #ключ - исходный текст, значение - сжатый текст для быстрого поиска resultMapper = {}  def compress(st, n):     if prefix * 2 >= len(st) - 1:         return st      return st[:n] + str(len(st) - n * 2) + st[-n:]   def updateResult(compressed, prefix):     tmp = resultMapper[compressed]     del resultMapper[compressed]     del result [tmp]     compressed = compress(tmp, prefix)     resultMapper[compressed] = tmp     result[tmp] = compressed  for st in data:     for i in range(len(st) // 2):         compressed = compress(st, i+1)                   if not compressed in usedResults:             usedResults[compressed] = True              if compressed in resultMapper:                 updateResult(compressed, i+2)                 continue              result[st] = compressed             resultMapper[compressed] = st             break              # такая строка уже была, удалим ее из словаря и перезапишем ее новым значением         if compressed in resultMapper:             updateResult(compressed, i+2)

Задача 4 Arithmetics Inc. (75 баллов)

Компания Arithmetics Inc. разрабатывает программное обеспечение для работы с бесконечными арифметическими прогрессиями. Необходимо разработать структуру данных, которая будет хранить арифметические прогрессии и поддерживать следующие операции:

1. Операция первого типа позволяет добавить новую арифметическую прогрессию в структуру.
2. Операция второго типа позволяет удалить заданную арифметическую прогрессию из структуры.
3. Операция третьего типа находит арифметическую прогрессию с минимальным первым элементом и возвращает найденный элемент, предварительно заменив стартовый элемент в прогрессии на следующей в ней.

Если таких прогрессий несколько, то обрабатывается прогрессия, у которой минимальный идентификатор.

На вход подается одно целое положительное число q (1 \le q \le 10^5 )Далее на вход подаются q строк в следующем формате:

— Если это операция первого типа, то на вход подаются четыре числа 1, a_1, d, id (0 \le |a_1|, |d| \le 10^9, 1 \le id \le 10^9)— первый элемент и разность добавляемой прогрессии, а также ее идентификатор.
— Если это операция второго типа, то на вход подаются два числа 2, id— идентификатор прогрессии, которую необходимо удалить.
— Если это операция третьего типа, то на вход подается одно число 3. В этот момент хотя бы одна прогрессия будет находиться в структуре.

Гарантируется, что все id арифметических прогрессий различны. Удаляемая прогрессия, гарантированно находится в структуре данных.

пример

Ввод

15 1 3 -4 1 1 -5 4 3 1 -2 10 2 3 3 2 3 3 3 2 2 1 -5 4 4 3 2 1 3 3 3

Вывод

-5 -2 3 -1 -5 -5 -1 3

Интересная задачка, где за туманной формулировкой, предлагается сделать очередь с приоритетом. Пример решения есть в документации python. Если коротко, то решение основывается на куче и словаре. Куча используется для вставки за log(n), а словарь используется для хранения признака удаленного элемента, чтобы обеспечить удаление за константное время.

Необходимое количество баллов набрано с запасом. Похожие задачи я решал раньше, поэтому проблем не возникло. Осталось дождаться собеседования 30 июля.

Общение с рекрутером и собеседование

Его не было. Как и в прошлый раз, рекрутер со мной не связался. В техподдержку я не писал — не вижу смысла напрашиваться.

В комментах к прошлой статье отметили, что, возможно, мне просто не повезло. Теперь, похоже, мне не повезло дважды?

Интересно было бы узнать какая цель у этих мероприятий.

Своим результатом, я в принципе доволен, я люблю порешать задачки на время. В итоге задачи мне понравились, особенно третья. Четвертая задача тоже интересная, если решать ее первый раз. В последнее время я готовлюсь к собеседованиям на литкоде и заметил, что раньше в было больше задач на графы. Теперь больше задач на очереди, графов почти нет, интересно почему так.

Спасибо за внимание.


ссылка на оригинал статьи https://habr.com/ru/post/680036/