All streams
Search
Write a publication
Pull to refresh
-4
Эдуард Зиганшин @e-zigread⁠-⁠only

Разработка электроники

Send message

Как правильно читать объявления в Си

Reading time7 min
Views47K
Даже совсем зеленые программисты на Си, не испытывают проблем с чтением таких объявлений:
int foo[5]; // foo массив из 5 элементов типа int
char *foo; // foo указатель на char
double foo(); // foo функция возвращающая значение типа double

Но как только объявления становятся немного сложнее, проблематично точно сказать что это. Например:
char *(*(**foo[][8])())[];

Как же научиться их читать?

Пока смерть не разлучит нас или всё о static в C++

Reading time8 min
Views226K


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

Читать дальше →

Пара мыслей о геттерах и сеттерах в C++

Reading time6 min
Views30K

Эта статья посвящена геттерам и сеттерам в C++. Приношу свои извинения, но речь пойдет не о корутинах. К слову, в ближайшее время появится вторая часть про пулы потоков.

TL;DR: геттеры и сеттеры не очень хорошо подходят для структуроподобных объектов.

Читать далее

Работа с параметрами в EEPROM, как не износить память

Reading time13 min
Views14K

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

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

Особенность таких параметров заключается в том, что их нельзя писать просто так в одно и то же место EEPROM, вы просто израсходуете все циклы записи EEPROM. Например, если, необходимо писать время работы один раз в 1 минуту, то нетрудно посчитать, что с EEPROM в 1 000 000 циклов записей, вы загубите его меньше чем за 2 года. А что такое 2 года, если обычное измерительное устройство имеет время поверки 3 и даже 5 лет.

Кроме того, не все EEPROM имеют 1 000 000 циклов записей, многие дешевые EEPROM все еще производятся по старым технологиям с количеством записей 100 000. А если учесть, что 1 000 000 циклов указывается только при идеальных условиях, а скажем при высоких температурах это число может снизиться вдвое, то ваша EEPROM может оказаться самым ненадежным элементом уже в первый год работы устройства.

Продлить жизнь EEPROM

Как правильно защитить кожу зимой и летом

Reading time14 min
Views14K

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

Чтобы такого не происходило, надо либо не вылезать на солнце после любых микротравм, либо правильно защищать кожу. Поэтому сегодня мы будем говорить об уровнях SPF, кислотных пилингах, после которых придётся отсиживаться летом в бункере, и о том, что вообще стоит мазать на лицо, если вы собрались на природу. Чтобы это структурнее выглядело, разобьём на четыре блока:

1. Что и как повреждает кожу в разные сезоны. Почему появляются пигментные пятна.

2. Какая защита нужна коже.

3. Как правильно увлажнить (нет, просто умыться недостаточно).

4. Как всё нанесённое отмыть обратно и зачем.

Читать далее

Inline variables

Reading time8 min
Views40K

Первоначальное назначение ключевого слова inline состояло в том, чтобы служить индикатором для оптимизатора, что встроенная подстановка функции предпочтительнее вызова функции, то есть вместо выполнения команды CPU для передачи управления в тело функции, копия тела функции выполняется без генерирования вызова. Эта оптимизация (inline expansion) основана на идее, что выполнение вызова функции является относительно дорогостоящим: оно требует перехода к новой подпрограмме, передачи аргументов функции и копирования возвращаемых значений. Inline expansion подавляет вызов функции путем копирования инструкций функции непосредственно в тело вызывающего объекта.

Читать далее

Рефлексия в C++14

Reading time15 min
Views32K
Данная статья является расшифровкой (с небольшими правками) доклада Антона antoshkka Полухина — “Немного магии для C++14”.

Я тут недавно ковырялся с C++ и случайно открыл пару новых приемов метапрограммирования, которые позволяют делать рефлексию в C++14. Пара мотивационных примеров. Вот у вас есть какая-то POD структура, в ней какие-то поля:

struct complicated_struct {
    int i;
    short s;
    double d;
    unsigned u;
};

Количество полей и их имена не имеют значение, важно то, что с этой структуры мы можем написать следующий кусочек кода:

#include <iostream>
#include "magic_get.hpp"

struct complicated_struct { /* … */ };

int main() {
    using namespace pod_ops;
    complicated_struct s {1, 2, 3.0, 4};
    std::cout << "s == " << s << std::endl; // Compile time error?
}

Функция main, в ней создаем переменную нашей структуры, как-то ее инициализируем через aggregate инициализацию, а потом эту переменную пытаемся вывести в std::cout. И в этот момент у нас, по идее, должна быть ошибка компиляции: мы не определили оператор вывода в поток для нашей структуры, компилятор не знает как все это скомпилировать и вывести. Однако, оно скомпилируется и выведет содержимое структуры:

