Pourquoi chaque adresse d'un microcontrôleur n'a-t-elle qu'une taille de 8 bits?


18

J'ai vu que, dans un microcontrôleur 32 bits, chaque adresse de mémoire ne contient que 8 bits de données; il en va de même pour un MC 16 bits également. Pour les données 32 bits, il utilise une combinaison de 4 adresses. Pourquoi une adresse ne peut-elle pas contenir directement des données 32 bits (ce qui en fait 32 bits ou 16 chacun au lieu de 8)?


2
Cela dépend du bus de données du microcontrôleur. Quel microcontrôleur 32 bits a une mémoire d'octets? Avez-vous un exemple?
Swanand

4
Tout simplement pas vrai, c'est la raison pour laquelle les langages de programmation comme C et C ++ incorporent la possibilité pour un octet d'être supérieur à 8 bits. C'est juste que la majorité fonctionne mieux avec des octets de 8 bits, mais 9 bits ou 18 bits sont disponibles.
PlasmaHH

6
C'est comme des friandises. Ils continuent de les rendre plus petits pour le même prix.
Olin Lathrop du

4
Cette question peut-elle être reformulée "Pourquoi toutes les adresses sont-elles alignées sur 8 bits"?
Florian Castellane

2
@FlorianCastellane This. Les adresses n'ont pas une taille de 8 bits (sauf si vous pouvez trouver un périphérique avec <256 bits de mémoire, elles peuvent l'être).
jayjay

Réponses:


11

C'est effectivement un choix de conception, il n'y a aucune raison pour laquelle il doit en être ainsi. Dans le passé, lorsque les processeurs de produits à haut volume fonctionnaient sur des valeurs 8 bits, le mappage était plus cohérent 1: 1. Pour des raisons de cohérence au fur et à mesure que les conceptions évoluaient vers les processeurs modernes 32 et 64 bits, il était logique de conserver l'ancien mappage de l'adressage d'octets, même si les bus de données augmentaient (avec un changement de compromis de coût d'implémentation). Certains MCU 32 bits peuvent toujours implémenter uniquement des bus de données 16 bits vers une certaine mémoire, les processeurs haut de gamme auront 256 bits ou plus et sont capables de charger plusieurs registres de base en une seule transaction de mémoire. Les interfaces larges sont bonnes pour les opérations de rafale ou de streaming.

La petite taille de la mémoire adressable est utile non seulement dans le cas de la gestion des valeurs d'octets dans le code, mais pour travailler avec des structures en mémoire comme les paquets Ethernet où des octets spécifiques doivent être lus ou modifiés. Fréquemment, ce type d'opération doit pouvoir effectuer de petites opérations mais de manière très efficace.

Il existe également des scénarios où il est nécessaire d'opérer avec des données big-endian, little-endian ou mixed endian. Désormais, il existe souvent un support matériel dédié à cela, mais encore une fois, l'adressage octet de la mémoire rendra ce type d'opération plus efficace dans certains scénarios.

Il est assez récent que le nombre de bits d'adresse dans un registre ait été un facteur limitant pour l'espace d'adressage, donc gaspiller 2 bits pour adresser des octets plutôt que des mots de 32 bits n'aurait pas été une grande préoccupation il y a 10-15 ans (et maintenant avec des pointeurs 64 bits, il est courant d'implémenter des adresses d'octets de 48 ou 56 bits de large). L'enseignement d'informatique d'introduction est encore un peu coincé dans l'ère du mainframe juste après, et ne traite pas toujours très clairement les aspects de l'évolution. Beaucoup de terminologie a été utilisée (et définie) à l'époque où les architectures à faible coût et à coût élevé (au sens le plus général) ont commencé à être complétées par des conceptions de processeurs plus limitées et plus axées sur les produits.

Je n'ai pas répondu spécifiquement pour les MCU, les limites architecturales ne sont pas aussi claires que vous pourriez le supposer. Même une conception de microcontrôleur de base moderne a de bonnes chances d'être intégrée avec un processeur de serveur à plusieurs cœurs, ou d'exister comme un seul point dans un ensemble évolutif de produits; Dans les deux cas, une approche cohérente pour accéder à la mémoire est bénéfique pour l'utilisateur final qui a besoin d'écrire ou de porter du code.

J'ai posé une question sur le SE recalculé sur la taille des registres pour faire le suivi des aspects historiques de cette question.


