Во время работы в ASIC дизайн центре я потратил немало времени на отладку ошибок и падений ядра, просматривая временные диаграммы на шинах AXI от процессора к памяти. Иногда оказывалось, что адрес чтения из памяти оказывался 0x00000000
- классический случай разыменования нулевого указателя в C. На системах с ОС это приводит к известному всем C программистам segfault-у. И в bare metal системах разыменование NULL
может приводить к интересным ситуациям. В этой статье рассмотрим, что происходит при разыменовании NULL
, используя для пример open source RISC-V ядро scr1 и open source инструмент симуляции RTL Verilator.
C *
Типизированный язык программирования
Новости
Синтез Цифрового БИХ Фильтра Низких Частот
Мне потребовалось синтезировать быстрый цифровой фильтр нижних частот. Причем этот фильтр должен работать в реальном времени на микроконтроллере. Тут я понял, что надо вспоминать с какой стороны следует подходить к цифровым IIR фильтрам.
Порой бывает так, что вам присылают скриншот цифрового фильтра и надо понять, как это будет работать.
Далее я покажу некоторые приёмы расчета IIR фильтра по известным коэффициентам.
Числа с фиксированной запятой для NES/DENDY
Консоль Dendy в первую очередь ассоциируется с относительно простыми играми (Super Mario Bros, Duck Hunt, Battle City и т. д.), которые обычно не требуют сложных расчётов и обходятся целочисленной математикой. Но как только нужно сделать трёхмерную графику или сложную физику, сразу появляется потребность в точных вычислениях и дробных числах.
Самым простым и быстрым способом программного представления дробей являются числа с фиксированной запятой (Fixed‑point числа). О реализации такой арифметики для NES/Dendy мы и поговорим.
Я ускорил генерацию blurhash в 3̶6̶ 8̶7̶ 128 раз
Старую собаку новым трюкам не обучишь, вот и я взялся за старое. Blurhash — это компактный способ представления размытой превьюшки изображения в виде ASCII-строки. Разработан финской компанией Wolt (аналог Delivery Club). Давно хотелось внедрить такое к себе в API, чтобы любой клиент мог более плавно и изящно делать загрузку контент на своем сайте. Но сколько я на него смотрел — всегда не давала покоя скорость работы, уж больно медленно и «в лоб» он был написан. Но вот время пришло наконец-то разобраться, что же он так медленно работает.
Истории
GPIO STM32, альтернативный вариант
Когда в 2011 году я переходил c atmega8 на stm32, меня очень вдохновил проект opencm3. Но вдохновил не на его изучение, а на написание похожего. На сегодня в моём варианте почти библиотеки есть макросы регистров для микроконтроллеров серий stm32f10x и stm32f40x, stm8s003, nrf51, nrf52, rp2040, и cc2640/1310. Реально же протестирована из этого списка только stm32f103. Кроме регистров для 103-й я написал базовые функции для включения/выключения тактирования периферии и управления портами ввода‑вывода. А также написаны примеры для USB профилей HID gamepad, HID keyboard и USB serial port. В этом же посте задокументирую функции портов и тактирования.
Quake на плате микроконтроллера с 276 килобайтами ОЗУ
Введение
В прошлом году в рамках празднования 30-летней годовщины Doom мы продемонстрировали его порт для платы Sparkfun Thing Plus Matter MGM240P. В этом году мы портируем Quake на плату Arduino Nano Matter.
Язык BCPL из которого получился C
Готовясь к собеседованиям по Go я обратил внимание на то что среди его создателей Кен Томпсон - я смутно помнил что он также стоял у истоков языка C, но без подробностей. На самом деле было примерно так: Мартин Ричардс написал BCPL, Кен Томпсон переделал его в B повыкидывав "ненужное" и улучшив синтаксис, а Деннис Ритчи добавил разнообразие типов чтобы получился язык С который мы уже более-менее представляем.
И вот я решил заглянуть в BCPL - насколько он был похож и в чем отличался. Кратким обзором - сравнением с С я и хочу поделиться! Вы сможете и сами "пощупать" его при желании :)
Интеграция библиотек C/C++ в .NET приложения с использованием P/Invoke
В своей практике я несколько раз сталкивался с задачей интеграции и взаимодействия с низкоуровневыми языками программирования (C/C++) и низкоуровневыми API, такими как Windows API.
Этот туториал упрощает мой опыт использования низкоуровневых языков и API, а также демонстрирует, как написать и интегрировать простую C-библиотеку в ваше C# приложение с интеграцией Windows API.
Эта тема имеет специальное название — Platform Invocation (P/Invoke) в .NET.
PS: Есть и другие простые способы решения этой проблемы. Вы можете воспользоваться любым из них, но этот урок поможет вам понять, как работает P/Invoke.
P/Invoke (Platform Invocation) — это мощный механизм в C#, который позволяет взаимодействовать с неуправляемыми библиотеками кода (как правило, DLL) из управляемых приложений .NET. Это дает возможность использовать существующие кодовые базы на C или C++ или получать доступ к системным функциям, которые напрямую не поддерживаются в .NET.
P/Invoke играет важную роль в C#, так как позволяет преодолеть разрыв между управляемым миром .NET и неуправляемым миром нативного кода (обычно на C или C++).
Многие компании имеют значительные вложения в код на C или C++. P/Invoke позволяет использовать эту функциональность без необходимости переписывать её на C#. Это зачастую более эффективно, чем создавать всё с нуля.
О, я забыл упомянуть: если чтение кажется скучным, вот русская версия видео на YouTube, где я всё объясняю с нуля и более подробно.
Реализация поддержки кириллицы в терминале для МК AVR
В одной из прошлых статей я писал про разработку, точнее, про расширение терминального интерфейса микроконтроллера AVR, добавив функционал обработки управляющих символов и последовательностей для поддержки истории и редактирования команд. В данной статье я решил написать про доработку терминального интерфейса функцией поддержки кириллицы. Как правило, терминальный интерфейс подразумевает ввод команд и вывод информации латиницей. Однако совсем несложно реализовать ввод команд или отображение текста на русском или другом языке с применением кириллицы, что может оказаться иногда удобной вещью на практике.
Игры на промышленных девайсах? Легко! Портируем эмуляторы и Wolfenstein 3D на ТСД за 500 рублей на практике
Дисклеймер: употребляемые слова вроде «портируем», «хакаем» и «реверсим» совсем не значат, что статья предназначена исключительно для гиков! Я стараюсь писать так, чтобы было понятно и интересно абсолютно всем!
Наверняка многие мои читатели так или иначе слышали новости о том, что известные игры были портированы на самые разные платформы. В какой-то момент к такой же идее пришёл и я, однако мне хотелось портировать игры и эмуляторы на довольно диковинные промышленные девайсы, которые работают на платформе Windows CE. Как я портировал Wolfenstein и эмулятор NES на бравого, но списанного в утиль трудягу склада и зачем? Читайте в сегодняшней подробнейшей статье!
Некоторые малоизвестные фичи, фокусы и причуды языка C
В этом посте разобраны некоторые фокусы, причуды и фичи языка C (некоторые из них – весьма фундаментальные!), которые, казалось бы, могут сбить с толку даже опытного разработчика. Поэтому я потрудился сделать за вас грязную работу и (в произвольном порядке) собрал некоторые из них в этом посте. Примеры сопровождаются ещё более вольными краткими пояснениями и/или листингами (некоторые из них цитируются).
Конечно же, здесь я не берусь перечислять абсолютно всё, так как факты из разряда «функция nan()
не может устанавливать errno
, поскольку в определённых ситуациях поведёт себя как strtod()
» не слишком интересны.
ВНИМАНИЕ: сам факт попадания тех или иных вещей в эту подборку не означает автоматически, что я рекомендую или, наоборот, не рекомендую ими пользоваться! Некоторые из приведённых примеров никогда не должны просачиваться за пределы списков наподобие этого, тогда как другие примеры невероятно полезны! Уверен, что могу положиться на ваш здравый смысл, дорогие читатели.
Создание аппаратно-независимых библиотек для микроконтроллеров
В данной статье я хотел бы вам расказать, как можно создавать свои аппаратно-независимые библиотеки для микроконтроллеров для работы с цифровыи микросхемами.
Суть создания аппаратно-независимой библиотеки состоит в том, чтобы отвязаться от того уровня абстракции (библиотеки и фреймворки), который предоставляет производитель микроконтроллеров, внутри реализуемой библиотеки. Например, для STM32 - HAL, ESP32 - ESP-IDF или Arduino, для AVR зачастую используют Arduino. Это позволит использовать одну и ту же библиотеку на различных микроконтроллерах (и не только) без изменения кода библиотеки под каждый камень.
Руководство по межпроцессному взаимодействию (IPC) в Linux — Часть 3
Представляю вашему вниманию третью (заключительную) часть перевода статьи A guide to inter-process communication in Linux.
Первая часть перевода была посвящена общему введению в курс дела и механизму разделяемого хранилища (shared storage). Во второй части были рассмотрены механизмы каналов (именованных и неименованных) и очереди сообщений. В третьей части автор статьи ставит перед собой цель рассказать вам о сокетах и сигналах; подводит общие итоги по межпроцессному взаимодействию в Linux.
Приятного чтения!
Ближайшие события
Компилируем и выполняем C на JavaScript
std::array в С++ не медленнее массива в С
Или почему не нужно бояться того, что удобно работает. Узнаем, что по этому поводу пишет стандарт, потом заглянем в реализации std::array в libc++ и libstdc++, затем посмотрим на ассемблер некоторых операций с этими объектами. Завершим всё это дело, как и полагается, бенчмаркингом.
Стилистический анализатор: синхронизация объявлений и определений static функций
Представлена утилита-надзиратель, что последовательность определения static функций совпадает с последовательностью объявляения static функций.
О том как я генератор Brainfuck кода писал
Разбираемся в Brainfuck, Пишем для него генератор кода и интерпретатор
Или рассказ о том, как я решал легкую C задачку
Однако я решил что решать эту задачу привычным методом будет скучно и я решил слегка усложнить себе задачу, чтобы поинтереснее было. Так и появилась идея написать этот код на brainfuck, а на C интерпретатор для него.
Естественно делать это голыми руками будет больно и не приятно, поэтому я решил написать генератор brainfuck кода на Java.
Python: как переменные работают на самом деле? Погружаемся в байткод и C
Привет! Меня зовут Никита Соболев, я core-разработчик языка программирования CPython, а так же автор серии видео про его устройство.
Сегодня я хочу рассказать, как на самом деле работают переменные в CPython.
Под катом куча кишков питона и видео на 46 минут с дополнительными кишками питона (ни один настоящий питон не пострадал при написании данной статьи).
Flappy Bird на Си для Android весом APK всего 92 Килобайта
Это невозможно! И вы будете правы, только ошибка в том, что это — реальность.
Или как сказал один человек «Это компьютерная наука. Ограничений нет. Я могу делать все, что захочу. Это всего лишь биты информации.»
Стилистический Анализатор: Синхронизация порядка объявлений и определений функций
У нас в организации есть обязательное правило оформления исходников, которое звучит так:
Порядок объявления С-функций должен совпадать с порядком определения С-функций.
В этом тексте представлен алгоритм работы консольной программы, которая автоматически выявляет нарушения этого странного правила.
Вклад авторов
Andrey2008 3740.9SvyatoslavMC 1738.0alizar 714.0Firemoon 702.8bodyawm 551.0zzeng 535.0humbug 523.0m1rko 449.6anastasiak2512 422.0aabzel 416.0