antoshkka@home:~$ ./test
s == {1, 2, 3.0, 4}

Читать дальше →

Защита от гнева богов. Устройства защиты от импульсных перенапряжений

Reading time17 min
Views71K
Продолжаем тему электроликбеза про устройства защиты, и этот пост — знакомство с устройствами защиты от импульсных перенапряжений (УЗИП). Это устройства для вашего электрощита, призванные бороться с кратковременными всплесками напряжения, например из-за грозы. Текст рассчитан для нетехнарей, так что добро пожаловать) Видеоверсия в конце.


Познакомиться с УЗИП

Работа с параметрами во внешнем EEPROM

Reading time8 min
Views9.3K

Привет Хабр. Наконец-то у меня появилось свободное время и я могу немного поделиться своим опытом, возможно кому-то это будет полезно, и поможет в его работе, и я этому буду безусловно рад. Ну что же,....

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

И вот если вам интересен один из способов, который использую я со студентами добро пожаловать под cut

Доступ к EEPROM параметрам

Проводим нагрузочное тестирование скоростных USB-библиотек для STM32F103C8T6

Reading time10 min
Views4.8K
В предыдущей статье я показывал предельную скорость шины USB у микроконтроллера STM32F103 со штатной библиотекой MiddleWare. В комментариях мне показали сразу две самодельных библиотеки, выжимающих из USB FS все соки. Но автор одной из библиотек высказал мысль, что быстро-то они работают быстро, а насколько надёжно – не ясно. Он считал, что было бы полезно провести нагрузочное тестирование с какими-то полезными данными. Только если они не потеряются и не исказятся, можно будет сказать, что библиотеки имеют право на жизнь.



Само собой, я еле дождался выходных, чтобы провести проверки. Давайте рассмотрим результаты испытаний. А чтобы было интересней, попутно рассмотрим технологию отображения переменных «на лету», без остановки процессорного ядра. Ну, и технологию визуальной отладки elf-файлов, собранных пакетными компиляторами.
Читать дальше →

Как компилятор C++ находит правильную функцию

Reading time13 min
Views16K

Увлекательный пересказ того, как компилятор C++ находит правильную функцию, которую надо вызвать, когда в коде вызывается функция. По сути, это просто сжатое объяснение алгоритма, уже описанного на cppreference.com, который, в свою очередь, является сокращенной версией стандарта C++.

Читать дальше →

Stm32 + USB на шаблонах C++. Продолжение. Делаем CDC

Reading time6 min
Views9.7K

Продолжаю разработку полностью шаблонной библиотеки под микроконтроллеры Stm32, в прошлой статье рассказал об успешной (почти) реализации HID устройства. Еще одним популярным классом USB является виртуальный COM-порт (VCP) из класса CDC.

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

Читать далее

Обзор счётчиков Морриса

Reading time7 min
Views5.3K

При реализации потоковых алгоритмов часто возникает задача подсчёта каких-то событий: приход пакета, установка соединения; при этом доступная память может стать узким местом: обычный n-битный счётчик позволяет учесть не более 2^n - 1событий.
Одним из способов обработки большего диапазона значений, используя то же количество памяти, является вероятностный подсчёт. В этой статье будет предложен обзор известного алгоритма Морриса, а также некоторых его обобщений.

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

Мы начнём с разбора простейшего алгоритма вероятностного подсчёта, выделим его недостатки (раздел 2). Затем (раздел 3) опишем алгоритм, впервые преложенный Робертом Моррисом в 1978 году, укажем его важнейшие свойства и приемущества. Для большинства нетривиальных формул и утверждений в тексте присутствуют наши доказательства — интересующийся читатель сможет найти их во вкладышах. В трёх последующих разделах мы изложим полезные расширения классического алгоритма: вы узнаете, что общего у счётчиков Морриса и экспоненциального распада, как можно уменьшить ошибку, пожертвовав максимальным значением, и как эффективно обрабатывать взвешенные события.

Читать далее

Стандарт C++20: обзор новых возможностей C++. Часть 4 «Ranges»

Reading time10 min
Views32K


25 февраля автор курса «Разработчик C++» в Яндекс.Практикуме Георгий Осипов рассказал о новом этапе языка C++ — Стандарте C++20. В лекции сделан обзор всех основных нововведений Стандарта, рассказывается, как их применять уже сейчас, и чем они могут быть полезны.

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

  1. Модули и краткая история C++.
  2. Операция «космический корабль».
  3. Концепты.
  4. Ranges.
  5. Корутины.
  6. Другие фичи ядра и стандартной библиотеки. Заключение.

