Por que cada endereço em um microcontrolador tem apenas 8 bits de tamanho?


18

Eu vi que, no microcontrolador de 32 bits, cada endereço de memória contém apenas 8 bits de dados; é o mesmo para um MC de 16 bits também. Para dados de 32 bits, ele usa uma combinação de 4 endereços. Por que um endereço não pode ser feito para armazenar dados de 32 bits diretamente (tornando-os em 32 bits ou 16 em vez de 8)?


2
Depende do barramento de dados do microcontrolador. Qual microcontrolador de 32 bits possui memória de bytes? Você tem algum exemplo?
Swanand

4
Simplesmente não é verdade, e é por isso que linguagens de programação como C e C ++ incorporam a possibilidade de um byte ser maior que 8 bits. É que a maioria funciona melhor com bytes de 8 bits, mas 9 bits ou 18 bits estão disponíveis.
PlasmaHH 27/10

6
É como barras de chocolate. Eles continuam diminuindo o preço pelo mesmo preço.
Olin Lathrop

4
Esta pergunta pode ser reformulada "Por que todos os endereços estão alinhados com 8 bits"?
Florian Castellane

2
@FlorianCastellane This. Os endereços não têm tamanho de 8 bits (a menos que você encontre um dispositivo com <256 bits de memória, eles podem estar).
Jayjay #

Respostas:


11

Esta é efetivamente uma escolha de design, não há nenhuma razão difícil para que isso ocorra. Antigamente, quando os processadores de commodities de alto volume operavam com valores de 8 bits, o mapeamento era mais consistente 1: 1. Para consistência, à medida que os projetos evoluíram para os modernos processadores de 32 e 64 bits, fazia sentido manter o mapeamento mais antigo de endereçamento de bytes, mesmo com o aumento dos barramentos de dados (com uma troca de custos de implementação variável). Algumas MCUs de 32 bits ainda podem implementar barramentos de dados de 16 bits em alguma memória, os processadores high-end terão 256 bits ou mais e podem carregar vários registros principais em uma única transação de memória. Interfaces amplas são boas para operações de burst ou streaming.

O tamanho pequeno da memória endereçável é útil não apenas no caso de manipulação de valores de bytes no código, mas também para trabalhar com estruturas na memória, como pacotes Ethernet, onde os bytes específicos precisam ser lidos ou modificados. Freqüentemente, esse tipo de operação precisa ser capaz de executar pequenas operações, mas com muita eficiência.

Também existem cenários em que é necessário operar com dados de big endian, little endian ou endian misto. Agora, muitas vezes, há suporte de hardware dedicado para isso, mas, novamente, o endereçamento de bytes da memória tornará esse tipo de operação mais eficiente em alguns cenários.

É bastante recente que o número de bits de endereço em um registro tenha sido um fator limitante para o espaço de endereço; portanto, desperdiçar 2 bits para endereçar bytes em vez de palavras de 32 bits não seria uma grande preocupação 10-15 anos atrás (e agora com ponteiros de 64 bits, é comum implementar endereços de bytes de 48 ou 56 bits). O ensino introdutório de ciências da computação ainda está um pouco parado na era pós-mainframe e nem sempre aborda os aspectos da evolução de maneira muito clara. Muita terminologia entrou em uso (e definição) na época em que as arquiteturas de baixo custo e alto custo (no sentido mais geral) começaram a ser complementadas por projetos de processador mais restritos a recursos e mais focados em mercadorias.

Eu não respondi especificamente para MCUs, os limites da arquitetura não são tão claros quanto você imagina. Mesmo um design moderno de MCU inicial tem uma boa chance de ser integrado a um processador de servidor com vários núcleos ou existir apenas como um ponto em um conjunto escalável de produtos; de qualquer maneira, uma abordagem consistente para acessar a memória é benéfica para o usuário final que precisa escrever ou código de porta.

Fiz uma pergunta no SE de retrocomputação sobre tamanhos de registro para acompanhar os aspectos históricos dessa pergunta.


