8 bit işlemci 256 bayttan fazla RAM'i nasıl destekleyebilir?


14

Bir ise 32 bitlik işlemci RAM yaklaşık 4 GiB kolu (yani ) bayt, yapar neden benim Arduino Mega 2560 SRAM 8 KiB sahip bir olma durumunda 8 bitlik işlemcisi izin verdiği sadece 256 bayt ( ) işlemek ? Yoksa aşağıdaki sayfayı yanlış mı okuyorum?232=42949672962 828

http://www.atmel.com/devices/atmega2560.aspx?tab=parameters


5
Kesinlikle herhangi bir turing-tamamlanmış makine, yeterli zaman verildiğinde hemen hemen her boyutta koça hitap edebilmektedir.
John U

2
Aslında bir işlemci adındaki bit sayısı yalnızca dahili veri genişliğinin yukarıdan tahmin edilmesi için kullanılabilir. 8088, 16 bit kayıtları nedeniyle 16 bit işlemcidir, ancak 8 bit veri yolu ve 20 bit adres veriyoluna sahiptir. 68000, 32 bit kayıtları nedeniyle çoğunlukla 16/32 bit olarak adlandırılan 32 bit işlemcidir, ancak 16 bit veri yolu ve 24 bit adres veriyoluna sahiptir. Küçük ARM uygulamaları 32 bit işlemcilerdir (32 bit kayıtlar ve veri yolu), ancak adresler için 32 bit kullanıyor olsalar da toplam 4 GB'ı adresleyemezler.
busybee

Bu birimler için doğru SI öneklerini ekledim. gibi (Gi) ve kibi (Ki) 'dir. 2 10230210
Elliot Alderson

Birçok 8 bitters (özellikle Motorola türevleri) sözde desteklemek söz It değerinde sıfır sayfasını biraz daha hızlı bellek haritası ilk 256 adreslenebilir bayt işlemek için komut kümesi destek oldu. Bu nedenle, zaman açısından kritik öneme sahip donanım kayıtları vb. Bu performans nedeniyle ilk 256 bayta eşleştirilir. Bu nedenle, birçok mimaride sıfır adresinden eşlenen donanım kayıtlarını bulmanızın nedeni budur.
Lundin

bir şeyi 8 bit, 16 bit, 32 bit vb. olarak adlandırmak bir pazarlama terimi diyelim, mühendisler bunu kullanmak için ama bu işlemcideki her şeyin o kadar geniş olduğu anlamına gelmediğini anlıyorlar. Bazı insanlar talimatın boyutunu kullanır, genellikle genel amaçlı kayıtların boyutu, bazen de otobüs kullanılır. talimatlara her zaman erişilemeyen veya kullanılamayan program sayacına sahipsiniz, böylece istedikleri kadar geniş olabilirler. AVR tipi işlemcilerin çoğunda olduğu gibi, veri işlemleri için daha geniş bir yükleme / depolama adresi almak için çoklu kayıt veya sayfalama şeması veya her ikisi de vardır.
old_timer

Yanıtlar:


19

Çoğu 8 bit CPU, 64kbayta hitap etmelerine izin veren 16 bit adres veriyollarına sahiptir, çünkü 256 bayt gerçekten çok fazla yapmak için yeterli değildir! Bu, her adres yüklemeleri gerektiğinde bir yerine iki bayt yüklemeleri gerektiği anlamına gelir. Biraz daha yavaş ama boyutları göz önüne alındığında tolere edilebilir.

(Ve evet, çoğu 64k çok küçük olduğunda geliştirilen birçok istisna vardır, ancak burada temel fikirden bahsediyoruz).


Aslında karşılaştığım 8-bit mikrodenetleyicilerin çoğunun 16-bit adresi yok
phuclv

@Brian Drummond Am I right: Denetleyici önce alt 8 bit, üst 8 bit yazacak ve sonra adres veriyolunu kilitleyecektir. 16bit adres veriyoluna bu şekilde erişecek!
Swanand

Ya da üst 8 bit daha sonra 8 bit daha düşük, ama temel olarak evet, fikir bu.
Brian Drummond

7

