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?2 8
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?2 8
Yanıtlar:
Ç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).
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
X
, Y
ve Z
RAM maksimum 64KB izin vermek için kayıtları ele verileri. Sırayla olanlar ile eşleştirilmiş olabilir RAMPX
, RAMPY
, RAMPZ
daha da büyük sürümlerinde yüksek RAM adreslerine erişmeye. Ayrıca 256 bayt RAM fazla varyantlarına SPH
ek olarak yığın işaretçisinin yüksek bayt için var 1SPL
H
ve L
, B
ve C
, D
ve E
bu bir 16 bitlik adres kayıt olarak birlikte kullanılabiliradresleme için doğal boyuttan daha büyük tek bir büyük özel kayıt kullanmak
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.
call
veya goto
talimat 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.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.
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:
- 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.
- > 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.)
- > 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.
- > 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.)
- > 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.
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:
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).
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.
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ı.
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).
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.
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.
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.