Это четвёртая часть, рассказывающая о новом модуле стандартной библиотеки, — Ranges.
Читать дальше →

Стандарт C++20: обзор новых возможностей C++. Часть 3 «Концепты»

Reading time11 min
Views51K


25 февраля автор курса «Разработчик C++» в Яндекс.Практикуме Георгий Осипов рассказал о новом этапе языка C++ — Стандарте C++20. В лекции сделан обзор всех основных нововведений Стандарта, рассказывается, как их применять уже сейчас и чем они могут быть полезны.

При подготовке вебинара стояла цель сделать обзор всех ключевых возможностей C++20. Поэтому вебинар получился насыщенным и растянулся на почти 2,5 часа. Для вашего удобства текст мы разбили на шесть частей:

  1. Модули и краткая история C++.
  2. Операция «космический корабль».
  3. Концепты.
  4. Ranges.
  5. Корутины.
  6. Другие фичи ядра и стандартной библиотеки. Заключение.

Это третья часть, рассказывающая о концептах и ограничениях в современном C++.
Читать дальше →

Литье пластика со встроенной электроникой (IME): что это, и почему это новый тренд

Reading time6 min
Views22K

Вот уже несколько лет производители электроники говорят о новой прорывной технологии, которая изменит привычные нам устройства и подход к их проектированию: никаких больше механических кнопок и переключателей, сокращение толщины до 2 мм, снижение веса на 70%, а себестоимости — на 30%. Причем речь идет не о будущих серийных устройствах типа экрана с двойным сложением, который недавно представила Samsung, а о технологии производства, которая уже сейчас используется в автомобилях, бытовой технике и IoT-гаджетах. Эта технология называется «литье с интегрированной / встроенной электроникой» или In-Mold Electronics (IME). 

На Хабре эту интересную тему еще почему-то не затрагивали. Исправляем это досадное недоразумение. 

Читать далее

Предельная скорость USB на STM32F103, чем она обусловлена?

Reading time18 min
Views22K
У данной статьи тяжёлая история. Мне надо было сделать USB-устройства, не выполняющие никакой функции, но работающие на максимальной скорости. Это были бы эталоны для проверки некоторых вещей. HS-устройство я сделал на базе ПЛИС и ULPI, загрузив туда «прошивку» на базе проекта Daisho. Для FS-устройства, разумеется, была взята «голубая пилюля». Скорость получалась смешная. Прямо скажем, черепашья скорость.



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

Но неожиданно, с тех пор мне по работе уже трижды приходилось пересказывать эти результаты то Заказчикам, то коллегам. Все они считали, что этот контроллер может больше. И мне приходилось вновь и вновь показывать физическую суть. Поэтому сделать документ было нужно хотя бы чтобы давать его прочесть тем, кто вновь будет говорить, что шина шустрая, контроллер быстрый… Ну, а если и делать документ, то почему бы не оформить его в виде статьи и не выложить на всеобщее обозрение?

Итак, давайте выясним, почему именно STM32F103C8T6 не может прокачать по шине USB данные на скорости 12 мегабит, заняв всю ширину предоставленного канала, и можно ли с этим что-то сделать.
Читать дальше →

Практическое руководство по анонимности в онлайне

Reading time9 min
Views220K

Направленная антенна для удалённого доступа к публичному Wi-Fi

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

Но это возможно.

Предупреждение. Для усвоения информации в полном объёме требуется несколько недель.
Читать дальше →

Заметка о специфике разработки электроники в космической отрасли

Reading time8 min
Views8.3K

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

Вперёд, галопом по европам

Линейная алгебра для Data Science и Machine Learning

Reading time7 min
Views34K

Линейная алгебра в Data Science и Machine Learning является основополагающей. Новички, начинающие свой путь обучения в области Data Science, а также признанные практики должны развить хорошее понимание основных понятий линейной алгебры.

Специально к новому старту курса математика и Machine Learning для Data Science делимся переводом статьи Бенджамина Оби Тайо — физика, кандидата наук и преподавателя Data Science — о том, что нужно знать, чтобы лучше понимать Data Science и Machine Learning.

Читать далее

Information

Rating
Does not participate
Location
Мытищи, Москва и Московская обл., Россия
Date of birth
Registered
Activity

Specialization

System Software Engineer, Hardware Engineer
Senior
From 225,000 ₽
C++
Qt
Verilog HDL
VHDL
C
Git
Linux