2
Penso que processadores com tamanhos de palavras mais longos eram anteriores aos processadores de 8 bits. Um processador de 8 bits seria bastante inútil sem um meio eficiente de adicionar dois números de vários bytes, e os primeiros processadores não poderiam lidar com números maiores que uma única palavra de máquina.
Supercat

11
Trabalhei com processadores de 8 bits o suficiente para saber que eles poderiam facilmente adicionar números de vários bytes, mas não com uma única instrução de CPU. Primeiro, adicione os dois bytes mais baixos e obtenha o byte de resultado mais baixo e um bit de transporte separado. Para quantos outros bytes estiverem presentes, adicione os próximos bytes de entrada e o bit de transporte da etapa anterior, fornecendo o próximo byte de saída e o próximo bit de transporte. Quando não houver bytes de entrada, converta o último bit de transporte em mais um byte de saída.
user6030

@ user6030: Não é comum ter uma instrução ADC? O AVR faz (um microcontrolador RISC de 8 bits para que o gcc precise usar o ADC para intelong ), o x86 e o ​​ARM. Suponho que a maioria das CPUs de 8 bits teria, pois haveria ainda mais demanda por ela do que em um sistema com registros mais amplos. Oh, a supercat está dizendo que os primeiros processadores não tinham um ADC eficiente?
Peter Cordes

Eu acho que é um ponto válido em relação à evolução do tamanho do registro (embora eu não possua dados)
Sean Houlihane

25

Existem alguns DSPs (por exemplo, TI C54x) que não podem endereçar valores menores que 16 bits, e alguns DSPs de áudio usam 24 bits. No entanto, os valores de 8 bits são usados ​​em praticamente todos os códigos de uso geral, portanto, todas as CPUs de uso geral o suportam.

E apenas porque a unidade menor usada para endereços de memória é de bytes de 8 bits não significa que essa seria a maior unidade realmente usada no barramento; a maioria das CPUs usa seu tamanho de palavra nativo (16/32 bits) ou até um tamanho maior para endereçar a memória e, ao usar acessos de bytes, extrai automaticamente o byte da palavra maior.

Por exemplo, o barramento PCI sempre usa transações de 32 bits, mas possui sinais de ativação de bytes para acesso que devem ser menores.


Obrigado. existe algum MC com uma mordidela ampla em vez de byte na memória?
Arun Joe Cheriyan

4
Talvez o Intel 4004?
Pjc50 27/10/16

6
@ArunCheriyan Um exemplo de CPU que trabalhou com mordidelas como a menor palavra endereçável é Saturn : uma CPU projetada pela HP e usada em suas calculadoras de última geração no século passado (a conhecida HP48 em particular). Ele tinha uma arquitetura muito incomum (registradores de 64 bits, ALU de 4 bits, endereços de 20 bits, ...).
dim

Outro exemplo: a menor unidade endereçável do TMS320C3x da TI é de 32 bits.
Krambo #

11
@davidcary Oh, bem ... Datas e tempo nunca foram meu ponto forte, de qualquer maneira. Pergunte a minha esposa sobre seus presentes de aniversário, e meu chefe sobre os prazos ...
dim

18

Um microcontrolador de 16 ou 32 bits geralmente precisa manipular dados com apenas 8 bits de largura (um byte). Por exemplo, cadeias de texto geralmente são armazenadas com um único caractere por byte. Por ter um esquema de endereçamento de memória que permite que cada byte individual seja endereçado, o microcontrolador pode processar com eficiência dados com largura de 8 bits. O que isso significa é que os dados de 32 bits geralmente residem em endereços com múltiplos de 4 bytes, por exemplo, 04, 08, 0C, etc. Mas se a memória tiver 32 bits de largura, o microcontrolador poderá ler 32 bits em um ciclo de leitura . As Micro costumam ter instruções de máquina que podem operar com dados de tamanhos diferentes; portanto, uma instrução de movimentação de dados (MOV) pode ter três formas: MOV.B, MOV.W e MOV.L para mover 8, 16 e 32 bits de dados em uma instrução.


7

A resposta básica é "porque esse é o tamanho de um byte". Com um grande corpo de códigos estabelecido que faz essa suposição, quebrá-la causaria todo tipo de problemas.

