Встраиваемые системы
Архитектура микроконтроллеров
Цели урока
- Понимать иерархию ARM Cortex-M: M0+ для battery IoT, M4 для DSP, M7 для performance
- Объяснить, почему RISC-V набирает популярность и где ARM остаётся стандартом
- Читать дамп регистров при отладке HardFault на Cortex-M
- Ориентироваться в memory map MCU и понимать MMIO-доступ к периферии
Предварительные знания
STM32F4 стоит 3 доллара, а процессор в iPhone - 40 долларов. Потому что MCU - это компромисс: меньше транзисторов, проще pipeline, зато встроенная периферия и микроватты потребления. Понимание архитектуры MCU - это понимание ПОЧЕМУ каждый транзистор на месте.
- **Automotive:** ARM Cortex-R5 управляет подушками безопасности - 0% допустимых ошибок, детерминированное время отклика
- **Wearables:** Nordic nRF52 (Cortex-M4) работает в фитнес-браслетах неделями от маленькой батарейки
- **Серверы:** Ampere Altra (ARM Cortex-A, 128 ядер) конкурирует с Intel Xeon в дата-центрах, ARM теперь и в серверах
ARM: от Acorn BBC Micro до 250 млрд устройств
В 1983 году компания Acorn Computers (Кембридж) создала ARM - Acorn RISC Machine - как процессор для BBC Micro. Цель: простой RISC-дизайн, который команда из 4 человек могла бы реализовать. В 1990 году ARM Ltd. выделилась в отдельную компанию и сделала ставку на лицензирование, а не производство. Решение оказалось правильным: сегодня ARM-ядра установлены в более чем 250 млрд устройств. RISC-V был создан в 2010 году в UC Berkeley как ответ на ограничения проприетарных ISA - открытая альтернатива для академических исследований, которая быстро стала промышленным стандартом.
ARM Cortex-M: доминирующая архитектура
**2011 год: STMicroelectronics выпускает STM32F4 - 168 MHz, FPU, 1 MB Flash за 3 доллара.** Именно ARM Cortex-M4 внутри. Более 90% всех MCU на рынке используют архитектуру ARM Cortex-M. ARM Ltd. не производит чипы - она **лицензирует** дизайн ядра, а STMicroelectronics, NXP, Texas Instruments и сотни других компаний производят свои MCU на его основе.
**ARM Cortex-M** - семейство процессорных ядер, оптимизированных для MCU. Архитектура ARMv6-M/ARMv7-M/ARMv8-M, набор команд **Thumb-2** (смесь 16- и 32-битных инструкций для компактности). Встроенный **NVIC** (Nested Vectored Interrupt Controller) - контроллер вложенных прерываний с аппаратными приоритетами.
| Ядро | Класс | Pipeline | FPU | DSP | Частота | Применение |
|---|---|---|---|---|---|---|
| Cortex-M0/M0+ | Ультра-лёгкий | 2-stage | Нет | Нет | 24-96 MHz | IoT, сенсоры, 0.10 чипы |
| Cortex-M3 | Средний | 3-stage | Нет | Нет | 72-120 MHz | Промышленность, моторы |
| Cortex-M4 | Производительный | 3-stage | Да (SP) | Да | 80-200 MHz | Аудио, моторы, ML на edge |
| Cortex-M7 | Высокий | 6-stage | Да (DP) | Да | 200-600 MHz | Графика, сложные алгоритмы |
| Cortex-M33 | Безопасность | 3-stage | Да | Да | 100 MHz | TrustZone, IoT security |
**NVIC** - контроллер прерываний, встроенный в ядро. До 240 источников прерываний, каждый с программируемым приоритетом (0-255, где 0 = наивысший). Поддерживает **tail-chaining**: если одно прерывание ждёт, пока обрабатывается другое, переключение происходит без полного сохранения/восстановления контекста - экономия ~12 тактов.
Для IoT-датчика на батарейке, работающего 5 лет, какое ядро ARM Cortex-M подходит лучше всего?
RISC-V: открытая альтернатива
**Espressif, 2020: ESP32-C3 - RISC-V MCU с Wi-Fi и Bluetooth за 1 доллар.** ARM доминирует, но за лицензию нужно платить (1-10 млн долларов аванс + royalty за каждый чип). В 2010 году университет Беркли создал **RISC-V** - полностью открытую архитектуру набора команд (ISA). Любая компания может производить RISC-V процессоры **бесплатно**, без лицензий.
**RISC-V** (произносится «RISC Five») - открытая ISA с модульным дизайном. Базовый набор **RV32I** - 47 инструкций для 32-битного целочисленного процессора. Расширения: **M** (умножение/деление), **A** (атомарные операции), **F/D** (float single/double), **C** (сжатые 16-битные инструкции), **V** (векторные). Пример: RV32IMAC = base + mul + atomic + compressed.
| Параметр | ARM Cortex-M | RISC-V (RV32) |
|---|---|---|
| Лицензия | Коммерческая (1-10M) | Открытая (бесплатно) |
| Регистры | 16 (R0-R15) | 32 (x0-x31) |
| ISA | Фиксированная | Модульная (base + extensions) |
| Экосистема | Зрелая (20+ лет) | Быстро растущая |
| Отладка | JTAG/SWD, CoreSight | JTAG, OpenOCD |
| MCU примеры | STM32, NXP, nRF52 | ESP32-C3, GD32V, BL602 |
**ESP32-C3** от Espressif - самый популярный RISC-V MCU. Single-core RV32IMC @ 160 MHz, Wi-Fi + Bluetooth 5.0, стоимость ~1 доллар. Полная поддержка ESP-IDF (FreeRTOS). Это показывает, что RISC-V уже production-ready для IoT.
**RISC-V пока не заменил ARM** в критичных применениях (автомобили, медицина, авиация). Причина: сертификация. ARM имеет десятилетия подтверждённой надёжности и сертификатов (ISO 26262, IEC 62304). RISC-V экосистема догоняет, но пока не там.
Главное преимущество RISC-V над ARM для стартапа, разрабатывающего свой MCU:
Регистры процессора
**Прошивка падает с HardFault - в стеке мусор.** Причина: неправильное восстановление SP после ISR. Регистры - самая быстрая память процессора: доступ за 1 такт. Все вычисления происходят в регистрах. Загрузили данные из RAM в регистр, выполнили операцию, записали результат обратно. Понимание регистров - ключ к отладке на уровне ассемблера.
**ARM Cortex-M регистры:** R0-R12 - регистры общего назначения, **R13 (SP)** - Stack Pointer (указатель стека), **R14 (LR)** - Link Register (адрес возврата из функции), **R15 (PC)** - Program Counter (адрес текущей инструкции), **xPSR** - Program Status Register (флаги N, Z, C, V + номер прерывания).
| Регистр | ARM Cortex-M | RISC-V (RV32) | Назначение |
|---|---|---|---|
| Общего назначения | R0-R12 (13 шт) | x0-x31 (32 шт) | Вычисления, аргументы |
| Нулевой | Нет | x0 (всегда 0) | Упрощает ISA |
| Stack Pointer | R13 (SP) | x2 (sp) | Вершина стека |
| Return Address | R14 (LR) | x1 (ra) | Адрес возврата |
| Program Counter | R15 (PC) | pc (отдельный) | Текущая инструкция |
| Флаги | xPSR (NZCV) | Нет (compare+branch) | Результат сравнения |
**Calling convention** (ABI) - соглашение о том, как функции передают аргументы. На ARM Cortex-M: R0-R3 - первые 4 аргумента, остальные через стек. R0 - возвращаемое значение. R4-R11 - callee-saved (функция обязана сохранить). Это важно при написании ассемблерных вставок и отладке.
При вызове BL function на ARM Cortex-M, какой регистр сохраняет адрес возврата?
Карта памяти MCU
**Запись по адресу 0x4001_0814 - UART бесконечно посылает данные.** Запись по 0x4001_081C - UART молчит. Разница - один регистр. На MCU **всё адресное пространство открыто**: Flash, RAM, регистры периферии - всё имеет конкретные адреса. Это **Memory-Mapped I/O** (MMIO): периферия управляется как обычная память.
**Memory Map** - распределение 4 GB адресного пространства (32-бит) MCU: **0x0000_0000 - 0x1FFF_FFFF**: Code (Flash, до 512 MB), **0x2000_0000 - 0x3FFF_FFFF**: SRAM, **0x4000_0000 - 0x5FFF_FFFF**: Peripherals (GPIO, UART, SPI, ...), **0xE000_0000 - 0xFFFF_FFFF**: System (NVIC, SysTick, Debug). Все адреса стандартизованы ARM - одинаковые для любого Cortex-M.
**Bit-banding** - особенность Cortex-M3/M4: каждый бит в регионе SRAM и периферии имеет свой 32-битный «алиас-адрес». Запись 0 или 1 по этому адресу атомарно меняет один бит - без read-modify-write цикла. Формула: alias_addr = bit_band_base + (byte_offset * 32) + (bit_number * 4).
| Регион | Начало | Конец | Размер | Содержимое |
|---|---|---|---|---|
| Flash | 0x0800_0000 | 0x0807_FFFF | 512 KB | Код прошивки + константы |
| SRAM | 0x2000_0000 | 0x2001_FFFF | 128 KB | Переменные + стек + heap |
| Periph APB1 | 0x4000_0000 | 0x4000_FFFF | 64 KB | UART, SPI, I2C, таймеры |
| Periph APB2 | 0x4001_0000 | 0x4001_FFFF | 64 KB | USART1, SPI1, SYSCFG |
| Periph AHB1 | 0x4002_0000 | 0x4007_FFFF | 384 KB | GPIO, DMA, RCC |
| Cortex-M System | 0xE000_0000 | 0xE00F_FFFF | 1 MB | NVIC, SysTick, MPU, FPU |
ARM - это одна архитектура с одним набором инструкций
ARM - семейство совершенно разных профилей: Cortex-A (Application, Linux/Android - смартфоны), Cortex-R (Real-time - автомобильная безопасность), Cortex-M (Microcontroller - встраиваемые системы). У них разные наборы инструкций, разные возможности, разные применения
Cortex-A7 в Raspberry Pi запускает Linux с виртуальной памятью и MMU. Cortex-M4 в STM32 работает bare-metal без MMU, с прямым доступом к физическим адресам. Перенести код с одного на другой невозможно без серьёзных изменений.
Запись значения по адресу 0x4002_0018 на STM32 - это:
Ключевые идеи
- **ARM Cortex-M** - доминирующая архитектура MCU: M0+ (ultra-low-power), M4 (DSP/FPU), M7 (производительность); Thumb-2 и NVIC
- **RISC-V** - открытая ISA, модульная (RV32I + расширения); бесплатная, кастомизируемая, растущая экосистема (ESP32-C3)
- **Регистры** - R0-R15 (ARM) / x0-x31 (RISC-V), SP, LR, PC - знание регистров необходимо для отладки и оптимизации
- **Memory Map** - всё пространство 4 GB разделено на регионы: Flash (0x0800_xxxx), SRAM (0x2000_xxxx), Peripherals (0x4000_xxxx)
Связанные темы
Архитектура MCU - основа для понимания периферии и низкоуровневого программирования:
- Введение во встраиваемые системы — Базовые понятия: MCU, firmware, bare-metal, RTOS
- GPIO, UART, SPI, I2C — Практическое использование Memory-Mapped I/O для управления периферией
- Двоичная система — Битовые маски, сдвиги - основа работы с регистрами
Вопросы для размышления
- RISC-V позволяет добавлять кастомные инструкции. Какую инструкцию стоит добавить для MCU, управляющего электродвигателем?
- На ARM Cortex-M нет MMU (Memory Management Unit). Как это влияет на безопасность? Может ли баг в одной задаче RTOS повредить память другой задачи?
- STM32F4 стоит 3 доллара vs 40 долларов за процессор iPhone. Что именно в архитектуре делает MCU дешевле? (Подсказка: pipeline, кэш, ядра, процесс производства.)
Связанные уроки
- emb-01 — Базовые понятия firmware и bare-metal вводятся там
- emb-03 — Memory-mapped I/O - основа управления GPIO, UART, SPI
- arch-01-binary — Двоичные операции и битовые маски нужны для работы с регистрами MCU
- os-02-processes — Address space MCU vs виртуальная память процессов ОС
- emb-05 — DMA и прерывания строятся поверх NVIC и memory map
- arch-06-pipelining — Pipeline и кэш - архитектурные концепции из computer architecture
- emb-10 — RTOS требует понимания SP, LR и контекста прерываний
- arch-04-cpu