Почему стоит переходить на 32-разрядную архитектуру микроконтроллеров

Почему стоит переходить на 32-разрядную архитектуру микроконтроллеров

В последние годы наблюдается активный переход разработчиков встраиваемых систем на использование 32-разрядной архитектуры. В статье рассматриваются причины такого перехода и преимущества, которые при этом получают разработчики. Анализируются особенности 32-разрядных микроконтроллеров и, в частности, микроконтроллеров на базе ядра Cortex-M, в сравнении с 8- и 16-разрядными процессорами. Обсуждаются проблемы портирования программного обеспечения на 32-разрядные микроконтроллеры. Статья представляет собой перевод [1].

Самой важной причиной движения в сторону 32-разрядных микроконтроллеров (МК) является усложнение встраиваемых устройств под влиянием требований рынка. Так как встраиваемые продукты становятся все более функционально насыщенными, 8- и 16-разрядные МК не позволяют обеспечить требуемую производительность. Даже если 8- и 16-разрядные МК отвечают требованиям сегодняшних проектов, возможности дальнейшей модернизации таких устройств и повторного использования программного кода в будущих разработках уменьшаются.

Следующей причиной является то, что разработчики встраиваемых систем начинают все более ясно осознавать преимущества перехода на 32-разрядные МК, которые обеспечивают не только более чем десятикратное превосходство в производительности, но также позволяют снизить энергопотребление, уменьшить размер программы, ускорить разработку программного обеспечения и многократно его использовать.

Еще одной причиной является возможность широкого выбора и доступность МК на базе ARM. В настоящее время все больше поставщиков МК предлагают приборы на базе ARM-процессора. Эти продукты обеспечивают широкий выбор периферии, производительности, объема памяти, типов корпусов, стоимости и т.д.

Кроме того, процессоры на базе ARM-ядра Cortex-M имеют ряд функций, специально ориентированных на различные приложения. Эти особенности позволяют использовать микроконтроллеры на базе ARM в самых различных сферах применений. В то же время, цена на ARM-микроконтроллеры значительно снизилась за последние 5 лет, появляется все больше недорогих и даже бесплатных инструментов разработки.

Выбор МК на базе ARM-ядра является также наилучшей инвестицией по сравнению с другими архитектурами. Программный код, разработанный для ARM-устройств, можно использовать в течение ряда лет для микроконтроллеров, предлагаемых большим числом поставщиков. Так как ARM-архитектура распространяется все шире, то становится все проще найти инженера-программиста с опытом разработки ARM-устройств, чем других архитектур.

Разрядность команд процессора

Многие полагают, что 8-разрядные МК используют 8-битовые команды, а 32-разрядные — 32-битовые команды. На самом деле, многие команды 8-разрядных МК имеют разрядность 16, 24 бит или другую, например, микроконтроллер PIC18 имеет длину команд 16 бит.

Даже для устаревшей архитектуры 8051 наряду с командами длиной 1 байт, существую команды длиной 2 или 3 байта. То же самое относится и к 16-разрядной архитектуре: некоторые команды для микроконтроллера MSP430 имеют длину 6 байт (или даже 8 байт для MSP430X).

ARM-процессоры Cortex-M3 и Cortex-M0 основаны на технологии Thumb-2, которая обеспечивает превосходную плотность кода. Данная технология поддерживает набор команд Thumb, который включает 16-битные команды, а также 32-битные команды, которые обладают функциональностью расширенной 16-битной версии команд. В большинстве случаев компилятор C будет использовать 16-битную версию команды, несмотря на то, что операция может выполняться только с помощью 32-битной версии. Рисунок 1 иллюстрирует разрядность команд различных процессоров.

Рис. 1. Длина команды в различных процессорах

В программе, скомпилированной для процессоров Cortex-M, число 32-битных команд занимает лишь небольшую часть от общего количества команд. Например, 32-битные команды в программе теста Dhrystone, скомпилированной для Cortex-M3, занимают только 15,8% от всего числа команд (средняя длина команды равна 18,53 бит).

