Микропроцессоры/микроконтроллеры. Имеют ли регистры адреса?

Мой профессор по встраиваемым системам продолжает ссылаться на расположение регистров в памяти как на их соответствующие «адреса». Я смущен этим; У меня всегда было впечатление, что в любом микропроцессоре регистры ЦП не имеют адресов, поскольку они не находятся в основной памяти (они находятся в самом микропроцессоре). Меня также смущает то, что мы имеем в виду, когда говорим «местоположение регистра в памяти» - опять же, это не в основной памяти.

С учетом сказанного, почему мы ссылаемся на расположение регистров ЦП «адресами»? Все/некоторые регистры имеют адреса?

Я подумал об этом и решил, что, возможно, они «подключены» к определенным ячейкам основной памяти, что позволяет получить доступ к значениям, хранящимся в регистрах. Чтобы расширить эту мысль, это то, что отображение памяти?

Я также должен добавить, что мы работаем конкретно с микроконтроллером NXP LPC1768, в котором используется микропроцессор ARM Cortex-M3.

Ответы (9)

От конкретного процессора зависит, находятся ли «регистры» в том же адресном пространстве, что и обычная память данных, или в отдельных. В любом случае, если их несколько, каждому все равно нужен адрес.

Допустим, у процессора есть 16 регистров, тесно связанных с процессором и реализованных отдельно от памяти данных. Эти регистры еще нужно как-то идентифицировать. В этом случае для различения отдельных регистров потребуется 4-битный адрес. В архитектуре RISC 4-битный адрес любого регистра (ов), с которым работает инструкция, будет включен в код инструкции. Например, инструкция ADD может добавить значение исходного регистра в целевой регистр. Эта инструкция будет включать 4 бита для идентификации исходного регистра и еще 4 бита для идентификации целевого регистра. В документации эти регистры могут называться «числом» от 0 до 15, но на самом деле это адрес, по которому регистры находятся в специальной небольшой памяти ЦП.

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

Там много схем, но если у вас больше одного регистра, то эти регистры нужно как-то отличать друг от друга, и внутри железа, которое будет с "адресом", так ли оно называется в документации или нет.

Ах, так вот в чем проблема. Я всегда связывал основную память/ОЗУ исключительно с адресами памяти ; Я бы никогда не подумал связать адреса памяти с чем-то еще. Спасибо, что прояснили это!
Кроме того, теперь мне любопытно; какой компонент отвечает за поиск и доступ к этим адресам регистров?
Если это выделенные регистры, будет аппаратное обеспечение только для выбора регистра. Поскольку регистров так мало, для декодирования и обработки адресных битов можно использовать больше оборудования, чем в обычной большой памяти. Это может ускорить декодирование, разрешить использование нескольких портов и т. д. Обычно любой регистр может управлять любым входом АЛУ и может сохранять вывод АЛУ. В некоторых архитектурах (одним из примеров является dsPIC) три отдельных регистра могут выполнять эти действия по отдельности в одной инструкции.

Источник путаницы в том, что есть (в общем) два вида вещей, которые можно назвать «регистрами».

Первое , вероятно, то, с чем вы знакомы: в ARM это регистры, R0, R1, R2, ... R12, SP, LR, PCв x86 это eax, ebx, ecx, edx, ebp, и так далее. Их также можно назвать « регистрами ядра » или « регистрами процессора ». У них нет адресов в системной памяти, и доступ к ним возможен только с помощью специальных инструкций.

Другой - это регистры, которые могут управлять различными аппаратными блоками (периферийными устройствами), в самом ЦП или вне его. В LPC1768 и многих других встроенных процессорах они обычно отображаются в памяти, поэтому у них есть адреса. Например, блок UART0 находится по адресу 0x4000C000, и именно здесь вам нужно читать или писать для связи с ним. Чтобы отличить от основных регистров, их можно назвать « периферийными регистрами » или « аппаратными регистрами ».

На некоторых младших 8-битных микроконтроллерах, таких как 8051 или PIC, может вообще не быть основных регистров, кроме, возможно, аккумулятора, а все остальные регистры отображаются в различные области памяти, такие как «внутренняя оперативная память» (для временного хранения/вычисления) или Память «Регистры специальных функций» (SFR) для регистров управления и периферийных устройств. В них «регистры» почти всегда имеют адрес.

Большие ARM также имеют регистры сопроцессора , которые можно использовать для управления различными базовыми функциями (например, MMU или кэшем) с помощью таких инструкций, как MRCили MCR. Эти регистры похожи на базовые регистры тем, что у них нет адреса памяти, а только число.

Кроме того, на x86 у вас могут быть порты ввода- вывода , доступ к которым осуществляется с помощью инструкций , inи outкоторые можно использовать для управления некоторыми аппаратными блоками. По функциям они аналогичны периферийным регистрам, но обычно таковыми не называются.