2
Je pense que les processeurs avec des mots plus longs sont antérieurs aux processeurs 8 bits. Un processeur 8 bits serait assez inutile sans un moyen efficace d'ajouter deux nombres multi-octets, et les premiers processeurs ne pouvaient pas gérer efficacement des nombres supérieurs à un seul mot machine.
supercat

1
J'ai suffisamment travaillé avec des processeurs 8 bits pour savoir qu'ils pouvaient facilement ajouter des nombres multi-octets, mais pas avec une seule instruction CPU. Tout d'abord, ajoutez les deux octets les plus bas et obtenez l'octet de résultat le plus bas, ainsi qu'un bit de retenue séparé. Pour autant d'autres octets sont présents, ajoutez les octets d'entrée suivants et le bit de report de l'étape précédente, en donnant l'octet de sortie suivant et le bit de report suivant. Lorsqu'il ne reste plus d'octets d'entrée, convertissez le dernier bit de retenue en un octet de sortie supplémentaire.
user6030

@ user6030: N'est-il pas courant d'avoir une instruction ADC? AVR le fait (un microcontrôleur RISC 8 bits, donc gcc doit utiliser ADC pour intetlong ), x86, ARM aussi. Je suppose que la plupart des processeurs 8 bits le feraient, car il y aurait encore plus de demande que sur un système avec des paramètres plus larges. Oh, est-ce que Supercat dit que les premiers processeurs manquaient d'un ADC efficace?
Peter Cordes

Je pense que c'est un point valable concernant l'évolution de la taille du registre (bien que je manque de données)
Sean Houlihane

25

Il existe quelques DSP (par exemple, TI C54x) qui ne peuvent pas adresser des valeurs inférieures à 16 bits, et certains DSP audio utilisent 24 bits. Cependant, les valeurs 8 bits sont utilisées dans à peu près tout le code à usage général, donc tous les CPU à usage général le prennent en charge.

Et ce n'est pas parce que l'unité réduite utilisée pour les adresses mémoire est de 8 bits que ce sera la plus grande unité réellement utilisée sur le bus; la plupart des processeurs utilisent leur taille de mot natif (16/32 bits) ou même une plus grande taille pour adresser la mémoire, et lors de l'utilisation des accès octets, extraire automatiquement l'octet du mot plus grand.

Par exemple, le bus PCI utilise toujours des transactions 32 bits, mais a des signaux d'activation d'octets pour l'accès qui doivent être plus petits.


Je vous remercie. y a-t-il un MC qui est un quartet large au lieu d'octet en mémoire?
Arun Joe Cheriyan

4
Peut-être l'Intel 4004?
pjc50

6
@ArunCheriyan Un exemple d'un processeur qui a fonctionné avec des grignotages comme le plus petit mot adressable est le Saturne : un processeur conçu par HP et utilisé dans leurs calculatrices haut de gamme au siècle dernier (le bien connu HP48 en particulier). Il avait une architecture très inhabituelle (registres 64 bits, ALU 4 bits, adresses 20 bits, ...).
dim

Autre exemple: la plus petite unité adressable pour le TMS320C3x de TI est de 32 bits.
kkrambo

1
@davidcary Oh, eh bien ... Les dates et l'heure n'ont jamais été mon fort, de toute façon. Interrogez ma femme sur ses cadeaux d'anniversaire et mon patron sur les délais ...
dim

18

Un microcontrôleur 16 bits ou 32 bits a souvent besoin de manipuler des données d'une largeur de seulement 8 bits (un octet). Par exemple, les chaînes de texte sont généralement stockées avec un seul caractère par octet. En ayant un schéma d'adressage mémoire qui permet d'adresser chaque octet individuel, le microcontrôleur peut traiter efficacement des données de 8 bits de large. Cela signifie que les données 32 bits résident généralement sur des adresses qui sont des multiples de 4 octets, par exemple 04, 08, 0C, etc. Mais si la mémoire est de 32 bits, le microcontrôleur peut lire 32 bits en un cycle de lecture. . Les micro ont souvent des instructions machine qui peuvent fonctionner sur des données de longueur différente, vous constaterez donc qu'une instruction de données de mouvement (MOV) peut avoir 3 formes, MOV.B, MOV.W et MOV.L pour déplacer 8, 16 et 32 ​​bits de données en une seule instruction.


7

La réponse de base est "parce que c'est la longueur d'un octet". Avec un grand corps de code établi qui fait cette hypothèse, le casser causerait toutes sortes de problèmes.