Для Cortex-M0 доля 32-битных команд еще меньше — 5,4% (средняя длина команды равна 16,9 бит).

Эффективность набора команд

Эффективность использования набора команд Thumb в ARM-процессоре Cortex-M также весьма высока. Например, множественные команды загрузки и хранения, а также команды введения в стек (push) и извлечения из стека (pop) в микроконтроллерах на базе ARM позволяют выполнять несколько пересылок данных с помощью одной команды.

Кроме того, мощные режимы адресации позволяют упростить доступ к памяти в ARM-микроконтроллерах. Например, доступ к памяти может быть осуществлен с помощью таких режимов адресации в одной команде, как регистровое смещение, прямое смещение, относительная адресация от PC или адресация по указателю стека (эффективная для локальных переменных). Доступны также дополнительные функции, например, автоматическая настройка указателя памяти.

Все ARM-процессоры весьма эффективны при манипуляции с 8- и 16-битными данными. В распоряжении имеется весь набор компактных команд доступа к памяти для 8-, 16- и 32-битных данных со знаком и без знака. Кроме того, имеется ряд команд, специально предназначенных для преобразования типов данных. В общем, обработка 8- и 16-битных данных в ARM-процессорах также проста и эффективна, как и 32-битных данных.

Микроконтроллеры на базе ядра Cortex-M предоставляют широкие возможности для условного исполнения команд. Помимо полного набора условий ветвления для всех типов данных со знаком и без знака, которые доступны на всех ARM-микроконтроллерах, процессоры Cortex-M3 также обеспечивают условное исполнение команд и выполнение совмещенных команд сравнения и ветвления.

Как Cortex-M0, так и Cortex-M3 поддерживает 32-битные однотактные множественные операции. Кроме того, микроконтроллеры на базе Cortex-M3 также поддерживают операции целочисленного деления, операции с насыщением, операции 32- и 64-битного умножения и аккумулирования (MAC), а также ряд операций над битовым полем.

Мифы 8-разрядных приложений

Многие разработчики встраиваемых систем ошибочно полагают, что их приложение выполняет обработку только 8-битных данных, поэтому нет необходимости переходить на 32-разрядные процессоры. Однако, взглянув в руководство для компилятора C, можно обнаружить, что в действительности в 8-разрядных МК простые целочисленные данные являются 16-битными. Поэтому каждый раз, когда выполняется целочисленная операция или при обращении к библиотеке функций C, которая требует выполнения целочисленной операции, выполняется обработка 16-битных данных. 8-разрядное процессорное ядро вынуждено выполнять последовательность команд и использовать дополнительные такты для обеспечения требуемой производительности.

Та же ситуация применима и к указателям. В большинстве 8- и 16-разрядных МК необходимо, по крайней мере, 16 бит для указателя адреса. Это число может увеличиться при использовании групповых указателей памяти в 8051-процессоре или использовании переключения банков памяти или подобные ему методы, чтобы преодолеть барьер памяти объемом 64 Кбайт. В результате, в 8-разрядных системах обработка указателей памяти может быть весьма неэффективна.

Так как каждая целочисленная переменная в регистровом банке занимает несколько регистров, использование 8-разрядных МК также приводит к увеличению числа циклов доступа к памяти, т.е. использованию дополнительных операций чтения/записи памяти и операций со стеком.

Как это выглядит при выполнении какого-либо определенного теста? На- пример, результаты компилирования программы теста Dhrystone для различных архитектур с оптимизацией размера кода представлены в таблице 1.

Таблица 1. Результаты компилирования программы Dhrystone на различных процессорах

Keil µVision 3.8PK51 8.18

Объем выходного двоичного кода, число байт

Большинство приложений выигрывают при переходе на микроконтроллеры на базе Cortex-M благодаря уменьшению объема кода и, как следствие, снижению стоимости устройства из-за меньшей требуемой памяти. Уменьшенный размер кода ARM-микроконтроллеров влияет на производительность, а также потребляемую мощность и стоимость.

Производительность и потребляемая мощность

