Встраиваемые системы
Введение во встраиваемые системы
STM32F4 - ARM Cortex-M4 @ 168 MHz, 2 долларá за штуку. Raspberry Pi 5 - ARM Cortex-A76 @ 2.4 GHz, 80 долларов. В Tesla в машине стоит 70+ MCU, и ни один из них не Linux. Почему? Потому что когда педаль тормоза посылает сигнал ABS-контроллеру, у него есть 5 мс на реакцию. Linux с garbage collector такого не гарантирует. FreeRTOS с bare-metal кодом - гарантирует. Добро пожаловать в мир, где каждый байт RAM на счету и каждая миллисекунда предсказуема.
- **Tesla FSD**: custom silicon (HW4 chip) + 70+ MCU в машине; контроллер двигателя и тормоза - STM32-класс, не Linux; 5 мс гарантированный отклик
- **Медицина (FDA IEC 62304)**: кардиостимуляторы, инсулиновые помпы - firmware с формальной верификацией, сертификацией, 10-летним сроком поддержки; ошибка = жизнь
- **Промышленный IoT**: STM32 по 2 доллара контролирует турбину за 50 миллионов; соотношение стоимость/надёжность - главная причина MCU в промавтоматике
- **ESP32 в умном доме**: Wi-Fi + BLE + FreeRTOS за 3 доллара; Espressif продаёт миллиарды чипов в год
Микроконтроллер: компьютер на чипе
STM32F103 стоит 2 доллара. Raspberry Pi 5 - 80 долларов. Первый продаётся миллиардами. Второй - миллионами. Почему? Потому что для управления светофором, датчиком температуры или дверным замком не нужен четырёхъядерный ARM с Linux. Нужен **микроконтроллер** (MCU): CPU + Flash + RAM + периферия в одном чипе, включился - работает немедленно.
**Микроконтроллер (MCU, Microcontroller Unit)** - интегральная схема, содержащая: **CPU** (процессор, 8-400 MHz), **Flash** (энергонезависимая память для программы, 16 KB - 2 MB), **SRAM** (оперативная память, 2 KB - 512 KB), **периферию** (GPIO, UART, SPI, I2C, ADC, таймеры). Всё на одном кристалле - не нужны внешние чипы памяти.
| Параметр | Микроконтроллер (MCU) | Процессор (CPU) |
|---|---|---|
| Назначение | Управление устройством | Вычисления общего назначения |
| Частота | 8–400 MHz | 1–5 GHz |
| RAM | 2 KB – 512 KB | 8–128 GB |
| Стоимость | $0.10 – $15 | $50 – $1000 |
| Энергопотребление | μW – mW | 15 – 300 W |
| Периферия | Встроенная (GPIO, ADC, UART) | Внешняя (через чипсет) |
| ОС | Без ОС / RTOS | Linux / Windows |
**Масштаб**: в 2025 году произведено более 30 миллиардов MCU - больше 3 на каждого человека. Каждый автомобиль - 50-150 MCU. Tesla Model 3 - более 70. STM32 (ST Microelectronics), ESP32 (Espressif), AVR/ATmega (Microchip), NXP i.MX, TI MSP430 - лишь часть из сотен семейств. ESP32 с Wi-Fi и FreeRTOS стоит 3 доллара.
Intel 8048 - первый MCU
В 1976 году Intel выпустила 8048 - первый серийный микроконтроллер с CPU, RAM, ROM и портами ввода-вывода на одном чипе. Он использовался в клавиатуре IBM PC. Наследник 8051 (1980) стал настолько популярен, что его архитектура до сих пор используется в миллиардах устройств.
Чем микроконтроллер принципиально отличается от обычного процессора (CPU)?
Firmware: прошивка микроконтроллера
На ПК запускаем программу из файла - есть ОС, файловая система, загрузчик. На MCU ничего из этого нет. Программа прошита прямо в Flash. Называется **firmware** (прошивка). Включили питание - CPU начинает исполнять код с адреса 0x08000000. Без ОС, без инициализации, без ожидания. Кардиостимуляторы работают на этом принципе.
**Firmware** - программа, записанная в энергонезависимую память (Flash) микроконтроллера. Разработка: пишем код на C/C++ на обычном ПК → **кросс-компилируем** (cross-compilation) под целевую архитектуру (ARM, RISC-V) → получаем бинарный файл (.bin/.hex) → **прошиваем** через программатор (ST-Link, J-Link) или USB.
**Кросс-компиляция** - ключевой момент. ПК: x86_64. MCU: ARM Cortex-M. Обычный gcc генерирует x86 - не подходит. Нужен **arm-none-eabi-gcc**: работает на x86, генерирует ARM-машинный код. То же самое делает Android NDK для Android-приложений и iOS-тулчейн для iPhone - каждый раз когда целевая архитектура отличается от хоста.
| Этап | Инструмент | Вход → Выход |
|---|---|---|
| Написание кода | VS Code + расширения | .c/.h файлы |
| Кросс-компиляция | arm-none-eabi-gcc | .c → .o (объектные файлы) |
| Линковка | arm-none-eabi-ld | .o + .ld → .elf |
| Конвертация | objcopy | .elf → .bin / .hex |
| Прошивка | ST-Link / J-Link / USB DFU | .bin → Flash MCU |
Почему для MCU нужна кросс-компиляция, а не обычная компиляция?
Bare-metal: программирование без ОС
На ПК между кодом и железом - слои: ОС, драйверы, libc, планировщик. На MCU этого нет. **Bare-metal**: код работает прямо на процессоре, без посредников. Функция main() вызывается из Reset_Handler - первого кода, который CPU исполняет после включения. За инициализацию стека, BSS-секции, глобальных переменных - отвечает разработчик. За всё.
**Bare-metal программирование** - написание firmware без операционной системы. Основная структура: 1. инициализация периферии 2. **суперцикл while(1)** - бесконечный цикл, обрабатывающий задачи последовательно 3. **прерывания** (interrupts) - аппаратные сигналы, мгновенно переключающие CPU на обработчик события.
**volatile** - одно из самых важных слов в embedded. Переменные, изменяемые в прерываниях, ОБЯЗАНЫ быть volatile. Без него GCC или Clang может кешировать значение в регистре и никогда не перечитывать из памяти - оптимизация корректная для однопоточного кода, катастрофическая для bare-metal.
| Аспект | Суперцикл (polling) | Прерывания (interrupt) |
|---|---|---|
| Принцип | Постоянно проверять состояние | Реакция на событие |
| Латентность | Зависит от длины цикла | Микросекунды |
| Энергия | CPU всегда активен | CPU может спать между событиями |
| Сложность | Просто | Приоритеты, вложенность, race conditions |
| Пример | while(1) { if(button)... } | void EXTI0_IRQHandler(void) |
**Правило bare-metal:** обработчик прерывания должен быть МАКСИМАЛЬНО коротким. Установил флаг - вернулся. Длинная обработка - в суперцикле. Иначе пропустите другие прерывания.
Почему переменная button_pressed объявлена как volatile?
RTOS: когда суперцикла недостаточно
Суперцикл работает для простых устройств. Но инсулиновая помпа должна одновременно: измерять глюкозу каждые 5 минут, управлять мотором инъекции, принимать команды по Bluetooth и мигать аварийным LED при критических значениях. Задачи конфликтуют по времени. Нужен **планировщик** - вот зачем существует RTOS, и почему в медицинских устройствах по умолчанию FreeRTOS, а не Linux.
**RTOS (Real-Time Operating System)** - операционная система реального времени для MCU. Не путать с Linux! RTOS - это минимальное ядро (4-20 KB Flash), обеспечивающее: **задачи** (tasks/threads), **приоритеты**, **планировщик** (preemptive scheduler), **механизмы синхронизации** (семафоры, мьютексы, очереди). Популярные: **FreeRTOS** (самая массовая), Zephyr, ThreadX.
| Критерий | Bare-metal (суперцикл) | RTOS |
|---|---|---|
| Задачи | Одна последовательная | Множество «параллельных» |
| Приоритеты | Вручную (порядок в цикле) | Автоматически (планировщик) |
| Время отклика | Зависит от длины цикла | Гарантированное (детерминизм) |
| Потребление RAM | Минимальное | +4-20 KB ядро + стек на задачу |
| Сложность отладки | Простая | Race conditions, deadlocks |
| Когда использовать | Простые устройства (LED, датчик) | Несколько одновременных задач |
**Real-time ≠ fast.** Real-time - это **гарантированный дедлайн**, не скорость. STM32 @ 168 MHz медленнее Raspberry Pi @ 2.4 GHz. Но STM32 гарантирует: задача ABS выполнится за не более чем 5 мс, без исключений. Linux не гарантирует - GC, kernel preemption, IO-scheduler могут добавить латентность. Именно поэтому Tesla использует Linux для медиасистемы и MCU для управления двигателем.
Arduino = встраиваемые системы. Умею Arduino - умею embedded
Arduino - учебная платформа, скрывающая сложность за абстракциями (digitalWrite, analogRead). Профессиональный embedded - это STM32/ESP32 напрямую: регистры, HAL, CMSIS, линкер-скрипты, JTAG/SWD, анализ потребления, сертификация IEC 62304 (медицина), DO-178C (авиация)
Arduino digitalWrite() занимает ~50 тактов вместо 1 при прямой записи в GPIO-регистр. В production критичны: детерминированное время выполнения, потребление в микроватах, аппаратная безопасность, 10-летняя поддержка чипа. Для кардиостимулятора FDA требует формальное тестирование каждой строки кода - Arduino IDE для этого не предназначен.
В FreeRTOS задача с приоритетом 3 и задача с приоритетом 1 готовы к выполнению. Какая будет работать?
Ключевые идеи
- **MCU** - самодостаточный компьютер на чипе (CPU + Flash + RAM + периферия) за 0.10-15; 30 миллиардов штук в год; в каждой Tesla - 70+
- **Firmware** - программа во Flash; кросс-компиляция arm-none-eabi-gcc на x86 → бинарник для ARM → программатор; никакого runtime окружения
- **Bare-metal** - суперцикл while(1) + прерывания; volatile защищает shared-переменные от оптимизатора; обработчик прерывания - максимально короткий
- **RTOS (FreeRTOS)** - когда нужна многозадачность с гарантированным временем отклика; Linux не подходит туда где GC может сорвать дедлайн
Связанные темы
Введение во встраиваемые системы - фундамент для изучения архитектуры MCU и интерфейсов:
- Архитектура микроконтроллеров — Детальное изучение ARM Cortex-M, RISC-V, регистров и карты памяти
- GPIO, UART, SPI, I2C — Практика подключения датчиков и устройств к MCU
- Двоичная система — Основа работы с регистрами и битовыми масками MCU
Вопросы для размышления
- Кардиостимулятор работает годами без перезагрузки и должен пройти FDA IEC 62304. Какие требования к firmware это накладывает относительно обработки ошибок, обновлений и отказоустойчивости?
- Tesla использует Linux для медиасистемы и MCU с FreeRTOS для ABS и рулевого управления. Почему нельзя запустить всё на Linux с PREEMPT_RT патчем?
- ESP32 с FreeRTOS за 3 доллара управляет промышленным клапаном за 50 000 долларов. Какие архитектурные решения делают это безопасным - watchdog, fail-safe, redundancy?
Связанные уроки
- arch-01-binary — Архитектура процессоров - база embedded: регистры, прерывания, memory-mapped I/O, ISA
- os-01-intro — RTOS vs ОС общего назначения - то же противопоставление, что bare-metal vs Linux в embedded
- rts-01 — Реал-тайм системы строятся поверх embedded: детерминированный scheduling, прерывания, watchdog
- net-01-intro — IoT-устройства общаются по сети: MQTT, CoAP, TCP/IP на embedded требуют понимания networking
- arch-04-cpu