Si un processeur 32 bits peut gérer environ 4 Gio de RAM (soit ) octets, pourquoi mon Arduino Mega 2560 possède-t-il 8 Ko de SRAM, si être un processeur 8 bits lui permet de gérer 256 bits seulement octets ( )? Ou est-ce que je lis mal la page suivante?
arduino
microcontroller
microprocessor
sdram
ZaqueoAlejandro
la source
la source
Réponses:
La plupart des processeurs 8 bits ont des bus d'adresse 16 bits leur permettant d'adresser 64 Ko, précisément parce que 256 octets ne suffisent vraiment pas à faire beaucoup! Cela signifie simplement qu'ils doivent charger deux octets au lieu d'un, chaque fois qu'ils ont besoin de charger une adresse. Légèrement plus lent mais tolérable compte tenu de leur taille.
(Et oui, il existe de nombreuses exceptions, principalement développées lorsque 64k est devenu trop petit, mais nous parlons de l'idée de base ici).
la source
Le bus d'adresse et le bus de données sont séparés de sorte qu'ils peuvent avoir des tailles différentes. Pour toutes les tailles de bus d'adresses spécifiques, il existe de nombreuses techniques pour adresser plus de mémoire que la largeur de bits du registre
La manière la plus courante consiste à augmenter la largeur du bus d'adresse
en utilisant plusieurs registres pour l'adresse
X
,Y
et desZ
données d' adressage des registres pour permettre un maximum de 64 Ko de RAM. Ceux à son tour , peut être jumelé avecRAMPX
,RAMPY
,RAMPZ
pour accéder à des adresses de RAM plus dans les versions encore plus grandes. Il a égalementSPH
pour les octets élevés du pointeur de pile en plus desSPL
variantes avec plus de 256 octets de RAM 1H
&L
,B
&C
,D
&E
qui peuvent être utilisées ensemble comme registre d'adresse 16 bitsen utilisant un seul grand registre spécial plus grand que la taille naturelle pour l'adressage
en utilisant un registre spécial pour la partie haute de l'adresse . Lors de l'adressage d'une certaine mémoire, par défaut, les 8 bits bas de l'adresse seront extraits du registre 8 bits immédiat ou 8 bits d'un microcontrôleur 8 bits, tandis que les bits hauts seront remplacés par la valeur de l'autre registre d'adresses.
call
ou de l'goto
instruction, 8 ou 9 bits bas de l'adresse sont indiqués par l'immédiat et le reste est extrait du compteur de programme actuel. Ainsi, accéder à tout ce qui n'est pas loin dans le segment actuel utilise seulement 1 instruction, tandis que les adresses supplémentaires auront besoin de 2 instructions (pour définir les bits hauts).PC
pendant le saut inconditionnel.Un autre moyen d'y parvenir est la banque de mémoire . C'est une méthode utile encore utilisée dans certaines architectures de nos jours. Dans ce modèle, la mémoire est divisée en plusieurs banques . Chaque fois, vous ne pouvez vous adresser qu'à une banque spécifique. Il existe souvent une banque mondiale ou une plage d'adresses qui sont toujours visibles à tout moment, mais pour les autres parties, vous devez changer de banque en cas de besoin.
Il existe également une technique pas tout à fait commune, mais on peut la trouver dans l' Intel 8051 . En tant que microcontrôleur avec une adresse de données 8 bits, il peut avoir au maximum 256 adresses. La moitié de l'espace (la partie haute) est utilisée pour les registres de fonctions spéciales ( SFR ), limitant la RAM réelle adressable à seulement 128 octets. Cependant, les fabricants modernes de la série 8051 ont trouvé un moyen intelligent de surmonter cela en séparant l'accès à la mémoire . L'adressage direct accède au SFR tandis que l' adressage indirect, bien que les registres accèdent à la partie haute de la RAM, ce qui signifie que vous avez maintenant 256 + 128 = 384 octets adressables.
1 https://en.wikipedia.org/wiki/Atmel_AVR_instruction_set#Memory_addressing_instructions
la source
Presque tous les processeurs 8 bits ont une certaine capacité à former une adresse 16 bits à partir d'une partie d'ordre faible et d'une partie d'ordre élevé. Sur certains processeurs, y compris le 8080 d'origine, il existe des registres dédiés à la conservation des parties supérieure et inférieure d'une adresse (bien que du point de vue du programmeur, il puisse y avoir certains registres comme le pointeur de pile du 8080 qui n'offrent pas d'instructions pour les traiter séparément). Dans certains autres processeurs, il n'y a pas de registres dédiés à la moitié supérieure ou inférieure d'une adresse, mais les adresses sont assemblées "à la volée". Par exemple, sur le 6502, l'instruction "LDA $ 1234, X" charge l'accumulateur avec l'adresse formée en ajoutant $ 1234 au registre X 8 bits [supposons qu'il contienne $ F0]. L'exécution de cette instruction se déroulerait en 4 ou 5 étapes:
Le transfert de l'octet de lecture vers l'accumulateur chevauchera la récupération de l'instruction suivante. De plus, pour de nombreuses opérations, si l'étape 3 n'a pas généré de report, l'étape 4 aurait lu l'adresse correcte et l'exécution pourrait passer directement de l'étape 4 à l'instruction suivante, en contournant l'étape 5.
Si l'on examine la séquence des opérations, on remarquera qu'une architecture little-endian a un avantage certain sur une grande-endian, dans la mesure où dans la plupart des cas (bien que ce ne soit pas celui illustré), même si l'ALU prend un cycle pour effectuer De plus, il est possible de lire un octet à partir de l'adresse calculée sans attendre le résultat ALU, car normalement l'octet haut qui a été récupéré sera l'octet haut de l'opérande cible. Sur une machine big-endian avec une ALU 8 bits, une charge indexée prendrait au moins 5 cycles (puisque la moitié inférieure de l'adresse ne serait pas lue avant l'étape 3, et serait donc calculée à l'étape 4).
la source
Les lignes de bus de données (broches) et les lignes d'adresse (broches) sont complètement séparées. En termes simples, les lignes de bus de données déterminent le nombre maximum de bits qui peuvent être transférés un à la fois (et stockés dans la mémoire) tandis que les lignes d'adresse déterminent le nombre maximum de "cellules" de mémoire qui peuvent être sélectionnées.
C'était principalement une chose marketing que les processeurs x86 32 bits ne pouvaient pas gérer plus de 4 Go de RAM. Je me souviens quelque part qu'il y avait des broches A33-34 sur les processeurs Pentium 4.
la source
Il est souvent vrai qu'il existe une relation entre la taille de la mémoire adressable et la taille du registre interne, bien que la relation varie pour différentes raisons. 256 octets d'espace d'adressage étaient considérés comme trop petits, même au tout début des microprocesseurs, de sorte que la plupart des processeurs à huit bits produisaient des adresses à 16 bits (deux octets), qui adressaient 64 kilo-octets. Cependant, avec le changement de banque (essentiellement en utilisant certaines lignes d'E / S pour produire encore plus de lignes d'adresse), il était possible d'en avoir beaucoup plus.
Dans les premiers processeurs 16 et 32 bits, il n'y avait pas toujours assez de broches sur le périphérique pour atteindre tout l'espace que leurs registres d'adresses internes pouvaient traiter. Par exemple, sur le Motorola 68000, il n'y avait que suffisamment de broches d'adresse (24) pour adresser 16 mégaoctets de RAM, bien que les registres d'adresses internes aient une largeur de 32 bits.
la source
Je répondrai à cette question spécifiquement pour les contrôleurs AVR que vous avez mentionnés. Le principe de base est également valable pour de nombreuses autres architectures 8 bits.
Les AVR sont des cœurs 8 bits. Cela signifie qu'ils ont des registres 8 bits. Cependant, 8 bits ne suffisent pas pour accéder à une quantité de mémoire utilisable. Par conséquent, le noyau AVR est capable d'utiliser un ensemble spécifique de registres combinés en tant que registres de pointeurs 16 bits. Les registres r30 et r31 (également alias ZL et ZH) en sont un exemple. Ensemble, ils forment le pointeur Z.
Dans l'assembly, la lecture d'un octet à l'adresse 0x1234 ressemblerait à ceci:
La famille AVR dispose de 3 paires de registres qui peuvent être utilisées à cet effet. Ils sont spécifiquement conçus en matériel pour permettre de telles opérations.
Lors de la programmation dans un langage de niveau supérieur comme C, le compilateur gère ce genre de choses.
Remarque: Certains AVR prennent même en charge des tailles de mémoire supérieures à 64 Ko. Ces contrôleurs ont un registre de fonctions spéciales dans lequel des bits supplémentaires de l'adresse sont écrits avant l'accès. L'adresse est donc constituée des bits suivants (MSB à LSB):
Registre de fonctions spéciales (généralement 1 octet), ZH (8 bits), ZL (8 bits).
la source
Les AVR 8 bits d'Atmel utilisent en fait une adresse de données 16 bits. Ils ont de nombreux autres registres 16 bits et même quelques temporisateurs 16 bits. Comme il ne s'agit que d'un processeur 8 bits, il utilise généralement deux cycles d'horloge pour charger un registre 16 bits.
la source
Wikipédia explique assez bien:
la source
La notion selon laquelle la "largeur de bit" d'un processeur établit la quantité maximale de RAM que le processeur peut traiter est l'un des mythes les plus répandus en informatique. En fait, l'histoire de l'industrie est jonchée de processeurs pour lesquels cette relation ne tenait pas.
HP 21MX, HP 1000: CPU 16 bits, mémoire jusqu'à 16 Mo
PDP-11: CPU 16 bits, mémoire jusqu'à 4 Mo
VAX-11/780: CPU 32 bits, mémoire jusqu'à 512 Mo
etc.
la source