Встраиваемые системы

Введение во встраиваемые системы

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 MHz1–5 GHz
RAM2 KB – 512 KB8–128 GB
Стоимость$0.10 – $15$50 – $1000
ЭнергопотреблениеμW – mW15 – 300 W
ПериферияВстроенная (GPIO, ADC, UART)Внешняя (через чипсет)
ОСБез ОС / RTOSLinux / 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
Введение во встраиваемые системы

0

1

Войти