Au tout début, il n'existait aucun corpus de code établi. Les processeurs utilisent fréquemment toutes sortes d'architectures étranges, comme le montrent d'autres réponses. Cependant, au moment où les processeurs 16 bits sont sortis, il y avait suffisamment de code en supposant la disponibilité de données 8 bits qui, si cela n'avait pas été aussi simple, aurait été un véritable obstacle à l'adoption.

Avoir un mot 32 bits par adresse ne présente aucun inconvénient en termes de vitesse de mémoire. Sur un système 32 bits, les 2 bits d'adresse inférieurs ne vont souvent pas dans la mémoire. Le processeur lira généralement l'intégralité du mot 32 bits et sélectionnera (ou masquera) l'octet 8 bits dont il a besoin dans ce mot. Tant que votre espace d'adressage peut stocker suffisamment de données (limité à 2 ^ 32 octets avec un système 32 bits), pas de soucis. En fait, sur de nombreux processeurs 16 bits / 32 bits, le traitement avec des valeurs d'octets prend plus de temps qu'avec des valeurs de longueur de mot natives - la lecture d'un mot 32 bits et la suppression d'une partie de ce mot nécessiteront clairement une opération supplémentaire, par rapport à la simple lecture du mot 32 bits.

Inversement, si vous avez un système où vous devez utiliser efficacement la mémoire, vous devez pouvoir accéder aux octets individuels. Si vous ne le pouvez pas, vous allez manquer de mémoire. Dans cet esprit, être en mesure de référencer des octets individuels est clairement nécessaire, il est donc logique d'avoir votre mémoire fragmentée en octets.


3
En effet. Et puis il y a la question supplémentaire de savoir si un processeur peut gérer les deux accès distincts nécessaires pour charger ou stocker automatiquement une valeur 32 bits non alignée dans le matériel, ou si cela doit être explicitement géré dans le logiciel.
Chris Stratton

5

C'est ce qu'on appelle avoir une mémoire adressable en octets . C'est normalement une bonne chose, sauf si vous manquez d'espace d'adressage (par exemple 4 Go avec des pointeurs 32 bits, au lieu de 16 Go avec des pointeurs 32 bits où chaque adresse est un mot 32 bits distinct).


Notez que l'espace d'adressage peut dépasser ces limites si vous divisez les adresses en parties qui tiendront dans un registre chacune. J'ai eu une fois des ordinateurs 8 bits qui atteignaient 64 Ko de mémoire en divisant les adresses en deux parties conservées dans des registres séparés, et j'ai vu des annonces pour des ordinateurs également avec des processeurs 8 bits qui pouvaient atteindre 1 Mo de mémoire en divisant les adresses en trois les pièces.
user6030

L'AVR (microcontrôleur RISC 8 bits) fait cela: trois paires des 32 registres 8 bits à usage général peuvent être déréférencées en tant que pointeur 16 bits. Il est également possible de combiner cela avec un autre segment 8 bits pour obtenir des adresses 24 bits.
Peter Cordes

4

Les DSP Analog Devices Shark 32 bits ont 32 bits comme la plus petite unité de mémoire adressable, donc sizeof (int) == sizeof (short) == sizeof (char) == 1 (Oui, ils ont des caractères 32 bits, parfaitement valides par la norme C).

Des choses comme int_8, int_16 et autres ne sont pas définies dans, une mauvaise surprise lors du portage de code à partir d'autres plates-formes.


1

La taille de l'unité de mémoire adressable est essentiellement un compromis entre la quantité de mémoire que vous pouvez adresser et la quantité de mémoire que vous gaspillerez.

Mémoire adressable . Prenons un processeur 32 bits: si vous adressez des octets, vous pouvez adresser jusqu'à 4 Go de mémoire. Si vous vous adressez à des bits individuels, ce montant sera réduit à 512 Mo, et si vous vous adressez à des mots de 32 bits, vous aurez 16 Go. (votre question semble suggérer ce dernier).

Mémoire gaspillée . Si vous avez une variable qui peut être représentée avec X bits et que vous ne pouvez lui allouer que des unités de N bits, vous gaspillerez (N-1) / 2 bits en moyenne, en supposant X> N. Si vous vous adressez à des bits individuels , vous utiliserez la mémoire avec une efficacité de 100% (au moins du point de vue de l'adressage). Avec les octets, vous gaspillerez 3,5 bits par variable (56% d'efficacité) et avec les mots 32 bits, vous gaspillerez 15,5 bits (52% d'efficacité). Mais cela empire: si la plupart de vos variables sont petites (pensez aux caractères, aux booléens, aux drapeaux d'état), vous finirez par gaspiller la majeure partie de la mémoire si vos unités adressables sont trop grandes.

