Если 32- битный процессор может обрабатывать примерно 4 ГБ ОЗУ (то есть ) байтов, почему мой Arduino Mega 2560 имеет 8 КБ SRAM, если 8- битный процессор позволяет обрабатывать только 256 байт ( )? Или я неправильно читаю следующую страницу?
Если 32- битный процессор может обрабатывать примерно 4 ГБ ОЗУ (то есть ) байтов, почему мой Arduino Mega 2560 имеет 8 КБ SRAM, если 8- битный процессор позволяет обрабатывать только 256 байт ( )? Или я неправильно читаю следующую страницу?
Ответы:
Большинство 8-битных процессоров имеют 16-битные адресные шины, позволяющие им адресовать 64 КБ, именно потому, что 256 байтов действительно недостаточно, чтобы сделать очень много! Это просто означает, что им нужно загружать два байта вместо одного, каждый раз, когда им нужно загрузить адрес. Немного медленнее, но терпимо, учитывая их размер.
(И да, есть много исключений, в основном, разработанных, когда 64k стали слишком маленькими, но здесь мы говорим об основной идее).
The address bus and data bus are separated so they may have different sizes. For any specific address bus sizes there are a lot of techniques to address more memory than the register bit width
The most common way is increasing the address bus width somehow by
using multiple registers for the address
X
, Y
и Z
регистры адресации данных позволяют максимально использовать 64 КБ ОЗУ. Те , в свою очередь , могут быть соединены с RAMPX
, RAMPY
, RAMPZ
чтобы получить доступ к более высоким адресам ОЗУ в еще большие версии. Он также имеет SPH
старшие байты указателя стека в дополнение к SPL
вариантам с более чем 256 байтами ОЗУ 1H
& L
, B
& C
, D
&, E
которые можно использовать вместе как 16-битный адресный регистриспользуя один большой специальный регистр больше натурального размера для адресации
using a special register for the high part of the address. When addressing some memory, by default the 8 low bits of the address will be taken from the 8-bit immediate or 8-bit register on an 8-bit microcontroller, whereas the high bits will be replaced by the other address register's value.
call
или goto
инструкции 8 или 9 младших битов адреса указываются непосредственными, а оставшиеся берутся из текущего программного счетчика. Таким образом, для доступа ко всему, что находится рядом с текущим сегментом, используется только 1 инструкция, в то время как для дальнейших адресов потребуется 2 инструкции (для установки старших битов).PC
при безусловном переходе.Еще один способ добиться этого - банкинг памяти . Это полезный метод, который до сих пор используется в некоторых архитектурах. В этой модели память делится на несколько банков . Каждый раз вы можете обратиться только в конкретный банк. Часто существует глобальный банк или диапазон адресов, которые всегда видны в любое время, но для других частей вы должны поменять банк при необходимости.
Существует также не совсем распространенная техника, но ее можно найти в Intel 8051 . Как микроконтроллер с 8-битным адресом данных, он может иметь не более 256 адресов. Половина пространства (верхняя часть) используется для регистров специальных функций ( SFR ), ограничивая реальную ОЗУ адресуемой только 128 байтами. Однако современные производители серии 8051 нашли умный способ преодолеть это, разделив доступ к памяти . Прямая адресация будет обращаться к SFR, а косвенная - к регистрам, которые будут обращаться к большей части ОЗУ, что означает, что теперь у вас есть 256 + 128 = 384 адресуемых байта.
1 https://en.wikipedia.org/wiki/Atmel_AVR_instruction_set#Memory_addressing_instructions
Самые маленькие ядра имеют ≤256 байтов адресного пространства данных (то есть ≤128 байтов ОЗУ после удаления портов ввода-вывода и других зарезервированных адресов) и ≤8192 байта (8 КиБ) программного ПЗУ. Они имеют только 8-битный указатель стека (в SPL) и поддерживают только 12-битные относительные инструкции перехода / вызова RJMP / RCALL. (Поскольку счетчик программы AVR считает 16-битные слова, а не байты, 12-битное смещение достаточно для адресации 213 байт ПЗУ.)
Дополнительные возможности адресации памяти предоставляются по мере необходимости для доступа к доступным ресурсам:
- Модели с> 256 байтами адресного пространства данных (≥256 байтов ОЗУ) имеют 16-битный указатель стека с верхней половиной в регистре SPH.
- Модели с ПЗУ> 8 КБ добавляют 2-х (22-битные) инструкции JUMP и CALL. (Некоторые ранние модели страдают ошибками, если за инструкцией пропуска следует инструкция из 2 слов.)
- Модели с ПЗУ> 64 КиБ добавляют инструкцию ELPM и соответствующий регистр RAMPZ. Инструкции LPM расширяют адрес ПЗУ до нуля; Инструкции ELPM предшествуют регистру RAMPZ для старших битов. Это не то же самое, что более общая инструкция LPM; существуют «классические» модели только с формой ELPM с нулевым операндом (ATmega103 и at43usb320). Когда доступно автоинкремент (большинство моделей), он обновляет весь 24-битный адрес, включая RAMPZ.
- (Редкие) модели с ПЗУ> 128 КиБ имеют трехбайтовый программный счетчик. Для вызова и возврата подпрограммы используется дополнительный байт стекового пространства, имеется новый регистр EIND для предоставления дополнительных старших битов для косвенных переходов и вызовов, а также есть новые расширенные инструкции EIJMP и EICALL, которые используют EIND: Z в качестве адреса назначения. (В предыдущих инструкциях IJMP и ICALL Z был расширен до нуля.)
- (Редкие) модели с адресным пространством ОЗУ> 64 КиБ расширяют пределы адресации 16-битной ОЗУ с помощью регистров RAMPX, RAMPY, RAMPZ и RAMPD. Они обеспечивают дополнительные старшие биты для режимов адресации, которые используют пары регистров X, Y или Z соответственно или инструкции прямой адресации LDS / STS. В отличие от доступа к ПЗУ, нет четких «расширенных» инструкций; вместо этого регистры RAMP используются безоговорочно.
Почти все 8-битные процессоры имеют некоторую способность формировать 16-битный адрес из младшей и старшей частей. На некоторых процессорах, включая оригинальный 8080, существуют регистры, предназначенные для хранения верхней и нижней части адреса (хотя с точки зрения программиста могут существовать некоторые регистры, такие как указатель стека 8080, которые не предлагают инструкции для их адресации отдельно). В некоторых других процессорах нет регистров, предназначенных для верхней или нижней половины адреса, но адреса собираются «на лету». Например, на 6502 инструкция «LDA $ 1234, X» загружает аккумулятор с адресом, образованным путем добавления $ 1234 в 8-битный регистр X [предположим, что он содержит $ F0]. Выполнение этой инструкции будет проходить в 4 или 5 шагов:
Передача считанного байта в аккумулятор будет перекрывать выборку следующей инструкции. Кроме того, для многих операций, если шаг 3 не сгенерировал перенос, шаг 4 считал бы правильный адрес, и выполнение могло бы перейти непосредственно от шага 4 к следующей инструкции, минуя шаг 5.
Если вы изучите последовательность операций, то заметите, что архитектура с прямым порядком байтов имеет определенное преимущество над архитектурой с прямым порядком байтов, в этом случае в большинстве случаев (хотя и не той, что показана), даже если ALU выполняет цикл для выполнения Кроме того, можно считывать байт с вычисленного адреса, не ожидая результата ALU, поскольку обычно выбираемый старший байт будет старшим байтом целевого операнда. На машине с прямым порядком байтов с 8-битным ALU индексированная загрузка будет занимать не менее 5 циклов (поскольку нижняя половина адреса не будет считана до шага 3 и, следовательно, будет вычислена на шаге 4).
Databus lines (pins) and address lines (pins) are completely separate. Simply put, databus lines determine maximum number of bits that can be transferred one at a time (and stored on the memory) whereas address lines determine maximum number of memory "cells" that can be selected.
It was mostly a marketing thing that 32-bit x86 CPUs couldn't address more than 4GB of RAM. I remember somewhere that there were A33-34 pins on Pentium 4 CPUs.
It's often true that there is some relationship between addressable memory size and internal register size, though the relationship varies for different reasons. 256 bytes of address space was considered too small even in the very early days of microprocessors, so most eight bit processors produced 16 bit (two byte) addresses, which addressed 64 kilobytes. With bank switching, though (essentially using certain I/O lines to produce even more address lines), it was possible to have much more.
In the first 16 and 32 bit processors, there weren't always enough pins on the device to reach all the space that their internal address registers could address. For example, on the Motorola 68000, there were only enough address pins (24) to address 16 megabytes of RAM, though the internal address registers were 32 bits wide.
I will answer this question specifically for the AVR controllers you mentioned. The basic principle also holds true for many other 8-bit architectures.
AVRs are 8-bit cores. This means they have 8-bit Registers. However, 8 bits are not enough to access a usable amount of memory. Therefore, the AVR core is able to use a specific set of registers combined as 16 bit pointer registers. The registers r30 and r31 (also aliased as ZL and ZH) are an example for this. Together they form the Z Pointer.
In assembly reading a byte at address 0x1234 would looks like this:
ldi ZL, 0x34 ; Load r30 (ZL) with low byte of address
ldi ZH, 0x12 ; Load r31 (ZH) with high byte of address
ld r16, Z ; Load byte to r16
The AVR family has 3 register pairs that can be used for this. They are specifically designed in hardware to allow such operations.
When programming in a higher level language like C, the compiler handles this stuff.
Note: Some AVRs even support bigger memory sizes than 64k. These controllers have a special function register in which additional bits of the address are written before the access. The address therefore consists of following bits (MSB to LSB):
Special function register (usually 1 byte), ZH (8bit), ZL (8bit).
Atmel's 8 bit AVR's actually use a 16 bit data address. The have numerous other 16 bit registers and even some 16 bit timers. Since it is only an 8 bit processor, it usually uses two clock cycles to load a 16 bit register.
Wikipedia explains it pretty well:
Eight-bit CPUs use an 8-bit data bus and can therefore access 8 bits of data in a single machine instruction. The address bus is typically a double octet wide (i.e. 16-bit), due to practical and economical considerations. This implies a direct address space of only 64 KB on most 8-bit processors.
The notion that the "bit width" of a processor establishes the maximum amount of RAM the processor can address is one of the most pervasive myths in computing. In fact the industry history is just littered with CPUs for which this relationship did not hold.
HP 21MX, HP 1000: 16-bit CPU, memory to 16 MB
PDP-11: 16-bit CPU, memory to 4 MB
VAX-11/780: 32-bit CPU, memory to 512 MB
etc., etc.