Если 32- битный процессор может обрабатывать примерно 4 ГБ ОЗУ (то есть ) байтов, почему мой Arduino Mega 2560 имеет 8 КБ SRAM, если 8- битный процессор позволяет обрабатывать только 256 байт ( )? Или я неправильно читаю следующую страницу?
arduino
microcontroller
microprocessor
sdram
ZaqueoAlejandro
источник
источник
Ответы:
Большинство 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
источник
Почти все 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:
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:
источник
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.
источник