Adres yolu ve veri yolu farklı boyutlarına sahip olabilir, böylece ayrılır. Belirli bir adres veri yolu boyutları için, kayıt bit genişliğinden daha fazla belleğe yönelik birçok teknik vardır.

  • En yaygın yol, adres veri yolu genişliğini bir şekilde arttırmaktır.

    • adres için birden fazla kayıt kullanma

      • AVR 16-bit içine eşlenebilir R26..R31 sahiptir X, Yve ZRAM maksimum 64KB izin vermek için kayıtları ele verileri. Sırayla olanlar ile eşleştirilmiş olabilir RAMPX, RAMPY, RAMPZdaha da büyük sürümlerinde yüksek RAM adreslerine erişmeye. Ayrıca 256 bayt RAM fazla varyantlarına SPHek olarak yığın işaretçisinin yüksek bayt için var 1SPL
      • Intel 8080 ve Zilog Z80 8 bit işlemciler, ancak gibi yazmaç çiftleri vardır Hve L, Bve C, Dve Ebu bir 16 bitlik adres kayıt olarak birlikte kullanılabilir
    • adresleme için doğal boyuttan daha büyük tek bir büyük özel kayıt kullanmak

      • Intel 8051 , 8 bitlik bir mikro denetleyicidir, yani 8 bitlik veri adresine sahiptir. Ancak 16 bitlik komut adresi kullanır ve 2 adet 16 bitlik kayıt içerir: komut alanında adresleme için PC ve DPTR.
      • AVR'nin 16 veya 22 bitlik bir PC kaydı vardır
    • adresin üst kısmı için özel bir kayıt kullanarak . Bir hafızayı ele alırken, varsayılan olarak 8 bitlik bir mikrodenetleyici üzerindeki 8 bitlik derhal veya 8 bitlik kayıttan adresin 8 düşük biti alınırken, yüksek bitlerin yerini diğer adres kaydedicisinin değeri alır.

      • Bunun özel bir durumu , 16 bit x86 tarafından kullanılan bölümlenmiş bellektir . Bu teknikte bellek 64 KB boyutunda (2 16 bayt) birden çok parçaya bölünmüştür . Normal erişim varsayılan olarak tek bir segmentin içindedir, böylece yakın veriler için 16 bit adres kullanabilirler . Daha da ayrı olan veriler spesifik olarak segment değeri ile ele alınmalıdır, bu nedenle uzak adresleme için 2 kayıt kullanılmalıdır.
      • PIC mikro Baz hattı ve orta düzey serisi, 13 ya da 14 bit adres olabilir, başka bir örnektir. Kullanırken callveya gototalimat kullanırken , adresin 8 veya 9 düşük biti hemen ile gösterilir ve geri kalanı geçerli program sayacından alınır. Bu nedenle, mevcut segmentin yakınında olmayan bir şeye erişmek için sadece 1 talimat kullanılırken, diğer adreslerin 2 talimatı (yüksek bitleri ayarlamak için) gerekir.
      • Başka bir örnek, koşulsuz olarak atlama sırasında alt 26 bitlik anlık adresi yüksek 6 bit ile birleştiren MIPS mimarisidir PC.
  • Bunu başarmanın bir başka yolu da bellek bankacılığıdır . Bu, günümüzde bazı mimarilerde hala kullanılmakta olan yararlı bir yöntemdir. Bu modelde, bellek birden fazla bankaya bölünmüştür . Her seferinde yalnızca belirli bir bankaya hitap edebilirsiniz. Genellikle her zaman her zaman görülebilen küresel bir banka veya adres aralığı vardır, ancak diğer parçalar için gerektiğinde bankayı değiştirmeniz gerekir.

    • Intel 8051 kayıtlar için bellek bankacılığı kullanır. 32 kaydı vardır, ancak aynı anda sadece 8 kaydı görülebilir.
    • x86 PAE ve ARM LPAE , daha küçük fiziksel adres alanına eşlenmiş daha büyük fiziksel adres alanı
    • Bunun için başka bir uygulama, 2 / 3GB'den fazla belleğe erişmek için 32 bit x86 uygulamaları tarafından PAE modunda kullanılabilen Windows'ta Adres Pencereleme Uzantılarıdır . Tam olarak mikrodenetleyicilerdeki bir bellek bankası gibi değil, ancak bu şekilde görülebilir, çünkü büyük adres aralığı uygulamanın adres alanına sığacak kadar küçük olan küçük pencereler / bankalar düşünülebilir. Uygulamanın bir pencerede veri kullanması gerekiyorsa, o pencereyi geçerli adres alanına eşler.
    • DOS ayrıca sınırlı adreslenebilir bellek aralığı nedeniyle genişletilmiş bellek veya genişletilmiş bellek gibi bazı banka anahtarlama türlerine sahiptir .
  • Oldukça yaygın olmayan bir teknik de var, ancak Intel 8051'de bulunabilir . 8 bit veri adresine sahip bir mikrodenetleyici olarak en fazla 256 adrese sahip olabilir. Alanın yarısı (yüksek kısım) özel işlev kayıtları ( SFR ) için kullanılır ve gerçek RAM'i yalnızca 128 bayt ile sınırlar. Bununla birlikte, modern 8051 serisi üreticileri, bellek erişimini ayırarak bunun üstesinden gelmek için akıllı bir yol buldular . Doğrudan adresleme SFR'ye dolaylı adresleme yaparken erişir, ancak kayıtlar RAM'in yüksek kısmına erişir, yani 256 + 128 = 384 adreslenebilir baytınız vardır.


