Se um processador de 32 bits pode lidar com aproximadamente 4 GiB de RAM (ou seja, ) bytes, por que meu Arduino Mega 2560 possui 8 KiB de SRAM, se um processador de 8 bits permite lidar com apenas 256 bytes ( )? Ou estou lendo a página a seguir errado?
arduino
microcontroller
microprocessor
sdram
ZaqueoAlejandro
fonte
fonte
Respostas:
A maioria das CPUs de 8 bits possui barramentos de endereço de 16 bits, o que lhes permite endereçar 64kbytes, precisamente porque 256 bytes realmente não são suficientes para fazer muito! Significa apenas que eles precisam carregar dois bytes em vez de um, cada vez que precisam carregar um endereço. Um pouco mais lento, mas tolerável, considerando seu tamanho.
(E sim, existem muitas exceções, desenvolvidas principalmente quando 64k se tornaram muito pequenos, mas estamos falando da idéia básica aqui).
fonte
O barramento de endereços e o barramento de dados são separados para que possam ter tamanhos diferentes. Para qualquer tamanho de barramento de endereço específico, existem muitas técnicas para endereçar mais memória do que a largura de bit do registro
A maneira mais comum é aumentar a largura do barramento de endereço de alguma forma
usando vários registros para o endereço
X
,Y
eZ
endereçamento de dados registros para permitir 64KB máximo de RAM. Aqueles, por sua vez pode ser emparelhado comRAMPX
,RAMPY
,RAMPZ
acessar endereços de RAM mais elevados em versões ainda maiores. Ele também possuiSPH
os bytes altos do ponteiro da pilha, além deSPL
variantes com mais de 256 bytes de RAM 1H
&L
,B
&C
,D
&E
que podem ser usados juntos como um registrador de endereços de 16 bitsusando um único grande registro especial maior que o tamanho natural para tratar
usando um registro especial para a parte alta do endereço . Ao endereçar alguma memória, por padrão, os 8 bits baixos do endereço serão obtidos do registro imediato de 8 bits ou de 8 bits em um microcontrolador de 8 bits, enquanto os bits altos serão substituídos pelo valor do outro registro de endereço.
call
ougoto
instrução, 8 ou 9 bits baixos do endereço são indicados pelo imediato e o restante é retirado do contador atual do programa. Portanto, acessar qualquer coisa não muito distante do segmento atual usa apenas 1 instrução, enquanto endereços adicionais precisarão de 2 instruções (para definir os bits mais altos).PC
um salto incondicional.Outra maneira de conseguir isso é o banco de memória . Esse é um método útil ainda usado em algumas arquiteturas atualmente. Nesse modelo, a memória é dividida em vários bancos . Cada vez que você pode endereçar apenas um banco específico. Geralmente, existe um banco global ou um intervalo de endereços sempre visível a qualquer momento, mas para outras partes, você deve trocar de banco quando necessário.
Também existe uma técnica não muito comum, mas pode ser encontrada no Intel 8051 . Como um microcontrolador com endereço de dados de 8 bits, ele pode ter no máximo 256 endereços. Metade do espaço (a parte mais alta) é usada para registros de função especial ( SFR ), limitando a RAM real endereçável a apenas 128 bytes. No entanto, os fabricantes modernos da série 8051 encontraram uma maneira inteligente de superar isso separando o acesso à memória . O endereçamento direto acessará o SFR enquanto o endereçamento indireto, embora os registradores acessem a parte alta da RAM, o que significa que agora você tem 256 + 128 = 384 bytes endereçáveis.
1 https://en.wikipedia.org/wiki/Atmel_AVR_instruction_set#Memory_addressing_instructions
fonte
Quase todos os processadores de 8 bits têm alguma capacidade de formar um endereço de 16 bits a partir de uma parte de ordem baixa e uma parte de ordem alta. Em alguns processadores, incluindo o 8080 original, há registros dedicados a manter a parte superior e inferior de um endereço (embora, do ponto de vista de um programador, possa haver alguns registros, como o ponteiro de pilha do 8080, que não oferecem instruções para abordá-los separadamente). Em alguns outros processadores, não há registros dedicados à metade superior ou inferior de um endereço, mas os endereços são montados "em tempo real". Por exemplo, no 6502, a instrução "LDA $ 1234, X" carrega o acumulador com o endereço formado adicionando $ 1234 ao registro X de 8 bits [suponha que ele contenha $ F0]. A execução dessa instrução continuaria em 4 ou 5 etapas:
A transferência do byte de leitura para o acumulador se sobrepõe à busca da próxima instrução. Além disso, para muitas operações, se a etapa 3 não gerasse um transporte, a etapa 4 teria lido o endereço correto e a execução poderia pular diretamente da etapa 4 para a próxima instrução, ignorando a etapa 5.
Se examinarmos a sequência de operações, notamos que uma arquitetura little-endiana tem uma vantagem definida sobre uma arquitetura big-endian, na maioria dos casos (embora não seja a mostrada), mesmo que a ULA tenha um ciclo para executar Além disso, é possível ler um byte do endereço calculado sem aguardar o resultado da ALU, pois normalmente o byte alto buscado será o byte alto do operando de destino. Em uma máquina big endian com uma ALU de 8 bits, uma carga indexada levaria pelo menos 5 ciclos (uma vez que a metade inferior do endereço não seria lida até a etapa 3 e, portanto, seria computada na etapa 4).
fonte
As linhas de dados (pinos) e as linhas de endereço (pinos) são completamente separadas. Simplificando, as linhas de dados determinam o número máximo de bits que podem ser transferidos um de cada vez (e armazenados na memória), enquanto as linhas de endereço determinam o número máximo de "células" de memória que podem ser selecionadas.
Era principalmente uma questão de marketing que as CPUs x86 de 32 bits não conseguiam lidar com mais de 4 GB de RAM. Lembro-me em algum lugar que havia pinos A33-34 nas CPUs Pentium 4.
fonte
Geralmente, é verdade que existe algum relacionamento entre o tamanho da memória endereçável e o tamanho do registro interno, embora o relacionamento varie por diferentes razões. 256 bytes de espaço de endereço eram considerados muito pequenos, mesmo nos primeiros dias dos microprocessadores; portanto, a maioria dos processadores de oito bits produzia endereços de 16 bits (dois bytes), que endereçavam 64 kilobytes. Com a troca de banco, no entanto (essencialmente usando certas linhas de E / S para produzir ainda mais linhas de endereço), era possível ter muito mais.
Nos primeiros processadores de 16 e 32 bits, nem sempre havia pinos suficientes no dispositivo para atingir todo o espaço que seus registradores de endereços internos podiam endereçar. Por exemplo, no Motorola 68000, havia apenas pinos de endereço (24) suficientes para endereçar 16 megabytes de RAM, embora os registradores de endereços internos tivessem 32 bits de largura.
fonte
Vou responder a essa pergunta especificamente para os controladores AVR que você mencionou. O princípio básico também é válido para muitas outras arquiteturas de 8 bits.
AVRs são núcleos de 8 bits. Isso significa que eles têm registradores de 8 bits. No entanto, 8 bits não são suficientes para acessar uma quantidade utilizável de memória. Portanto, o núcleo do AVR pode usar um conjunto específico de registros combinados como registros de ponteiro de 16 bits. Os registros r30 e r31 (também conhecido como ZL e ZH) são um exemplo disso. Juntos, eles formam o ponteiro Z.
Na montagem, a leitura de um byte no endereço 0x1234 ficaria assim:
A família AVR possui 3 pares de registros que podem ser usados para isso. Eles são projetados especificamente em hardware para permitir essas operações.
Ao programar em uma linguagem de nível superior como C, o compilador lida com essas coisas.
Nota: Alguns AVRs até suportam tamanhos de memória maiores que 64k. Esses controladores possuem um registro de função especial no qual bits adicionais do endereço são gravados antes do acesso. O endereço, portanto, consiste nos seguintes bits (MSB para LSB):
Registro de função especial (geralmente 1 byte), ZH (8 bits), ZL (8 bits).
fonte
Os AVRs de 8 bits da Atmel usam realmente um endereço de dados de 16 bits. Existem vários outros registradores de 16 bits e até alguns temporizadores de 16 bits. Como é apenas um processador de 8 bits, geralmente usa dois ciclos de clock para carregar um registro de 16 bits.
fonte
A Wikipedia explica muito bem:
fonte
A noção de que a "largura de bit" de um processador estabelece a quantidade máxima de RAM que o processador pode tratar é um dos mitos mais difundidos na computação. De fato, a história do setor está repleta de CPUs para as quais esse relacionamento não se manteve.
HP 21MX, HP 1000: CPU de 16 bits, memória até 16 MB
PDP-11: CPU de 16 bits, memória para 4 MB
VAX-11/780: CPU de 32 bits, memória para 512 MB
etc etc.
fonte