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

Архитектура микроконтроллеров

Цели урока

  • Понимать иерархию 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) - контроллер вложенных прерываний с аппаратными приоритетами.

ЯдроКлассPipelineFPUDSPЧастотаПрименение
Cortex-M0/M0+Ультра-лёгкий2-stageНетНет24-96 MHzIoT, сенсоры, 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 MHzTrustZone, 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-MRISC-V (RV32)
ЛицензияКоммерческая (1-10M)Открытая (бесплатно)
Регистры16 (R0-R15)32 (x0-x31)
ISAФиксированнаяМодульная (base + extensions)
ЭкосистемаЗрелая (20+ лет)Быстро растущая
ОтладкаJTAG/SWD, CoreSightJTAG, OpenOCD
MCU примерыSTM32, NXP, nRF52ESP32-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-MRISC-V (RV32)Назначение
Общего назначенияR0-R12 (13 шт)x0-x31 (32 шт)Вычисления, аргументы
НулевойНетx0 (всегда 0)Упрощает ISA
Stack PointerR13 (SP)x2 (sp)Вершина стека
Return AddressR14 (LR)x1 (ra)Адрес возврата
Program CounterR15 (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).

РегионНачалоКонецРазмерСодержимое
Flash0x0800_00000x0807_FFFF512 KBКод прошивки + константы
SRAM0x2000_00000x2001_FFFF128 KBПеременные + стек + heap
Periph APB10x4000_00000x4000_FFFF64 KBUART, SPI, I2C, таймеры
Periph APB20x4001_00000x4001_FFFF64 KBUSART1, SPI1, SYSCFG
Periph AHB10x4002_00000x4007_FFFF384 KBGPIO, DMA, RCC
Cortex-M System0xE000_00000xE00F_FFFF1 MBNVIC, 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
Архитектура микроконтроллеров

0

1

Войти