Как стать автором
Поиск
Написать публикацию
Обновить
244.89

C *

Типизированный язык программирования

Сначала показывать
Порог рейтинга
Уровень сложности

ElBear ACE-Uno — первый запуск в Mac OS

Время на прочтение4 мин
Количество просмотров1.1K

В статье рассмотрим, как начать работу с ElBear ACE-UNO в Mac OS. Постарался для вас сделать выжимку, чтобы можно было скорее приступить к работе с платой и потратить на это на пару-тройку суток меньше)

P.S. Для пользователей Windows статья также может быть полезной.

Читать далее

QapGen: Создаём мощные парсеры на C++

Время на прочтение36 мин
Количество просмотров4.1K

QapDSLv2 — это язык который транслируется в обычный C++ код. Он позволяет удобно и компактно задавать грамматики/правила разбора кода программ, значительно упрощая разработку компиляторов/анализаторов/трансляторов.

QapGen — это генератор дерева_лексеров/парсеров описанных на QapDSLv2. Сама грамматика QapDSLv2 описана на QapDSLv2 на 100%. Поэтому QapGen как основной читатель этой грамматики сам генерирует часть своего кода(весь парсер QapDSLv2).

Основные фишки QapDSLv2 + QapGen — это:

1) Отсутствие этапа токенизации — дерево лексеров разбивает входной поток на лексемы и сохраняет их в строго типизированных древовидных С++ структурах пропуская этап токенизации.

2) Генерация оптимизированного кода полиморфных лексеров.

3) Полное сохранение всех лексем(даже разделители сохраняются, такие как пробелы/переходы на новую строку и комментарии) в результирующем дереве.

4) Возможность сохранить как оригинальное дерево, так и модифицированное обратно в код/текст без потери разделителей/комментариев.

5) Автоматическая генерация кода посетителей(это такой паттерн проектирования).

А теперь пример самой сочной части(рекурсивно самоописывающийся код):

structt_target_struct:i_target_item{
structt_keyword{
stringkw=any_str_from_vec(split("struct,class",","));
" "? // optional separator
};
structt_body_semicolon:i_struct_impl{";"};
structt_body_impl:i_struct_impl{
"{" // жрём скобочку
vector<TAutoPtr<i_target_item>>nested?; //рекурсия!
" "?
vector<TAutoPtr<i_struct_field>>arr?; // парсим поля
" "?
TAutoPtr<t_cpp_code>c?; // остальной С++ код
" "?
"}"
};
structt_parent{
stringa_or_c=any_str_from_vec(split("=>,:",","));
" "?
t_namename;
};
//точка входа в парсер:
TAutoPtr<t_keyword>kw?; //парсимstruct/class
t_namename; //парсим имя
" "?
TAutoPtr<t_parent>parent?;
" "?
TAutoPtr<i_struct_impl>body;
};

Читать далее

Рулим светодиодом по UDP и ESP8266

Время на прочтение8 мин
Количество просмотров5.6K

Привет, Хабр!

Сегодня я поделюсь опытом работы с протоколом UDP вместе с микроконтроллером ESP8266, где я управлял светодиодом, а также получал температуру с датчика DHT11. Всё управление будет происходить из Android-приложения, написание логики которого также будет рассмотрено.

Читать далее

Программируем квадрокоптер на STM32

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров16K

Данный проект представляет собой систему стабилизации квадрокоптера на базе микроконтроллера STM32F411, реализованную на языке C. Включает обработку данных с датчиков (акселерометр, гироскоп), PID-регуляторы для управления моторами и алгоритмы фильтрации. Подходит для образовательных целей и DIY-проектов.

Читать далее

Оптимизация языковой модели Mamba для выполнения на CPU

Уровень сложностиСложный
Время на прочтение4 мин
Количество просмотров3.3K

Как оптимизировать модель Mamba для выполнения на CPU? Ускоряем код в 20 раз по сравнению с PyTorch, нарушая в процессе все правила оптимизации.

Читать далее

Оптимизация управления задачами в Zephyr OS с помощью Thread Pool

Время на прочтение3 мин
Количество просмотров820

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

К счастью, в Zephyr OS есть спасение — Thread Pool: набор заранее выделенных потоков, которые берут задачи из очереди и выполняют их без лишнего мусора. Этот подход экономит ресурсы, время и твою нервную систему.

Читать далее

Taming Hard Faults in Zephyr OS: Практическое руководство для embedded-разработчиков

Время на прочтение2 мин
Количество просмотров1.5K

🚨 Что такое Hard Fault простыми словами

Hard Fault — это критическая ошибка процессора.
Проще говоря, это ситуация, когда микроконтроллер встречает что-то настолько «невозможное» для себя, что не может продолжить выполнение программы.

Типичный пример — попытка обратиться к памяти, которой не существует, или выполнение запрещённой инструкции.

Когда это происходит, процессор сразу передаёт управление специальному обработчику — Hard Fault Handler.

Читать далее

От PHP к Zig: как я избавился от костылей в биллинг-системе

Уровень сложностиПростой
Время на прочтение38 мин
Количество просмотров6.5K

Недавно я занялся реинжинирингом биллинг-панели для VPN, заменив legacy-PHP на Zig.

Результат: скорость выросла в 20 раз, а нагрузка упала на 70%. Но самое интересное — как мне удалось встроить Zig-код прямо в C-бинарник, хотя в интернете почти нет guides на эту тему.