Одна из причин, по которой разработчики переходят с 8- и 16-разрядных МК на 32-разрядные, заключается в необходимости улучшения производительности. Менее очевидным является тот факт, что переход на применение ARM-микроконтроллеров обеспечивает также снижение энергопотребления и увеличение срока службы батарей.

Сравним производительность МК различных архитектур. Распространенным способом сравнения производительности процессоров является использование теста Dhrystone. Он является бесплатным, кроме того, простым и достаточно компактным для использования в микроконтроллерах с весьма небольшим объемом памяти (хотя это и не идеальный тестовый пакет).

Производительность первых процессоров 8051 была всего 0,0094 DMIPS/МГц. Новые модификации процессора 8051 имеют несколько лучшие показатели. Например, процессор Maxim 80C310 имеет производительность 0,027 DMIPS/МГц, а самые быстрые микропроцессоры 8051 — 0,1 DMIPS/МГц. Это все же намного меньше производительности микроконтроллеров на базе ARM Cortex-M: для процессора Cortex-M3 этот показатель равен 1,25 DMIPS/МГц, а для Cortex-M0 — 0,9 DMIPS/МГц.

Производительность микроконтроллера PIC18 равна 0,02 DMIPS/МГц, т.е. меньше, чем у некоторых процессоров 8051. 16-разрядные процессоры Microchip также более чем наполовину уступают микроконтроллерам на базе ARM Cortex-M3.

Ограничения 8- и 16-разрядных МК

Проблемой, которая вызывает неэффективность многих 8- и 16-разрядных микроконтроллеров, является ограниченный набор команд и моделей программирования. Например, работа процессора 8051 в значительной степени основана на использовании аккумулятора (ACC) и указателя данных (DPTR) для передачи и обработки данных. В результате, появляется необходимость в использовании команд перемещения данных в/из ACC и DPTR, что приводит к увеличению размера кода и количества тактов исполнения команд.

Интерфейс памяти также ограничивает производительность 8- и 16-разрядных процессоров. Например, многие команды процессора 8051 имеют длину несколько байт. Так как интерфейс памяти программ является 8-разрядным, то для выборки таких команд нужно выполнить несколько циклов считывания.

Производительность 8- и 16-разрядных МК еще больше снижается, если требуется осуществить доступ к памяти, превышающей 64 Кбайт. Данная архитектура разработана для работы с 16-битными адресами (используются 16-битные счетчики программ, 16-битные указатели данных, а набор команд разработан для поддержки адресного пространства 64 Кбайт). Если требуется память более 64 Кбайт, то необходимы аппаратные и командные издержки для генерации дополнительных адресных бит.

Для типового процессора 8051, которому нужно осуществить доступ к памяти более 64 Кбайт, память разделяется на банки, и все коды переключения банков выполняются через фиксированный банк. В результате, увеличение размера кода и числа тактовых циклов может снизить эффективность использования памяти. Некоторые 16-разрядные МК избегают этого с помощью использования счетчика программ большей разрядности или сегментации памяти, но манипулирование большими значениями адресов также требует дополнительных ресурсов и, следовательно, снижает производительность, приводит к увеличению программного кода.

Мощность потребления МК

ARM-микроконтроллеры на базе ядра Cortex-M потребляют меньше энергии, чем многие 8- и 16-разрядные микроконтроллеры. В ARM-процессорах реализованы многие методы, позволяющие снизить потребляемую мощность. Например, процессоры Cortex-M0 и Cortex-M3 поддерживают различные дежурные режимы работы и функцию sleep-on-exit (которая позволяет процессору возвращаться в спящий режим сразу по завершении обработки прерывания).

Для того, чтобы понять, почему МК на базе Cortex-M могут снизить энергопотребление встраиваемой системы, рассмотрим структуру типичного МК. В современных микроконтроллерах процессорное ядро не занимает самую большую часть площади кристалла (см. рис. 2).

Рис. 2. Использование ARM-процессоров на базе Cortex-M позволяет уменьшить площадь кристалла

