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)?
microcontroller
flash-memories
Arun Joe Cheriyan
fonte
fonte
Respostas:
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.
fonte
int
elong
), 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?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.
fonte
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.
fonte
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.
fonte
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).
fonte
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.
fonte
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.
512*1024*1024*100%
= 0,54 bilhões de variáveis.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.fonte
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.
fonte
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 :)
fonte