Par exemple, supposons que la taille moyenne d'une variable soit de 8 bits.

  • sur un ordinateur adressable par bit, vous pourrez allouer avec une efficacité de 100%, ce qui vous donnera 512*1024*1024*100%= 0,54 milliard de variables.
  • sur un ordinateur adressable en octets, vous allouerez avec une efficacité de 56%, ce qui vous donnera 4096*1024*1024*56%= 2,4 milliards de variables. C'est presque 5 fois plus qu'un ordinateur adressable par bit! Bien sûr, vous devrez acheter 8 fois plus de mémoire.
  • sur un ordinateur adressable 32 bits, car au moins la moitié de vos variables occuperont moins de 8 bits, elles seront allouées avec une efficacité inférieure à 7% (en utilisant 4,5 bits sur 32). Dans tous les cas, vous n'obtiendrez pas plus de 4,3 milliards de variables (puisque vous n'avez que autant d'adresses distinctes), et moins que cela en réalité. En évitant les calculs complexes, je suppose que vous obtiendrez peut-être 20 à 30% de stockage utile en plus par rapport à un ordinateur adressable en octets, tout en payant 4 fois le prix de la RAM.

1

Probablement déjà dit différentes manières dans les autres réponses. En général aujourd'hui, mais pas nécessairement historiquement, un octet est de 8 bits. La plupart du temps, nous parlons de "mémoire adressable en octets", ce qui signifie que la PLUS PETITE chose à laquelle nous pouvons accéder avec une seule adresse est un octet. Mais cela ne signifie pas que c'est la SEULE chose que nous pouvons aborder. Selon la plateforme, une seule adresse peut être utilisée pour accéder à un octet, un demi-mot / mot (16 bits), un mot / double mot (32 bits) et ainsi de suite 64 bits. L'instruction détermine essentiellement la taille de l'accès souhaité (8, 16, 32, 64, etc.) généralement dans les unités 8, 16, 32, 64. Mais ce n'est pas difficile et rapide, "cela dépend".

En fonction également de la conception du processeur et / ou du système, il n'y a aucune raison de supposer que la taille de l'accès est la taille de la mémoire ou la taille du plus petit accès. Avec des exigences de plus en plus grandes, il est de moins en moins judicieux au fil du temps d'implémenter réellement le système de mémoire en utilisant la plus petite taille, l'ordinateur sur lequel vous lisez ceci utilise probablement un bus de données de 32 bits ou 64 bits pour tous les accès, vous voulez lire un octet, il fait une lecture de 64 bits et lance le reste des bits, pourquoi cela ne coûte rien de plus garder le bus aussi large jusqu'à près du cœur du processeur et le processeur sélectionne la bonne voie d'octets. coûte plus de logique et / ou d'horloges pour rendre le bus plus étroit ou déplacer les octets dans les voies d'octets, (cela se fait parfois). les béliers internes d'un microcontrôleur peuvent donc avoir une largeur de 32 bits, par exemple, si cela a du sens pour le système. peut être 16. Oui pour les écritures vous gravez plus de cycles, vous devez lire-modifier-écrire quelque part le long de la ligne. Vous voulez écrire un seul octet sur votre PC, quelque part une lecture 64 bits se produit, puis quelque part un octet de ces 64 bits est modifié, selon ce que vous faites après cela, ces 64 bits peuvent revenir au dram avec seulement ces 8 bits différent de ce qui était auparavant, la mise en cache et votre code n'en font pas une règle générique. Les écritures sont des incendies et oublient cependant, le contrôleur de mémoire peut collecter l'adresse et les données du processeur et permettre au processeur de continuer à fonctionner pendant qu'il fait éventuellement les horloges d'économie d'écriture, peut-être plus d'horloges qui sont gravées dans une lecture-modification-écriture (si déjà en cache),

Il y a des exceptions même aujourd'hui à peu près tout cela, il y a peut-être des instructions ou des types d'accès dans certains systèmes qui sont adressables par bits, il y a des systèmes où l'adresse est en unités de quelque chose d'autre qu'un octet. Un octet n'était pas toujours 8 bits et peut-être qu'il y a des systèmes qui fonctionnent toujours (c'est vrai que nous utilisions octal et un octet 9 bits 18 ou 36 bits ont beaucoup de sens pour les programmeurs humains et les concepteurs de puces qui pensent octal, un 8 bits a beaucoup de sens pour les penseurs hexadécimaux).