Nos primeiros dias, não havia um corpo de código estabelecido. Os processadores freqüentemente usavam todo tipo de arquiteturas estranhas, como mostrado por outras respostas. No momento em que os processadores de 16 bits foram lançados, havia código suficiente assumindo a disponibilidade de dados de 8 bits que deixar de facilitar isso seria uma barreira real à adoção.

Ter uma palavra de 32 bits por endereço não oferece nenhuma desvantagem na velocidade da memória. Em um sistema de 32 bits, os 2 bits de endereço inferiores geralmente não vão para a memória. O processador geralmente lê a palavra inteira de 32 bits e seleciona (ou oculta) o byte de 8 bits necessário nessa palavra. Desde que o seu espaço de endereço possa armazenar dados suficientes (limitados a 2 ^ 32 bytes em um sistema de 32 bits), não se preocupe. De fato, em muitos processadores de 16 bits / 32 bits, o processamento com valores de bytes leva mais tempo do que com valores de comprimento de palavras nativas - a leitura de uma palavra de 32 bits e o descarte de parte dessa palavra exigirão claramente uma operação extra, em comparação com apenas ler a palavra de 32 bits.

Por outro lado, se você possui um sistema em que precisa usar a memória com eficiência, precisa acessar bytes individuais. Se não puder, ficará sem memória. Com isso em mente, é possível fazer referência a bytes individuais claramente, por isso faz sentido ter sua memória dividida em bytes.


3
De fato. E ainda há a pergunta adicional se um processador pode lidar com os dois acessos distintos necessários para carregar ou armazenar um valor desalinhado de 32 bits automaticamente no hardware, ou se isso deve ser explicitamente tratado no software.
Chris Stratton

5

Isso é chamado de ter memória endereçável de bytes . Normalmente, é uma coisa boa, a menos que você esteja ficando sem espaço de endereço (por exemplo, 4 GB com ponteiros de 32 bits, em vez de 16 GB com ponteiros de 32 bits, onde cada endereço é uma palavra de 32 bits separada).


Observe que o espaço de endereço pode ultrapassar esses limites se você dividir os endereços em partes que caberão em um registro cada. Certa vez, tive alguns computadores de 8 bits que atingiram 64 KB de memória dividindo os endereços em duas partes mantidas em registros separados e vi anúncios de computadores também com processadores de 8 bits que podiam atingir 1 MB de memória dividindo os endereços em três peças.
user6030

O AVR (microcontrolador RISC de 8 bits) faz isso: três pares dos 32 registradores de 8 bits de uso geral podem ser desreferenciados como um ponteiro de 16 bits. Há também algumas facilidades para combinar isso com outro segmento de 8 bits para obter endereços de 24 bits.
Peter Cordes

4

Os DSPs de 32 bits da Analog Devices Shark têm 32 bits como a menor unidade de memória endereçável, então sizeof (int) == sizeof (short) == sizeof (char) == 1 (Sim, eles têm caracteres de 32 bits, perfeitamente válidos por o padrão C).

Também coisas como int_8, int_16 e outras coisas não são definidas, uma surpresa desagradável ao transportar código de outras plataformas.


1

O tamanho da unidade de memória endereçável é essencialmente um compromisso entre a quantidade de memória que você pode endereçar e a quantidade de memória que você desperdiçará.

Memória endereçável . Considere uma CPU de 32 bits: se você endereçar bytes, poderá endereçar até 4 GB de memória. Se você endereçar bits individuais, esse valor será reduzido para 512 MB e, se você endereçar palavras de 32 bits, terá 16 GB. (sua pergunta parece sugerir a última).

Memória desperdiçada . Se você tem uma variável que pode ser representada com X bits e só pode alocar unidades de N bits, você desperdiçará (N-1) / 2 bits em média, assumindo X> N. Se você endereçar bits individuais , você usará a memória com 100% de eficiência (pelo menos do ponto de vista de endereçamento). Com bytes, você desperdiçará 3,5 bits por variável (56% de eficiência) e, com palavras de 32 bits, desperdiçará 15,5 bits (52% de eficiência). Mas fica pior: se a maioria das suas variáveis ​​for pequena (pense em caracteres, booleanos, sinalizadores de status), você acabará desperdiçando a maior parte da memória se suas unidades endereçáveis ​​forem muito grandes.