Хотите узнать, как я смог избежать костылей и сделать систему в 10 раз надежнее? Тогда читайте полную статью — там всё: от боли PHP до хитростей сборки Zig в продакшене.

Читать далее

ToF-датчик VL53L0 и STM32F103C8T6

Время на прочтение5 мин
Количество просмотров5.1K

Подключение датчика VL53L0X к микроконтроллеру STM32F103 и вывод расстояния в реальном времени. Рассмотрены особенности инициализации датчика, настройка I²C-интерфейса и обработка данных. Приведен пример кода на языке C для работы с периферией STM32.

Читать далее

Spinlock vs. Mutex vs. Semaphore: Разбираемся в синхронизации с Zephyr OS

Уровень сложностиСредний
Время на прочтение3 мин
Количество просмотров2K

Всем привет! Сегодня хочу углубиться в одну из самых важных тем в мире Zephyr OS — синхронизацию потоков и задач. Если вы хоть раз работали с k_thread_create, гоняли потоки туда-сюда и ловили bus fault, вы меня понимаете.

Когда задача одна — всё просто. Но как только вырастает многопоточность, задачи начинают драться за общий ресурс — и тут без надёжной синхронизации не обойтись. У Zephyr OS есть три главных инструмента для этого: spinlock, mutex и semaphore. Каждый со своим характером и подводными камнями.

Читать далее

Embedded Linux для начинающих — Часть 1

Уровень сложностиПростой
Время на прочтение10 мин
Количество просмотров22K

Однажды по работе мне прилетела задача по сборке и запуску Linux на одноплатном ПК. Тогда я, будучи разработчиком ПО для микроконтроллеров, встал в небольшой ступор — задачка явно не решалась установкой IDE и нажатием в ней кнопки «Собрать проект». Гугл помог узнать о том, что существует некий Buildroot. В материалах по теме всё выглядело довольно просто: скачай, настрой, дерни пару команд, загрузи результат на одноплатник — и можно запускать! Получается, процесс не многим сложнее установки дистрибутива Linux или Windows на обычный ПК? Конечно же, нет. Ведь если у тебя в руках кастомный одноплатник неизвестного китайского бренда, а не BeagleBone или Raspberry Pi, то зарыться в Buildroot придётся с головой...

Читать далее

Навсегда избавляемся от дребезга и дружим микроконтроллер с кнопкой

Время на прочтение4 мин
Количество просмотров14K

Сегодня хочу поделиться опытом разработки небольшого модуля электронного циферблата на базе семисегментных дисплеев. Помимо этого, также рассмотрим способ устранения «дребезга контактов» механической кнопки, который я подсмотрел в одной известной книге и опробовал самостоятельно.

Читать далее

KEKS кодек и криптографические сообщения

Уровень сложностиСредний
Время на прочтение30 мин
Количество просмотров791
Данная статья напоминает о проблемах X.509 PKI и реализаций ASN.1. Предлагает компактный, быстрый, детерминированный, потоковый и простой формат кодирования данных KEKS, а также криптографические сообщения для подписи и шифрования данных с поддержкой пост-квантовых алгоритмов.

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

Ближайшие события

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

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров3.5K

Как вычислить экспоненциальную функцию быстро и с минимальной погрешностью? Пишем векторизованный код.

Читать далее

Цифровой фильтр без умножения

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров2.2K

Представлен цифровой фильтр без использования явной аппаратной или программной операции умножения, выполненный на основе двоичных сдвигов. Имеет дискретный ряд АЧХ, ФЧХ, при этом, эффективно реализуется на простейших контроллерах.

Читать далее

Как в 19 лет я начал путь разработчика встраиваемого ПО

Время на прочтение4 мин
Количество просмотров22K

Привет, Хабр! Меня зовут Данила, мне 21 год, и за последние 2,5 года я успел поработать в роли разработчика программного обеспечения для встраиваемых систем — в основном на базе STM32. В этой статье я хочу поделиться тем, как я вообще пришёл в эту сферу, с чего начинал, какие грабли собрал и какие выводы сделал по пути.

Читать далее

Уничтожение EXE: 640 Байт для программы на C

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров15K

В наше время разработчики уже не так беспокоятся о размере приложений. Некоторые простейшие приложения требуют под 200-300 МБ, а игра вообще может весить более 100 ГБ. Я уже не говорю про "Hello World", который иногда занимет под 180-260 КБ!

К счастью, есть возможность сократить размер приложения. О мусоре в exe'шнике и о способах его удаления написано в этой статье.

Читать далее

Об ошибках округления и способах борьбы с ними

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров5.1K

Почему при сложениии одинаковых чисел в разном порядке получаются разные результаты?
Как мининмизировать ошибки округления или избавиться от них совсем?

Читать далее

Глупые фокусы: преобразование 32-битного значения в 64-битное, когда неважен мусор в старших битах

Уровень сложностиСредний
Время на прочтение4 мин
Количество просмотров3.1K

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

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

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

Я решил использовать встроенный ассемблер gcc/clang и написать код, который сообщает системе: «Я могу создать 64-битное значение из 32-битного, не выполнив ни одной инструкции».

Читать далее

Перепрограммируем заводской Zigbee датчик протечки от компании Tuya

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров15K

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

Читать далее

Вклад авторов