1 https://en.wikipedia.org/wiki/Atmel_AVR_instruction_set#Memory_addressing_instructions

En küçük çekirdekler ≤256 bayt veri adresi alanına sahiptir (G / Ç bağlantı noktaları ve diğer ayrılmış adresler kaldırıldıktan sonra ≤128 bayt RAM) ve ROM8192 bayt (8 KiB) program ROM'udur. Bunlar yalnızca 8 bit yığın işaretçisine (SPL'de) sahiptir ve yalnızca 12 bit göreli atlama / arama talimatlarını RJMP / RCALL destekler. (AVR program sayacı bayt değil 16 bit sözcük saydığından, 21 bit bayt ROM'u ele almak için 12 bitlik bir ofset yeterlidir.)

Kullanılabilir kaynaklara erişmek için gerektiği gibi ek bellek adresleme özellikleri mevcuttur:

  1. 256 bayttan fazla veri adresi alanı (≥256 bayt RAM) olan modellerde 16 bitlik yığın işaretçisi bulunur ve yüksek yarısı SPH kaydındadır.
  2. > 8 KiB ROM'a sahip modeller 2 kelimeli (22 bit) JUMP ve CALL talimatlarını ekler. (Bazı eski modeller atlama talimatını 2 kelimelik bir talimat izliyorsa erratumdan muzdariptir.)
  3. > 64 KiB ROM'a sahip modeller ELPM talimatını ve karşılık gelen RAMPZ kaydını ekler. LPM talimatları ROM adresini Z olarak sıfırlar; ELPM talimatları yüksek bitler için RAMPZ kaydının önüne geçer. Bu daha genel LPM talimatı ile aynı şey değildir; sadece ELPM'nin sıfır işlenen biçimine (ATmega103 ve at43usb320) sahip "klasik" modeller vardır. Otomatik artış mevcut olduğunda (çoğu model), RAMPZ dahil 24 bit adresin tamamını günceller.
  4. > 128 KiB ROM'a sahip (Nadir) modellerde 3 baytlık program sayacı vardır. Altyordam çağrıları ve iadeleri ek bir yığın bayt alanı kullanır, bağımsız atlama ve çağrılar için ek yüksek bitler sağlamak için yeni bir EIND kaydı vardır ve hedef adres olarak EIND: Z kullanan yeni genişletilmiş talimatlar EIJMP ve EICALL vardır. (Önceki IJMP ve ICALL talimatları sıfır genişletilmiş Z kullanır.)
  5. > 64 KiB RAM adres alanına sahip (Nadir) modeller, RAMPX, RAMPY, RAMPZ ve RAMPD kayıtlarıyla 16 bit RAM adresleme sınırlarını uzatır. Bunlar sırasıyla X, Y veya Z kayıt çiftlerini kullanan adresleme modları veya doğrudan adresleme talimatları LDS / STS için ek yüksek bitler sağlar. ROM erişiminden farklı olarak, belirgin bir "genişletilmiş" talimat yoktur; bunun yerine RAMP kayıtları koşulsuz kullanılır.

6

Hemen hemen tüm 8 bit işlemciler, düşük sıralı bir parçadan ve yüksek sıralı bir parçadan 16 bitlik bir adres oluşturma yeteneğine sahiptir. Orijinal 8080 dahil olmak üzere bazı işlemcilerde, bir adresin üst ve alt kısmını tutmaya adanmış kayıtlar vardır (bir programcının bakış açısından, 8080'in yığın işaretçisi gibi, bunları ayrı olarak ele almak için talimatlar sunmayan bazı kayıtlar olabilir). Diğer bazı işlemcilerde, bir adresin üst veya alt yarısına ayrılmış kayıtlar yoktur, ancak adresler "anında" birleştirilir. Örneğin, 6502'de "LDA $ 1234, X" talimatı, akümülatöre 8 bitlik X kaydına 1234 $ ekleyerek oluşturulan adresle birlikte yükler [varsayalım $ F0 içerir]. Bu talimatın yürütülmesi 4 veya 5 adımda gerçekleşir:

  1. Önceki talimatlardan (varsa) kayıt yazma işlemini tamamlayın ve opcode'u yükleyin ($ BD)
  2. Kod çözme talimatı sırasında opcode (34 $) sonrasında ilk işlenen baytını getir
  3. X kaydına önceden getirilmiş bayt eklenirken ikinci işlenen baytını (12 $) getir
  4. İkinci işlenen baytını ALU sonucuna [yani 1224 $] birleştirerek oluşturulan adreste belleği okuyun. Önceki eklemenin bir taşıma oluşturup oluşturmadığına bağlı olarak sıfır veya bir eklemek için ikinci işlenen baytını ALU'ya besleyin
  5. Üst yarıyı ALU sonucuyla değiştirerek oluşturulan adreste belleği okuyun [$ 1334]

Okuma baytının akümülatöre aktarılması, bir sonraki talimatın getirilmesiyle çakışacaktır. Ek olarak, birçok işlem için, eğer 3. adım bir taşıma üretmediyse, 4. adım doğru adresi okuyacaktır ve yürütme, 5. adımı atlayarak doğrudan 4. adımdan bir sonraki talimata atlayabilir.

Biri işlem sırasını incelerse, küçük endian mimarisinin büyük endian mimarisine göre kesin bir avantajı olduğunu fark edeceksiniz, bu da ALU'nun gerçekleştirilmesi için bir döngü almasına rağmen, çoğu durumda (gösterilende olmasa da) ek olarak, ALU sonucunu beklemeden hesaplanan adresten bir bayt okumak mümkündür, çünkü normalde getirilen yüksek bayt hedef işlenenin yüksek baytı olacaktır. 8-bit ALU'lu büyük-endian bir makinede, indeksli bir yük en az 5 döngü alacaktır (çünkü adresin alt yarısı 3. adıma kadar okunmayacaktır ve bu nedenle 4. adımda hesaplanacaktır).


8 bit işlemcili ve 1 megabayt belleğe sahip bilgisayarlar için bazı reklamlar gördüğümü hatırlıyorum. Bu, tüm adresi oluşturmak için CPU üzerinde iki 8 bit kayıt ve CPU'da olmayan bir 8 bit kayıt kullanılarak yapıldı.
user6030

@ user6030: Bu tür şeyleri başarmanın birçok yolu vardır. Genellikle adres alanının bazı bölümleri "sabit", diğerleri ise banka tarafından seçilebilir. Bazı cihazlar programcılar için iyi çalışır; diğerleri değil, çok fazla değil.
supercat

6

Veri hattı hatları (pinler) ve adres hatları (pinler) tamamen ayrıdır. Basitçe ifade etmek gerekirse, veri tabanları satırları birer birer aktarılabilen (ve bellekte saklanabilen) maksimum bit sayısını belirlerken, adres satırları seçilebilecek maksimum bellek "hücresi" sayısını belirler.

Çoğunlukla 32 bit x86 işlemcilerin 4GB RAM'den fazlasını ele alamadığı bir pazarlama şeyiydi. Bir yerlerde Pentium 4 CPU'larda A33-34 pinlerinin olduğunu hatırlıyorum.


1
Haklısınız - PAE daha fazla RAM kullanımına izin verdi, ancak masaüstü Windows'ta bulunmadığı için hiç kimse bunu kullanmamıştı.
pjc50

264

x86 CPU'lar, işletim sisteminde diğer mimarilere bağlantı sağlamayan önemli komplikasyonlar olmadan 4GB'den fazla adres kullanamazlar.
Kaz

1
@Kaz ARM 32-bit, işletim sisteminin 32 bitten fazla adrese hitap etmesine izin veren LPAE adlı benzer bir özelliğe sahiptir
phuclv

3

Adreslenebilir bellek boyutu ile dahili kayıt boyutu arasında bir ilişki olduğu çoğu zaman doğrudur, ancak ilişki farklı nedenlerle değişir. 256 bayt adres alanı mikroişlemcilerin ilk günlerinde bile çok küçük kabul edildi, bu nedenle sekiz bitlik işlemcilerin çoğu 64 bitbaytlık adreslere sahip 16 bit (iki bayt) adresler üretti. Bununla birlikte, banka geçişi ile (esasen daha fazla adres satırı üretmek için belirli G / Ç hatlarını kullanmak), çok daha fazlasına sahip olmak mümkün oldu.

İlk 16 ve 32 bit işlemcilerde, cihazda her zaman dahili adres kayıtlarının ele alabileceği tüm alana erişmek için yeterli pin yoktu. Örneğin, Motorola 68000'de, dahili adres kayıtları 32 bit genişliğinde olmasına rağmen, 16 megabayt RAM'i adreslemek için yeterli adres pimi (24) vardı.


2

Bu soruyu özellikle bahsettiğiniz AVR kontrolörleri için cevaplayacağım. Temel ilke, diğer 8 bitlik mimariler için de geçerlidir.

AVR'ler 8 bit çekirdektir. Bu, 8 bitlik Kayıtlara sahip oldukları anlamına gelir. Bununla birlikte, 8 bit kullanılabilir bir belleğe erişmek için yeterli değildir. Bu nedenle, AVR çekirdeği 16 bit işaretçi kayıtları olarak birleştirilmiş belirli bir kayıt seti kullanabilir. R30 ve r31 kayıtları (ZL ve ZH olarak da adlandırılır) bunun bir örneğidir. Birlikte Z İşaretçisini oluştururlar.

Derlemede 0x1234 adresindeki bir bayt okunurken şöyle görünür:

ldi ZL, 0x34 ; Load r30 (ZL) with low byte of address
ldi ZH, 0x12 ; Load r31 (ZH) with high byte of address
ld r16, Z    ; Load byte to r16

AVR ailesi bunun için kullanılabilecek 3 kayıt çiftine sahiptir. Bu tür işlemlere izin vermek için özel olarak donanımda tasarlanmıştır.

C gibi daha yüksek bir dilde programlama yaparken, derleyici bunları işler.


Not: Bazı AVR'ler 64k'den daha büyük bellek boyutlarını bile destekler. Bu denetleyiciler, erişimden önce adresin ek bitlerinin yazıldığı özel bir işlev kaydına sahiptir. Bu nedenle adres aşağıdaki bitlerden (MSB - LSB) oluşur:

Özel fonksiyon kaydı (genellikle 1 bayt), ZH (8bit), ZL (8bit).


1

Atmel'in 8 bit AVR'ları aslında 16 bit veri adresi kullanıyor. Çok sayıda diğer 16 bit kayıt ve hatta bazı 16 bit zamanlayıcılar var. Sadece 8 bitlik bir işlemci olduğundan, 16 bitlik bir kayıt yüklemek için genellikle iki saat çevrimi kullanır.


1

Wikipedia bunu oldukça iyi açıklıyor:

Sekiz bitlik CPU'lar 8 bitlik bir veri yolu kullanır ve bu nedenle tek bir makine talimatında 8 bit veriye erişebilir. Adres veri yolu, pratik ve ekonomik hususlar nedeniyle tipik olarak çift sekizli genişliğindedir (yani 16 bit). Bu, çoğu 8 bit işlemcide yalnızca 64 KB'lik doğrudan adres alanı anlamına gelir.


1

Bir işlemcinin "bit genişliği" nin işlemcinin ele alabileceği maksimum RAM miktarını oluşturduğu fikri, hesaplamadaki en yaygın efsanelerden biridir. Aslında endüstri tarihi, bu ilişkinin sahip olmadığı CPU'larla doludur.

HP 21MX, HP 1000: 16 bit CPU, 16 MB'a kadar bellek

PDP-11: 16 bit CPU, 4 MB'a kadar bellek

VAX-11/780: 32 bit CPU, 512 MB'a kadar bellek

vs vs.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.