Por exemplo, vamos supor que o tamanho médio de uma variável seja 8 bits.

  • em um computador endereçável por bits, você poderá alocar com 100% de eficiência, o que fornecerá 512*1024*1024*100%= 0,54 bilhões de variáveis.
  • em um computador endereçável por byte, você alocará com 56% de eficiência, o que lhe dará 4096*1024*1024*56% = 2,4 bilhões de variáveis. Isso é quase cinco vezes mais em comparação com um computador endereçável por bits! Obviamente, você precisará comprar 8 vezes mais memória.
  • em um computador endereçável de 32 bits, como pelo menos metade de suas variáveis ​​ocupará menos de 8 bits, elas serão alocadas com eficiência abaixo de 7% (usando 4,5 bits de 32). De qualquer forma, você não obterá mais de 4,3 bilhões de variáveis ​​(já que você tem apenas muitos endereços distintos) e menos que isso na realidade. Evitando cálculos complexos, eu acho que terá um armazenamento talvez 20 a 30% mais útil em comparação com o computador endereçável por byte, pagando 4 vezes o preço da RAM.

1

Provavelmente já disse várias maneiras nas outras respostas. Em geral hoje, mas não necessariamente historicamente, um byte é de 8 bits. Na maioria das vezes, lidamos com "memória endereçável de byte", significando que a PEQUENA coisa que podemos acessar com um único endereço é um byte. Mas isso não significa que é a ÚNICA coisa que podemos resolver. Dependendo da plataforma, um único endereço pode ser usado para acessar um byte, uma meia palavra / palavra (16 bits), uma palavra / palavra dupla (32 bits) e assim por diante 64 bits. A instrução basicamente determina qual é o tamanho do acesso desejado (8,16,32,64, etc) geralmente nessas unidades 8, 16, 32, 64. Mas isso não é difícil e rápido "depende".

Além disso, dependendo do design do processador e / ou sistema, não há razão para supor que o tamanho do acesso seja o tamanho da memória ou o tamanho do menor acesso. Com requisitos cada vez maiores, faz cada vez menos sentido, ao longo do tempo, implementar o sistema de memória usando o menor tamanho; o computador em que você está lendo provavelmente usa um barramento de dados de 32 bits ou de 64 bits para todos os acessos, Para ler um byte, ele lê em 64 bits e lança o restante, por que não custa nada extra? Mantenha o barramento tão amplo até o núcleo do processador e o processador seleciona a faixa de bytes correta. custa mais lógica e / ou relógios para estreitar o barramento ou mover os bytes nas faixas de bytes (às vezes é feito). portanto, ram internos em um microcontrolador podem ter 32 bits de largura, por exemplo, se isso faz sentido para o sistema. pode ser 16. Sim, para gravações, você grava mais ciclos, é necessário ler-modificar-gravar em algum lugar ao longo da linha. Deseja escrever um único byte no seu PC, em algum lugar ocorre uma leitura de 64 bits e, em seguida, em algum lugar um byte desses 64 bits é modificado, dependendo do que você faz depois disso, que 64 bits podem voltar para dram com apenas esses 8 bits diferente do que existia antes, o armazenamento em cache e seu código tornam essa regra não genérica. As gravações são acionadas e, no entanto, esqueça: o controlador de memória pode coletar o endereço e os dados do processador e permitir que o processador continue funcionando enquanto eventualmente faz os relógios de economia de gravação, talvez mais relógios que sejam queimados em uma leitura-modificação-gravação (se já no cache),

Ainda hoje há exceções para praticamente tudo isso, talvez existam instruções ou tipos de acesso em alguns sistemas que são endereçáveis ​​por bits, existem alguns sistemas em que o endereço está em unidades de algo diferente de um byte. Um byte nem sempre foi de 8 bits e talvez ainda existam sistemas em execução (costumávamos usar octal e uma palavra de 9 bits de 18 ou 36 bits faz muito sentido para programadores humanos e designers de chips que pensam que octal, um 8 bits faz muito sentido para pensadores hexadecimais).

