Сначала мы представляем компанию ARM Ltd. Здесь мы говорим о компании, а не об архитектуре. История развития ARM очень длинная и выходит за рамки воображения многих людей.
Во-первых, давайте предоставим некоторую справочную информацию. Компания ARM была основана в конце 1990-х годов и отделилась от другой компании из Кембриджа под названием Acorn Computers. Когда-то она была известным поставщиком персональных настольных компьютеров на британский рынок образования, а сейчас занимает второе место. больше существует.
В середине 1980-х годов небольшая группа компаний Acorn приняла вызов по выбору подходящего процессора для своего компьютера следующего поколения. Они составили техническое задание и после долгого периода исследований пришли к выводу, что не могут найти подходящего процессора. подходящего процессора, поэтому компания Acorn решила разработать собственный процессор. Небольшой команде потребовалось всего 18 месяцев, чтобы завершить проектирование и внедрить этот процессор.
26 апреля 1985 года в офисе Acorn в Кембридже начал работать первый прототип машины. В то время она называлась «Acorn RISC Machine». Когда компания Acorn пришла в упадок, отдел проектирования процессоров был выделен. была создана компания, первоначально называвшаяся Advanced RSIC Machines Ltd. И компания, и процессор теперь называются просто ARM.
Компания ARM наиболее известна своими различными процессорными ядрами RISC, но она также производит большое количество вспомогательных технологий для удовлетворения потребностей разработчиков микросхем и программного обеспечения. Сюда входят физические IP, модели программного обеспечения и инструменты разработки, графические процессоры и периферийные устройства. , но ARM не производит чипы. ARM является пионером в области интеллектуальной собственности на полупроводники. Большое количество устройств ARM, представленных в настоящее время на рынке, производятся лицензиатами ARM, распространенными по всему миру.
Давайте поговорим об областях, в которых продукты ARM играют роль через общие цифровые продукты. ARM обеспечивает: IP-адрес системного уровня в системе-на-кристалле (SoC), а также физический IP-адрес, обеспечивая его технологичность, инструменты разработки, помогающие проектировать и производить. системная архитектура и программное обеспечение. Конечно, производство готовой продукции требует множества других ресурсов, таких как промышленный дизайн, упаковка, экологические исследования, операционные системы, периферийные IP и т. д. Это не продукты ARM, а ARM. Есть много партнеров, производящих тысячи устройств, и на рисунке ниже вы увидите множество приложений, использующих решения на базе ARM.
От жестких дисков до принтеров, от игровых устройств до смарт-счетчиков, от стиральных машин до телевизоров — можно сказать, что есть все, но конца этому еще нет, и общий объем поставок пока все время растет. Количество чипов на базе ARM достигло 500 100 миллионов штук, и их число ежегодно увеличивается примерно на 8 миллиардов. Ожидается, что к 2020 году их общее количество достигнет 100 миллиардов.
Одна из причин, почему ядра ARM сейчас так популярны, заключается в том, что они поддерживают широкий диапазон производительности и функций. Я думаю, многие слышали, что ARM началась с успеха процессорного ядра ARM7TDMI, которое получило широкое распространение в индустрии мобильных телефонов с 1990-х годов и стало краеугольным камнем раннего успеха ARM.
Хотя оно по-прежнему широко используется и можно приобрести большое количество деталей, содержащих это ядро, ARM7TDMI больше не лицензируется, и на основе этого ядра в настоящее время разработана целая дорожная карта продукта, ориентированная на встроенное пространство реального времени. Существует два основных продукта. серия Cortex-M в основном используется для экономичных микроконтроллеров;
Серия Cortex-R, которая обеспечивает очень высокую производительность и пропускную способность при сохранении точных временных характеристик и предсказуемых задержек прерываний, обычно используется в приложениях, критичных к синхронизации, таких как системы управления двигателем и контроллеры жестких дисков.
Позже была разработана целая серия процессоров приложений, начиная с ARM926EJ-S в начале линейки продуктов, заканчивая ARM11MP и теперь включая серию Cortex-A. Эти процессоры предназначены для обеспечения надежной работы в приложениях. для масштабирования требуются операционные системы платформы, такие как Linux. Высокая производительность.
Они включают в себя сложные возможности управления памятью, а также расширенные наборы команд для обработки мультимедиа. Начиная с ARM11MP, была добавлена поддержка многоядерных систем. Новейшие ядра серии Cortex-A теперь доступны в многоядерных конфигурациях. что позволяет им действительно охватывать широкий диапазон мощности и производительности.
Теперь, когда мы знаем немного о происхождении и архитектуре компании, давайте заглянем под капот чипов ARM.
Классическая система ARM на кристалле, или так называемая SocC, содержит множество компонентов, лишь некоторые из которых непосредственно заимствованы из ARM. Во-первых, само ядро обычно глубоко встроено в устройство и часто не видно напрямую из контекста устройства, в то время как порт отладки часто является единственной открытой частью, подключенной к самому ядру, со встроенной некоторой связующей логикой, такой как часы и сброс. схемы.
Поскольку ядро ARM имеет только два входа прерываний, наиболее распространенным периферийным устройством является своего рода контроллер прерываний. Внутри периферийного устройства компоненты подключаются друг к другу через архитектуру встроенной шины. Для большинства устройств на базе ARM это так. стандарт АМБА Интерконнект.
AMBA определяет две шины: высокопроизводительную системную шину под названием AXI и маломощную периферийную шину под названием APB, которая обычно используется для подключения всех периферийных устройств, а AXI используется для памяти и других высокоскоростных устройств, которые есть у каждого устройства. определенное количество встроенной памяти и интерфейсов для подключения периферийных устройств памяти. Однако обратите внимание, что внешнее подключение к устройству не является шиной AMBA. Оно используется только внутри устройства и не раскрывается.
Давайте посмотрим, как работает этот SoC — модель программиста. Имейте в виду, что конфигурации серии A и серии R очень похожи с точки зрения моделей программаторов, но конфигурации серии M сильно различаются во многих очень важных отношениях, на что будет указано в следующем объяснении.
По сути, ARM — это RISC-архитектура. Вы можете отрицать, что нынешние ядра ARM на самом деле не принадлежат платформе RISC, но они имеют большое происхождение от RISC и сохраняют многие функции, традиционно связанные с RISC-архитектурой, например, выполнение большинства инструкций. за один цикл набор регистров по существу ортогонален, а набор команд Реализация архитектуры загрузки-сохранения означает, что единственными инструкциями, которые могут напрямую обрабатывать содержимое памяти, являются инструкции загрузки и сохранения. Если необходимо выполнить какую-либо обработку значений в памяти, программа должна загрузить эти значения в регистры. и выполнить необходимую обработку, а затем сохранить результаты обратно в память. Другие распространенные архитектуры могут напрямую манипулировать или изменять содержимое памяти.
Все внутренние регистры имеют ширину 32 бита, за исключением некоторых, поддерживаемых функцией векторной обработки архитектуры NEON. Они обрабатываются внутри 32-битного АЛУ, а память обычно обрабатывается в 32-битных единицах. Это длина слова. АРМ.
Говоря о наборе команд, вы обнаружите, что ядро ARM имеет более одного набора инструкций. Все ядра ARMv7-A и ARMv7-R поддерживают 32-битный собственный набор инструкций ARM и набор инструкций Thumb. может быть 32-битным или 16-битным.
Набор инструкций ARM раскрывает весь потенциал производительности ядра, а набор инструкций Thumb обеспечивает лучшую плотность кода. Мы называем процесс переключения между инструкциями ARM и Thumb «взаимодействием». Не волнуйтесь, компилятор и компоновщик справятся с этим. . Некоторые старые ядра поддерживают ранние версии набора инструкций Thumb, в которых все инструкции являются 16-битными. Например, ядро ARMv7-M поддерживает только набор инструкций Thumb.
Если вы раньше работали с архитектурой процессора, я думаю, вы знакомы с концепцией режимов работы и концепцией привилегий. Многие архитектуры обычно поддерживают два режима: «Супервизор» и «Пользователь», где один режим имеет привилегии, а другой — нет.
Код в непривилегированном режиме может не иметь возможности напрямую выполнять определенные операции, такие как отключение прерываний, перенастройка защиты памяти или доступ к определенным областям памяти. Это основное требование большинства операционных систем, позволяющее защитить систему от собственных задач. . Ядро ARM обычно поддерживает семь основных режимов работы, каждый из которых имеет доступ к собственному пространству стека, а также различный набор подмножеств регистров, все из которых, кроме одного, являются привилегированными режимами, а именно:
Шесть из них являются привилегированными режимами. Пользовательский режим — непривилегированный режим. Пользовательский режим является единственным непривилегированным режимом, который используется операционной системой для пользовательских задач и процессоров.
Кроме того, существует 5 режимов, называемых «Режим исключения», каждый из которых связан с обработкой определенного типа исключения или прерывания. Например, когда ядро начинает обрабатывать внешние прерывания, оно автоматически переходит в режим IRQ, при этом используется режим супервизора. для обработки инструкций SVC и аппаратного сброса эти режимы имеют выделенное пространство стека и небольшой набор выделенных регистров соответственно. Мы называем эту функцию группировкой регистров, но эти исключения относятся к разным типам.
Обратите внимание, что приведенная выше схема применима только к процессорам Cortex-A и Cortex-R, структура микроконтроллеров Cortex-M совершенно другая. Конфигурация архитектуры ARMv7-M определяет только два режима, как показано ниже: режим потока и режим обработчика. Режим потока не имеет привилегий и используется для кода приложения. Режим обработчика имеет привилегии и используется для обработчиков исключений. сброс, выполнение начинается в режиме потока, автоматически переходит в режим обработчика при обнаружении исключения и возвращается в режим потока после завершения обработчика.
Ниже мы сосредоточимся на том, как эти режимы взаимодействуют с банком регистров:
Например, давайте посмотрим, что происходит, когда ядро переключается в режим IRQ для обработки внешних исключений. На рисунке видно, что r13 и r14 в режиме User переключаются на соответствующие им регистры в режиме IRQ. указатель стека. Это означает, что прерывание IRQ обрабатывается в отдельном стеке.
Кроме того, вы также можете видеть, что в набор добавлен еще один регистр. Это регистр сохраненного состояния программы, или SPSR, который используется для сохранения моментального снимка состояния процессора при изменении режима, чтобы он мог вернуться. в пользовательский режим и восстановиться после обработки события прерывания. Программа становится очень простой. Когда обработка прерывания завершена, она возвращается в пользовательский режим и повторно получает исходные регистры.
Описанный выше набор и организация регистров применимы ко всем ядрам ARM, кроме Cotex-M, у которого другой набор и организация регистров, см. рисунок ниже.
Ранее уже подчеркивалось, что регистры Cotex-M разные, и разница здесь, регистров всего 18 без той схемы группировки, которую мы видим на других ядрах.
Во-первых, имеется 13 регистров общего назначения, из которых от r0 до r7 — регистры младшего порядка, от r8 до r12 — регистры старшего порядка, и есть 3 специальных регистра: указатель стека, регистр связи и счетчик программ. Последний регистр — это регистры общего назначения. регистр состояния программы xPSR.
Обратите внимание, что ядро Contex-M имеет два режима процессора: режим потока и режим обработчика. Между этими двумя режимами сгруппирован только один регистр — указатель стека.
Здесь расширен регистр состояния Реестр состояния программы:
Биты с 28 по 31 слева представляют собой коды состояния ALU, опционально устанавливаемые инструкциями по обработке данных и проверяемые условными инструкциями, а также 4 дополнительных бита состояния, биты GE, используемые для записи нескольких результатов из инструкций SIMD. Только эти биты состояния ALU могут быть изменены в пользовательском режиме.
Крайние правые 5 бит показывают текущий режим процессора, они устанавливаются автоматически при изменении режима в ответ на исключение или могут быть изменены вручную для изменения режимов под управлением программы.
Два бита J и T записывают текущее состояние процессора и сообщают ядру, какая строка набора инструкций выполняется в данный момент. Это может быть состояние ARM, которое выполняет инструкции ARM; состояние Thumb, которое выполняет инструкции Thumb; или состояние Jazelle, которое выполняет байт-код Execute Java.
Биты I и F включают или отключают прерывания IRQ и FIQ. Бит A позволяет отключить или временно деактивировать асинхронное прерывание передачи данных. Бит E позволяет динамически изменять порядок байтов (маленький или большой порядок байтов) интерфейса данных под управлением программы, упрощая обработку данных со смешанным порядком байтов. Остальные биты «зарезервированы» или используются для внутреннего состояния системы с помощью определенных инструкций и не могут быть изменены программой.
Поговорим о регистрах состояния, доступных в ядре Cortex-M:
Вы обнаружите, что он намного проще, чем упомянутый ранее регистр состояния, что также иллюстрирует простоту ядра Cortex-M. Существует бит T, поскольку ядро Cortex-M поддерживает только набор инструкций Thumb, этот бит всегда равен 1. Последнее поле содержит текущий номер активного исключения, когда ядро выполняет обработчик исключений.
Новички могут спросить, что происходит при возникновении исключения. В архитектуре ARM исключение — это событие определенного типа, которое вызывает прерывание нормального потока программы любого содержимого. Исключение может быть внутренним, например, ошибкой трансляции памяти; также может быть внешним, например, прерываниями от периферийных устройств, а также синхронным, например, инструкциями SVC, или асинхронным, например, прерываниями по таймеру; Независимо от причины, ядро обрабатывает все исключения практически одинаково.
Когда приложение выполняет каждую инструкцию одну за другой, первое, что делает ядро при возникновении исключения, — это гарантирует, что оно может вернуться в эту точку после исключения. Для этого мы должны сделать снимок текущего состояния, поэтому. ядро копирует CPSR и сохраняет в SPSR , затем скопируйте ПК и сохраните его в LR, затем ядро переключается в соответствующий режим исключений, чтобы отключить дальнейшие прерывания, убедиться, что он находится в правильном состоянии, а затем с помощью таблицы векторов определить, где можно найти обработчик исключений. Каждый тип исключения имеет запись, каждая запись представляет собой инструкцию, отделяющую соответствующий код обработчика, поэтому ядром является загрузка счетчика программ из правильной записи таблицы векторов для выполнения обработчика исключений.
Когда обработчик завершает работу, вернуться к прерванной программе так же просто, как восстановить CPSR из копии, сохраненной в SPSR, и восстановить счетчик программ из регистра связи. Конечно, обработка исключений Cortex-M — это совершенно другой вопрос, и я не буду здесь вдаваться в подробности.
Теперь, когда я уверен, что вы знаете все о регистрах, режимах и состояниях, давайте поговорим о наборе команд, предоставляемом ядром ARM. Большинство ядер ARM, представленных в настоящее время на рынке, поддерживают как минимум два набора инструкций: собственный 32-битный набор инструкций ARM и смешанный 16-битный и 32-битный набор инструкций Thumb. Давайте сначала посмотрим на набор команд ARM.
Хотя этот чат не является курсом по ассемблеру ARM, он все же может дать вам достаточное понимание. Все инструкции в наборе команд ARM имеют длину 32 бита. На первый взгляд синтаксис инструкций ARM кажется очень сложным, но как только вы поймете базовую структуру операторов и возможных операндов, он на самом деле очень прост. RISC-архитектура. Вот несколько примеров, первый очень простой:
До сих пор мы говорили только о наборе инструкций ARM. Как мы все знаем, все инструкции ARM являются 32-битными. Чтобы обеспечить лучшую плотность кода, ARM давно запустила вторую систему кодирования инструкций, названную Thumb All Thumb. инструкции 16-битные.
Код Thumb обычно повышает плотность кода примерно на 35 %, а большая часть кода C и C++ компилируется для Thumb на ядрах с поддержкой Thumb.
Поскольку Thumb настолько хорош, почему мы вкладываем столько усилий в набор инструкций ARM? Это связано с тем, что Thumb — лучшая цель для скомпилированного кода, а если вы пишете код непосредственно на ассемблере, ARM — относительно лучший выбор. Разберем далее принцип реализации ARM.
Я также надеюсь, что читатели смогут получить общее представление о ARM, чтобы глубже понять принципы реализации ARM, и смогут продолжить более глубокое изучение в будущем. Давайте начнем обсуждение этой главы с основы сборки ARM.
Язык ассемблера — это тонкий синтаксический слой поверх машинного кода, который состоит из инструкций, закодированных в двоичном формате, который понимают наши компьютеры. Так почему бы нам не написать код? Вы можете себе представить, как больно кодировать в двоичном формате, поэтому напишем ARM-сборку.
Однако сам компьютер распознает только машинный код и не может запускать ассемблерный код. Для этого требуется инструмент для установки ассемблерного кода в машинный код — GNU Assembler в проекте GNU Binutils. После того, как вы напишете программу с расширением *.s, вам нужно объединить ее с ней и связать с помощью ld:
as program.s -o program.o ld program.o -o program
Давайте посмотрим на это с нижнего уровня. На нижнем уровне на схеме присутствуют электрические сигналы. Сигнал формируется путем переключения напряжения на два уровня, например 0 вольт (выключено) или 5 вольт (включено).
Поскольку мы не можем легко определить напряжение в цепи, мы можем использовать только 1/0 для записи режима включения/выключения, а затем группируем последовательность 0 и 1, чтобы сформировать инструкцию машинного кода, которая представляет собой инструкцию процессор компьютера. Минимальная единица работы. Ниже приведен пример на машинном языке:
1110 0001 1010 0000 0010 0000 0000 0001
Мы знаем, что процессор ARM может выполнять обработку данных только в регистрах, поэтому существует два типа взаимодействия с памятью: загрузка из памяти в регистры и сохранение значений из регистров в память, то есть ARM использует метод загрузки/сохранения ( LDR и STR) модели доступа к памяти.
Обычно LDR используется для загрузки содержимого памяти в регистр, а STR используется для сохранения содержимого регистра по адресу памяти. Давайте возьмем базовый пример:
На первый взгляд друзья могут смутиться. Вот динамическая диаграмма, объясняющая, как ARM взаимодействует с памятью:
Как упоминалось в начале, этот чат не является подробным обзором всей архитектуры и технологий ARM, а представляет собой дверь в мир ARM. На веб-сайте ARM вы можете просмотреть и изучить множество документов.
Например (http://infocenter.arm.com) вы можете найти ссылку на руководство по архитектуре проживания.,Статьи базы знаний,Часто задаваемые вопросы,Документация процессора,руководства для разработчиков и т. д.
ARM также имеет растущую глобальную университетскую программу, которая предоставляет вам множество обучающих и обучающих ресурсов, программных инструментов и плат для разработки аппаратного обеспечения.
Заявление об авторских правах: Содержание этой статьи добровольно предоставлено пользователями Интернета, а мнения, выраженные в этой статье, представляют собой только точку зрения автора. Этот сайт предоставляет только услуги по хранению информации, не имеет никаких прав собственности и не принимает на себя соответствующие юридические обязательства. Если вы обнаружите на этом сайте какое-либо подозрительное нарушение авторских прав/незаконный контент, отправьте электронное письмо, чтобы сообщить. После проверки этот сайт будет немедленно удален.
Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/181935.html Исходная ссылка: https://javaforall.cn