Доступны ли каким-либо образом регистры процессора?
@ ProSteve037: конечно, иначе в них не было бы смысла :) Обычно большинство инструкций на самом деле работают с регистрами процессора. Например, на ARM: MOV, LDR, STR, ADD, SUB и так далее.
@ ProSteve037 В некотором смысле регистры процессора имеют своего рода адрес, но он используется в register fieldкоде операции (командное слово машинного кода), и его нельзя путать с адресами памяти (их положения в формате кода операции различны). , а поля разного размера).

Вы правы в том, что некоторые регистры расположены не в основной памяти, а в самом микропроцессоре, и что эти регистры отображаются в памяти в определенные места.

Микроконтроллер LPC1768 имеет только 64 КБ ОЗУ (что, я полагаю, вы имеете в виду под основной памятью), однако 32-битную адресную шину и 4 ГБ общего адресного пространства. Остальная часть этого адресного пространства содержит флэш-память, в которой хранится ваша программа, и регистры для всех периферийных устройств (например, состояния выходных контактов или АЦП).

Обычно, когда вы пытаетесь получить доступ к отображенному в памяти местоположению, логика внутри микроконтроллера определяет, где физически расположен адрес памяти, и будет управлять линиями управления, чтобы данные попадали туда, где они были предназначены, независимо от того, находятся ли они в ОЗУ, Порт GPIO или регистр управления периферией.

Это упрощает написание программного обеспечения, поскольку вам не нужно слишком беспокоиться о том, где физически расположены регистры, и значительно упрощает компиляцию языков более высокого уровня (например, C).