Agora, o computador em que você está lendo isso, mesmo que o barramento de dados para esse controlador dram possa ter 32 ou 64 bits de largura, o módulo dram propriamente dito é provavelmente composto de várias partes com 8 bits de largura, que você pode ver facilmente. Se tiver 8 ou 9 chips de um lado, provavelmente é um barramento de 64 bits ou 72 bits (64 bits mais 8 bits de ECC) implementado com peças de 8 bits de largura. Se você tiver 4 ou 5 chips em um lado do módulo, mas ainda tiver toneladas de pinos, ele terá 32 bits de largura (improvável hoje em dia) ou 4 dos chips terão 16 bits de largura e, se houver um quinto, poderá ter 16 bits de largura e apenas 8 são usados ​​ou é uma parte de 8 bits de largura. Também existem peças com largura de 32 bits, mas a largura de 8 bits é a mais comum. Uma prática muito comum que remonta a muito tempo.

Nós precisaríamos saber qual microcontrolador. Como você menciona 32 bits, é bem provável (sem informações detalhadas, embora não possamos dizer) que a memória nessa parte tenha 32 bits de largura e todos os acessos a ela tenham 32 bits de largura. as instruções provavelmente determinariam o que o programa deseja, o que provavelmente oferece um tipo de acesso de 8 bits, 16 bits e 32 bits; os menores nas gravações exigiriam uma leitura-modificação-gravação em algum lugar, pois você apenas ignora as faixas de bytes. O mesmo vale para o flash, embora as gravações em flash sejam outro tópico. Mas o flash interno tem provavelmente 32 bits de largura e todas as leituras estão em unidades de 32 bits. Um flash externo, porém, é outra história, provavelmente eles têm um pouco de largura (spi ou i2c), embora as partes spi às vezes suportem 1, 2 ou 4 bits, mas um pino de missô é o mais comum. Internamente, eles são organizados em unidades de bytes, pode ter 8 bits de largura ou 16 ou 32, ou quem sabe, você muda e os endereça em unidades de bytes. Com o spi, você pode alternar entre um byte e toda a memória em uma única transação, dependendo do design da peça flash.


0

Você também pode obter processadores de 1 bit!

A largura dos dados seguirá a largura do registrador (acumulador). normalmente é a 'largura do processador', enquanto o barramento de endereço pode ser diferente (geralmente maior), mas tecnicamente pode ser mais restrito dependendo do uso.

8, é claro, é uma potência de dois números. Temos uma história a agradecer pelo uso onipresente de 8 bits - e pelo custo / capacidade da tecnologia. Por um longo tempo, 8 bits prevaleceram, parte do motivo é a largura dos barramentos e a dificuldade em criar registros (e RAM) com mais de 8 bits de largura (nenhum ponto nos dados de 16 bits, se todos os seus registros tiverem 8 bits). 8 bits é bastante bacana e faz muito sentido em Hex. 8 bits podem conter seu alfabeto, números, caracteres de desenho e controle (ASCII) ou 0 a 255 ou + -127 É fácil acessar mais de 256 bytes de dados (barramento de endereços de 8 bits) com paginação, selecione a página e o byte, por exemplo 256 páginas de 256 leva a 64K (65536). Normalmente, a página zero seria um bloco de rascunho, pois seria mais rápido acessar, pois isso não exigiria que a página fosse definida. Meu primeiro computador tinha 1k x 8bits de RAM estática! (RAM dinâmica era mais barata, mas precisava de mais hardware para atualizá-lo). Com alguns sinalizadores (c, nc, z, nz), adicione, subtraia, gire para a esquerda e para a direita, você pode fazer algumas contas bastante complexas em uma máquina de 8 bits. Você não precisa de uma unidade aritmética de ponto flutuante! Não é super rápido, mas factível! Muitos processadores antigos podiam ter um único passo e serem usados ​​com RAM estática simples, facilitando muito a depuração; adicionando alguns buffers octais e LEDs vermelhos iniciais, você pode assistir a alteração dos barramentos de endereço e dados :)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.