Maintenant, l'ordinateur sur lequel vous lisez ceci, même si le bus de données pour ce contrôleur dram peut avoir une largeur de 32 ou 64 bits, le module dram lui-même est probablement composé de plusieurs parties de 8 bits de large, que vous pouvez facilement voir. S'il a 8 ou 9 puces d'un côté, il s'agit probablement d'un bus de 64 bits ou 72 bits (64 bits plus 8 bits de ECC) mis en œuvre avec des parties de 8 bits de large. Si vous avez 4 ou 5 puces d'un côté du module mais avez encore des tonnes de broches, alors c'est soit une largeur de 32 bits (peu probable de nos jours), soit 4 des puces ont une largeur de 16 bits et s'il y en a une 5ème, cela peut être de 16 bits de large et seulement 8 sont utilisés ou il s'agit d'une partie de 8 bits de large. Il existe également des parties de 32 bits de large, mais la largeur de 8 bits est la plus courante. Une pratique très courante qui remonte à loin.

Nous aurions besoin de savoir ce microcontrôleur. Puisque vous mentionnez 32 bits, il est très probable (sans informations détaillées, bien que nous ne puissions pas le dire) que la mémoire à l'intérieur de cette partie a une largeur de 32 bits, et que tous les accès à celle-ci ont une largeur de 32 bits. les instructions détermineraient probablement ce que le programme veut qui offre probablement un type d'accès 8 bits, 16 bits et 32 ​​bits, les plus petites en écriture nécessiteraient une lecture-modification-écriture quelque part, les lectures vous ignorent simplement les voies d'octets. Il en va de même pour le flash, bien que les écritures flash soient un autre sujet. Mais le flash interne a probablement une largeur de 32 bits et toutes les lectures sont en unités de 32 bits. Un flash externe cependant, c'est une autre histoire, très probablement ils ont un bit de large (spi ou i2c), bien que les parties spi puissent parfois prendre en charge 1, 2 ou 4 bits, mais une broche miso est la plus courante. En interne, ils sont organisés en unités d'octets, pourrait avoir une largeur de 8 bits ou 16 ou 32, ou qui sait, vous devez les déplacer et les adresser en unités d'octets. avec spi, vous pouvez déplacer n'importe où entre un octet et la mémoire entière en une seule transaction, dépend de la conception de la partie flash.


0

Vous pouvez également obtenir des processeurs 1 bit!

La largeur des données suivra la largeur du registre (accumulateur). il s'agit normalement de la «largeur du processeur» alors que le bus d'adresse peut être différent (généralement plus large), mais pourrait techniquement être plus étroit en fonction de l'utilisation.

8 est bien sûr une puissance de deux nombres. Nous avons une histoire à remercier pour l'utilisation omniprésente de 8 bits - et le coût / la capacité de la technologie. Pendant longtemps, 8 bits ont régné, une partie de la raison étant la largeur des bus et la difficulté de faire des registres (et RAM) de plus de 8 bits de large (aucun point dans les données 16 bits si vos registres sont tous 8 bits). 8 bits est plutôt astucieux et a beaucoup de sens dans Hex. 8 bits peuvent contenir votre alphabet, vos chiffres, vos caractères de dessin et de contrôle (ASCII), ou 0 à 255 ou + -127 L'accès à plus de 256 octets de données (bus d'adresse 8 bits) est facile avec la pagination, sélectionnez la page, puis l'octet par exemple 256 pages sur 256 vous amènent à 64 Ko (65536). Habituellement, la page zéro serait un bloc-notes car l'accès serait plus rapide car cela ne nécessiterait pas la définition de la page. Mon premier ordinateur avait 1k x 8bits de ram statique! (la RAM dynamique était moins chère, mais avait besoin de plus de matériel pour le rafraîchir). Avec quelques drapeaux (c, nc, z, nz), ajoutez, soustrayez, tournez à gauche et à droite, vous pouvez faire des calculs assez complexes sur une machine 8 bits. Vous n'avez pas besoin d'une unité arithmétique à virgule flottante! Pas super rapide, mais faisable! De nombreux premiers processeurs pouvaient être à une seule étape et utilisés avec une simple RAM statique, ce qui rendait le débogage très facile; en ajoutant des tampons octaux et des premières LED rouges, vous pouvez regarder les bus d'adresse et de données changer :)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.