В конкретном случае LPC1768, глядя на таблицу данных ( http://www.nxp.com/documents/data_sheet/LPC1769_68_67_66_65_64_63.pdf ), мы можем увидеть карту адресов на странице 20 (рис. 4), которая показывает, где все периферийные устройства отображаются в памяти.

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

Как уже говорили другие, это зависит от семейства микроконтроллеров. И это зависит от того, что вы подразумеваете под регистрацией.

Например, msp430 имеет два набора «регистров». Первый — это регистровый файл RISC с 16 16-битными регистрами. К ним относятся регистры счетчика программ, указателя стека, состояния и генератора констант, а также 12 регистров общего назначения. Это регистры в традиционном архитектурном использовании этого слова.

Зарегистрировать файл

Второй набор регистров — все остальное. Порты, периферийные устройства, прерывания и т. д. Они являются частью единого файла памяти и делят пространство с ОЗУ и флэш-памятью общего назначения (пространство кода).

Карта памяти

Например, msp430g2231 имеет выходной регистр порта 1 по адресу памяти 0x21.

Особенности

Вы можете получить доступ к регистру с именем регистра p1out, но это всего лишь указатель на 8-битный адрес памяти 0x21. Самое главное, так это видит компилятор. Файл заголовка, в данном случае msp430g2231.h, определяет "p1out" как значение 0x0021. Помимо регистрового файла RISC, обычное использование регистра означает просто адрес памяти для конкретной опции x. То, что вы видите как «Регистрация p1out», — это то, как более высокий язык облегчает вам программирование вместо запоминания карт памяти.

Если вы используете указатель на адрес памяти 0x27f, вместо этого вы будете читать из ОЗУ. Указатель на адрес памяти 0xffdf, и вместо этого вы будете читать свой скомпилированный код. Все, чем является регистр, — это адрес памяти для специальной функции.

В качестве общего термина «регистр» означает просто место, где вы можете хранить («регистрировать») информацию, и ничего более.

Большинство архитектур резервируют термин «регистр» для местоположений внутри ЦП, которые идентифицируются битами в инструкции и которые часто доступны намного быстрее, чем общая объемная («ОЗУ») память. (И часто 2 или 3 регистра могут быть доступны параллельно в одном цикле выполнения.)

Однако, например, в документации Microchip PIC все адресуемые ячейки называются регистрами, даже включая ОЗУ. Когда ваш профессор копирует это использование термина, он должен, ИМО, сообщить вам, что это не тот способ, которым термин «регистрация» обычно используется в настоящее время. (Как, надеюсь, я делал это на уроках ассемблера PIC.)

Не только микрочип — посмотрите на 8051 как на более ранний пример, и даже у него вполне могут быть предшественники.
@ChrisStratton: я почти уверен, что PIC General Instruments (на котором был основан Microchip 16C54) предшествует 8051 и может даже предшествовать своему предшественнику 8048.
Да, похоже, что он предшествует 8048 примерно на год.

Регистры имеют адреса, хотя обычно они не находятся в памяти.

Подумайте об этом на минуту: адрес обозначает место в некотором пространстве, где память — это всего лишь один экземпляр пространства. Ввод/вывод часто имеет собственное адресное пространство; в некоторых архитектурах микроконтроллеров память кода и память данных являются отдельными пространствами.

Таким образом, регистры тоже могут иметь свое собственное пространство: иногда регистры FP и целочисленные (а на 68000, я полагаю, адресные регистры) имеют свое собственное отдельное пространство.

Один вопрос: как определить, относится ли адрес 1 к байту 1 в памяти, к порту ввода-вывода 1 или к регистру 1? Обычно из контекста: в инструкции IN или OUT, очевидно, порт. В инструкции между регистрами это адрес регистра. В инструкции загрузки будет (большой) адрес памяти и (маленький) адрес регистра и так далее.

В ядре ARM адрес памяти обычно представляет собой 32-битное число; адрес регистра будет 5-битным числом.

Многие процессоры имеют некоторые регистры, доступ к которым осуществляется «по номеру», а также некоторые регистры, доступ к которым возможен только с помощью специальных инструкций. Я не знаю, как можно осмысленно описать регистр «S» 6502, например, как имеющий адрес. Помимо push/pop/call/return, доступ к нему получают только TSX/TXS (перевод S в X или X в S). Бит 4 кода операции выбирает между TSX и TAX или между TXS и TXA, но не имеет смысла рассматривать коды операций как «Перенести X в регистр #b», поскольку никакие другие инструкции не относятся к A, это регистр #0 и S как регистр №1.

Если определить адрес как набор kбитов, который можно использовать для выбора одного элемента из набора 2^kэлементов, то тогда многие регистры во многих процессорах и контроллерах обычно имеют адреса, а контроллеры также имеют некоторые адреса . регистры, которые стробируются схемами, обнаруживающими определенные условия, и не могут быть идентифицированы с помощью какой-либо формы адреса. Однако важно отметить, что во многих случаях проводники адресов, которые управляют регистрами ЦП, не будут иметь отношения к проводникам адресов, которые подключены к более крупным системам памяти. Таким образом, «адреса» регистров часто будут существовать в совершенно отдельной «вселенной» от адресов памяти.

В большинстве процессоров «адреса» регистров всегда либо генерируются внутри логики процессора, вне контроля программиста, либо извлекаются из определенных битов в каждой инструкции. Единственный способ, которым код изменения может программно повлиять на то, какой регистр должен быть выбран конкретной инструкцией, - это исправить соответствующие биты в этой инструкции. В PIC от General Instruments, дизайн которого сохранился в виде PIC от Microchip, если в коде операции указаны все нули для адреса, аппаратное обеспечение заменит содержимое другого регистра, расположенного по адресу 3. Это позволяет коду использовать вычисления для выбора адрес.

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

mov a,80h  ; Direct address space
mov a,@r0  ; Assume R0 = 80h
movc a,@a+dptr ; Assume A = 0 and DPTR = 80h
movx a,@dptr ; Assume DPTR = 80h

все извлекают данные из «адреса 80h», но они считывают четыре несвязанные вещи: адрес в пространстве ввода-вывода (я думаю, регистр данных порта 0), внутренний регистр данных 80h, память кода по адресу 0x0080 и внешнюю память данных по адресу 0x0080. . Во многих системах эти вещи фактически не имели бы никакого отношения друг к другу. Тот факт, что регистр будет отвечать на конкретный адрес в одной вселенной, мало что говорит о том, будет ли он отвечать на этот или любой другой адрес в другой вселенной.

RISC означает «Компьютер с сокращенным набором команд». Частично вы уменьшаете размер набора инструкций, используя только один тип расположения данных, который включает в себя регистры, ОЗУ или ввод-вывод.

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

Два остатка такого мышления: (1) у нас есть процессоры, которые ПРИТЯЖАЮТ, что все регистры равны, путем отображения регистров в пространстве памяти, и (2) у нас есть профессора, которые ПРИТЯЖАЮТ, что все регистры равны, путем обращения к адресам памяти регистров.

Будьте терпимы. Это была важная область исследований для аспирантов, которая оказала значительное и длительное влияние на то, как разрабатывались некоторые процессоры.

Нет. RISC, как правило, не означает потерю различия между файлом регистров и основной памятью, поскольку это усложнило бы декодирование инструкций, что противоречит целям RISC. RISC классически состоит из простых инструкций, которые делают то, что они делают быстро, и оставляют программисту/компилятору связывать их вместе. Таким образом, версии инструкций для регистров и адресов памяти имеют разные кодировки в классической архитектуре RISC. А доступ к памяти обычно осуществляется по адресу, предоставленному регистром с ограниченным непосредственным смещением, поскольку в командном слове доступно только определенное количество битов.
Вы все правильно поняли, кроме первого предложения. Потеря различия между регистровым файлом и основной памятью является одним из способов классического упрощенного декодирования инструкций RISC, что является одной из целей RISC. На практике вмешиваются практические соображения. Например, см. The Ultimate RISC.
Командное слово RISC совершенно явно кодирует номер регистра или ссылку на память, что является сохранением различия по сравнению с рассматриваемой здесь ситуацией, в которой регистр кодируется точно так же, как адрес памяти.
Сначала прочтите ссылку. Перед публикацией.
Ссылка на странную академическую архитектуру, а не на классические рискованные конструкции в том виде, в каком они были построены.
Ты заметил! Теперь вернитесь и прочитайте исходный пост и мой ответ. Обратите внимание на слово «профессор» в обоих постах. Видеть? Вопрос ответ. Отвечать на вопрос. Тесная связь. Я не стал писать на другую тему.

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