Как было сказано выше, плотность кода 8-разрядных микроконтроллеров весьма низка. В результате необходим блок флэш-памяти большего объема, что увеличивает общую потребляемую мощность. Высокая плотность кода ARM-микроконтроллеров позволяет использовать в них меньшие по размеру блоки флэш-памяти и снизить как потребляемую мощность, так и стоимость.

Эффективность доступа к памяти

Использование 32-разрядной шины снижает энергопотребление за счет уменьшения числа требуемых циклов обращения к памяти. Для копирования того же объема данных в память 8-разрядный МК требует в четыре раза больше циклов обращения к памяти при большем числе вызовов команд, необходимых для этой операции. Следовательно, даже при одном и том же объеме памяти, 8-разрядный МК потребляет больше энергии для выполнения той же задачи.

Выборка команд в МК на базе Cortex-M также намного более эффективна, чем у 8- и 16-разрядных МК, так как каждая выборка команды является 32-разрядной, что позволяет выбирать до двух 16-разрядных команд Thumb за один такт и обеспечивает большую полосу пропускания шины при доступе к данным. При одинаковой длине последовательности команд для 8-разрядного МК необходимы четыре цикла обращения к памяти, а для 16-разрядного — в два раза больше вызовов команд. В результате, 8- и 16-разрядные МК потребляют намного больше энергии, чем микроконтроллеры на базе ARM.

Снижение потребляемой мощности за счет уменьшения рабочей частоты

Высокая производительность 32-разрядных МК позволяет снизить потребляемую мощность за счет работы приложения на более низкой тактовой частоте. Например, приложение с рабочей частотой 30 МГц на процессоре 8051 может быть запущено на ARM-микроконтроллере Cortex-M3 на тактовой частоте 3 МГц, обеспечив при этом тот же уровень производительности.

Снижение потребляемой мощности за счет уменьшения активных циклов

Используя микроконтроллер на базе ARM в дежурном режиме, можно еще больше снизить энергопотребление после завершения выполнения задания. Микроконтроллеры на базе Cortex-M имеют намного более высокую производительность по сравнению с 8- и 16-разрядными МК, поэтому у них имеется возможность завершить задачу и перейти в дежурный режим намного быстрее, что снижает общее число активных циклов в системе (см. рис. 3).

Разработка программного обеспечения

Разработка программного обеспечения для МК на базе Cortex-M может быть выполнена значительно проще, чем для 8-разрядных устройств. Процессоры на базе Cortex-M полностью программируются на C, а также содержат различные усовершенствованные функции отладки, помогающие обнаружить в программе какие-либо проблемы. Кроме того, в интернете существует огромное число примеров и руководств, а также дополнительных ресурсов, включая наборы разработчиков.

Портирование программного обеспечения с 8- и 16-разрядных МК на ARM-микроконтроллеры

МК на базе Cortex-M имеют, как правило, большее количество регистров в периферии, чем 8-разрядные МК. Периферийные устройства МК на базе ARM обычно содержат больше встроенных функций и, следовательно, в них доступно большее количество программируемых регистров. Для упрощения программирования поставщики МК на базе ARM предлагают библиотеки драйверов устройств, что позволяет выполнять установку периферийных устройств с помощью всего нескольких вызовов функций.

По сравнению с большинством 8- и 16-разрядных архитектур, программирование МК на базе ARM осуществляется гораздо более гибко. Например, нет ограничений для аппаратного стека, доступ к функциям может выполняться рекурсивно (локальные переменные хранятся в стеке, а не в статической памяти) и не нужно беспокоиться о сохранении значений специальных регистров в программе-обработчике прерываний, так как эти значения обрабатываются процессором во время ввода прерывания.

Важно корректно использовать типы данных для конкретной архитектуры процессора: они оказывают существенно влияние на размер кода и производительность системы. Данные разных типов для микроконтроллеров на базе ARM и 8- и 16-разрядных микроконтроллеров отличаются по длине (см. табл. 2).

Таблица 2. Типы данных для разных архитектур процессоров

📎📎📎📎📎📎📎📎📎📎