Mikro denetleyicideki her adres neden yalnızca 8 bit boyutundadır?


18

32-bit mikrodenetleyicide, her bir bellek adresinin sadece 8 bit veri içerdiğini gördüm; 16 bit MC için de aynı. 32 bit veri için 4 adreslik bir kombinasyon kullanır. Bir adres neden 32 bit veriyi doğrudan tutmak için yapılmadı (8 yerine 32 bit veya 16 bit).


2
Mikrodenetleyicinin Veri Veriyoluna bağlıdır. Hangi 32 bit mikrodenetleyicinin bayt belleği vardır? Herhangi bir örneğin var mı?
Swanand

4
Doğru değil, bu yüzden C ve C ++ gibi programlama dillerinin bir baytın 8 bit'ten büyük olma olasılığını içermesinin nedeni budur. Sadece çoğunluk 8 bit bayt ile en iyi şekilde çalışır, ancak 9bit veya 18bit orada.
PlazmaHH

6
Şeker çubukları gibi. Onları aynı fiyata küçültüyorlar.
Olin Lathrop

4
Bu soru "Tüm adresler neden 8 bite hizalanmıştır?" Şeklinde yeniden ifade edilebilir mi?
Florian Castellane

2
@FlorianCastellane Bu. Adreslerin boyutu 8 bit değildir (<256 bit belleğe sahip bir cihaz bulamazsanız, bunlar olabilir).
jayjay

Yanıtlar:


11

Bu etkili bir tasarım seçimidir, böyle olması zor bir neden değildir. Eski günlerde, yüksek hacimli emtia işlemcilerinin 8 bit değerlerde çalıştığı zaman, haritalama daha tutarlı bir şekilde 1: 1 idi. Tasarımlar modern 32 ve 64 bit işlemcilere dönüşürken tutarlılık için, veri yolları artmış olsa bile (değişen bir uygulama maliyeti değiş tokuşu ile) bayt adreslemenin eski eşlemesini korumak mantıklıydı. Bazı 32 bit MCU'lar yine de bazı belleğe sadece 16 bit veri veriyolları uygulayabilir, üst düzey işlemciler 256 bit veya daha yüksek olacaktır ve tek bir bellek işleminde birden fazla çekirdek kaydı yükleyebilir. Geniş arayüzler patlama veya akış işlemleri için iyidir.

Küçük adreslenebilir bellek boyutu yalnızca koddaki bayt değerlerinin işlenmesi durumunda değil, belirli baytların okunması veya değiştirilmesi gereken ethernet paketleri gibi bellekteki yapılarla çalışmak için de yararlıdır. Genellikle bu tür bir operasyonun küçük operasyonları gerçekleştirebilmesi gerekir, ancak çok verimli bir şekilde.

Ayrıca, büyük endian, küçük endian veya karışık endian verileriyle çalışmanın gerekli olduğu senaryolar da vardır. Şimdi bunun için genellikle özel donanım desteği var, ancak yine de, belleğin bayt adreslemesi bu tür işlemleri bazı senaryolarda daha verimli hale getirecektir.

Bir kayıttaki adres bitlerinin sayısının adres alanı için sınırlayıcı bir faktör olduğu oldukça yakındır, bu nedenle 32 bit sözcüklerden ziyade 32 bit sözcük yerine baytları adreslemek için 2 bit harcamak 10-15 yıl önce çok endişe verici olmazdı (ve şimdi 64 bit işaretçilerle, 48 veya 56 bit genişliğinde bayt adreslerini uygulamak yaygındır). Giriş Bilgisayar bilimi öğretimi, henüz ana bilgisayar çağında hala biraz sıkışmış durumda ve evrim yönlerini her zaman çok net bir şekilde ele almıyor. Düşük hacimli, yüksek maliyetli mimarilerin (en genel anlamda), daha fazla kaynak kısıtlamalı ve daha fazla meta odaklı işlemci tasarımlarıyla tamamlanmaya başladığı birçok terminoloji kullanıma girdi (ve tanımlandı).

MCU'lara özel cevap vermedim, mimari sınırlar tahmin edebileceğiniz kadar net değil. Modern bir topraklama MCU tasarımı bile çok çekirdekli bir sunucu işlemcisi ile entegre olma şansına sahiptir veya ölçeklenebilir bir ürün setinde sadece bir nokta olarak mevcuttur; her iki şekilde de belleğe erişmeye yönelik tutarlı bir yaklaşım, kod yazması gereken son kullanıcı veya port için faydalıdır.

Retrocomputing SE hakkında bu sorunun tarihsel yönlerini takip etmek için kayıt boyutları hakkında bir soru sordum .


2
Bence daha uzun kelime boyutlarına sahip işlemciler 8-bit işlemcilerin önüne geçmişti. 8 bit işlemci, iki çok baytlık sayı eklemenin verimli bir yolu olmadan oldukça işe yaramazdı ve erken işlemciler, tek bir makine sözcüğünden daha büyük sayıları verimli bir şekilde işleyemedi.
supercat

1
Çok baytlı sayıları kolayca ekleyebileceklerini bilecek kadar 8 bit işlemcilerle çalıştım, ancak tek bir CPU komutuyla değil. İlk olarak, en düşük iki baytı ekleyin ve en düşük sonuç baytını ve ayrı bir taşıma bitini alın. Diğer birçok bayt olduğu için, bir sonraki çıkış baytını ve bir sonraki taşıma bitini vererek bir sonraki adımdan sonraki giriş baytlarını ve taşıma bitini ekleyin. Hiçbir girdi baytı kalmadığında, son taşıma bitini bir çıkış baytına dönüştürün.
user6030

@ user6030: ADC talimatı olması yaygın değil mi? AVR yapar (8 bitlik bir RISC mikrodenetleyici, gcc'nin ADC'yi intve için kullanması gerekirlong ), x86 ve ARM de yapar. Çoğu 8-bit CPU'ların olacağını düşünüyorum, çünkü daha geniş regs'lere sahip bir sistemden daha fazla talep olurdu. Supercat, erken işlemcilerin etkin bir ADC'den yoksun olduğunu mu söylüyor?
Peter Cordes

Ben onun kayıt boyutu evrimi ile ilgili geçerli bir nokta olduğunu düşünüyorum (veri eksik olmasına rağmen)
Sean Houlihane

25

16 bit'ten küçük değerleri ele alamayan birkaç DSP (örn., TI C54x) vardır ve bazı ses DSP'leri 24 bit kullanır. Bununla birlikte, 8 bit değerler hemen hemen tüm genel amaçlı kodlarda kullanılır, bu nedenle tüm genel amaçlı CPU'lar bunu destekler.

Ve sadece bellek adresleri için kullanılan küçük birimin 8 bit bayt olması, bunun aslında veriyolunda kullanılan en büyük birim olacağı anlamına gelmez ; çoğu CPU, belleğe hitap etmek için kendi yerel kelime boyutlarını (16/32 bit) veya daha büyük bir boyutu kullanır ve bayt erişimini kullanırken, baytı otomatik olarak daha büyük kelimeden çıkartır.

Örneğin, PCI veri yolu her zaman 32 bit işlemler kullanır, ancak erişim için daha küçük olması gereken bayt etkinleştirme sinyallerine sahiptir .


Teşekkür ederim. bellekte bayt yerine kırıntı genişliğinde herhangi bir MC var mı?
Arun Joe Cheriyan

4
Belki Intel 4004?
pjc50

6
@ArunCheriyan Adreslenebilir en küçük kelime olarak nibbles ile çalışan bir CPU örneği, Satürn'dür : HP tarafından tasarlanmış ve son yüzyılda üst düzey hesap makinelerinde (özellikle tanınmış HP48) kullanılan bir CPU. Çok sıradışı bir mimariye sahipti (64 bit kayıtlar, 4 bit ALU, 20 bit adresler, ...).
loş

Başka bir örnek: TI'nin TMS320C3x için adreslenebilir en küçük birim 32 bittir.
kkrambo

1
@davidcary Oh, şey ... Tarihler ve zaman zaten benim güçlü takımım olmadı zaten. Eşime doğum günü hediyelerini ve patronuma son teslim tarihlerini sor ...
dim

18

16 bitlik veya 32 bitlik bir mikro denetleyicinin genellikle yalnızca 8 bit genişliğindeki (bayt) verileri işlemesi gerekir. Örneğin, metin dizeleri genellikle bayt başına tek bir karakterle depolanır. Her bir baytın ele alınmasını sağlayan bir bellek adresleme şemasına sahip olarak, mikrodenetleyici 8-bit genişlikteki verileri verimli bir şekilde işleyebilir. Bunun anlamı, 32 bit veri genellikle 4 baytın katları olan adreslerde bulunur, örneğin 04, 08, 0C, vb. Ancak bellek 32 bit genişliğinde ise, mikro denetleyici bir okuma döngüsünde 32 bit okuyabilir . Micro'ların genellikle farklı uzunluk verileri üzerinde çalışabilen makine talimatları vardır, bu nedenle bir hareket veri komutunun (MOV) 8, 16 ve 32 bit hareket etmek için 3 form, MOV.B, MOV.W ve MOV.L olabileceğini göreceksiniz. tek bir komutta veri.


7

Temel cevap "çünkü bir baytın uzunluğu budur". Bu varsayımı yapan geniş bir kod gövdesi ile, onu kırmak her türlü soruna neden olacaktır.

İlk günlerde, yerleşik bir kod gövdesi yoktu. İşlemciler, diğer yanıtlarda gösterildiği gibi, her türlü garip mimariyi sık sık kullanırlardı. 16-bit işlemciler ortaya çıktıkça, 8-bit verilerin kullanılabilirliğini varsayarak bunu kolaylaştıramayan benimsemenin gerçek bir engeli olurdu yeterli kod vardı.

Adres başına 32 bit sözcük olması bellek hızında herhangi bir dezavantaj sağlamaz. 32 bit sistemde, daha düşük 2 adres biti genellikle belleğe gitmez. İşlemci genellikle 32 bitlik tüm sözcüğü okuyacak ve söz konusu sözcük içinde ihtiyaç duyduğu 8 bitlik baytı seçecektir (veya maskeleyecektir). Adres alanınız yeterli veri depolayabildiği sürece (32 bit sistemle 2 ^ 32 bayt ile sınırlı) endişelenmeyin. Aslında, birçok 16 bit / 32 bit işlemcide bayt değerleriyle işlem yapmak yerel kelime uzunluğu değerlerinden daha uzun sürer - 32 bitlik bir kelime okumak ve bu sözcüğün bir kısmını atmak fazladan bir işlem gerektirir, sadece 32 bit kelimeyi okumakla karşılaştırıldı.

Tersine, belleği verimli bir şekilde kullanmanız gereken bir sisteminiz varsa , ayrı ayrı baytlara erişebilmeniz gerekir. Eğer yapamazsan, hafızanı tükenecek. Bunu göz önünde bulundurarak, bireysel baytlara başvurabilmek açıkça gereklidir, bu nedenle belleğinizin bayt olarak parçalanması mantıklıdır.


3
Aslında. Ve sonra bir işlemcinin, hizalanmamış 32 bit değerini otomatik olarak donanıma yüklemek veya depolamak için gereken iki ayrı erişimi işleyip işleyemeyeceği veya bunun yazılımda açıkça işlenmesi gerekip gerekmediği konusunda ek soru var .
Chris Stratton

5

Buna bayt adreslenebilir belleğe sahip denir . Adres alanınız bitmediği sürece normalde iyi bir şeydir (örneğin, her adresin ayrı bir 32 bit sözcük olduğu 32 bit işaretçilerle 16 GB yerine 32 bit işaretçilerle 4 GB).


Adresleri, her biri tek bir kayda sığacak parçalara ayırırsanız, adres alanının bu tür sınırları aşabileceğini unutmayın. Bir keresinde adresleri ayrı kayıtlarda tutulan iki parçaya bölerek 64 KB belleğe ulaşan 8 bitlik bilgisayarlarım vardı ve adresleri üçe bölerek 1 MB belleğe erişebilen 8 bit işlemcili bilgisayarlar için de reklam gördüm parçalar.
user6030

AVR (8 bitlik RISC mikrodenetleyici) bunu yapar: 32 genel amaçlı 8 bitlik kayıtların üç çifti 16 bitlik bir işaretçi olarak silinebilir. 24 bit adresler elde etmek için bunu başka bir 8 bitlik segmentle birleştirmek için bazı tesisler de var.
Peter Cordes

4

Analog Devices Shark 32 bit DSP'lerin adreslenebilir belleğin en küçük birimi olarak 32 biti vardır, bu nedenle sizeof (int) == sizeof (kısa) == sizeof (char) == 1 (Evet, 32 bit karakterleri vardır, C standardı).

Ayrıca int_8, int_16 ve benzeri gibi şeyler tanımlanmadı, diğer platformlardan kod taşırken kötü bir sürpriz.


1

Adreslenebilir bellek biriminin boyutu, aslında ne kadar bellek ayırabileceğiniz ile ne kadar bellek harcayacağınız arasında bir uzlaşmadır.

Adreslenebilir bellek . 32 bit CPU'yu düşünün: baytlara hitap ediyorsanız, 4GB'a kadar belleği adresleyebilirsiniz. Tek tek bitlere hitap ederseniz, bu miktar 512 MB'a düşürülür ve 32 bitlik kelimelere hitap ederseniz 16 GB'ınız olur. (sorunuz ikinci soruyu gösteriyor gibi görünüyor).

Boşa giden bellek . X bitleri ile temsil edilebilecek bir değişkeniniz varsa ve bunun için yalnızca N bit birimleri tahsis edebiliyorsanız, X> N farzederek ortalama (N-1) / 2 bit harcarsınız. , belleği% 100 verimlilikle kullanacaksınız (en azından adresleme açısından). Bayt ile, değişken başına 3,5 bit (% 56 verimlilik) israf edersiniz ve 32 bit kelimelerle 15,5 bit (% 52 verimlilik) israf edersiniz. Ama daha da kötüleşiyor: Değişkenlerinizin çoğu küçükse (karakterleri, booleanları, durum bayraklarını düşünün), adreslenebilir birimleriniz çok büyükse belleğin çoğunu boşa harcarsınız.

Örneğin, bir değişkenin ortalama boyutunun 8 bit olduğunu varsayalım.

  • biraz adreslenebilir bir bilgisayarda,% 100 verimlilikle tahsis edebileceksiniz, bu da size 512*1024*1024*100%= 0.54 milyar değişken verecektir .
  • bayt adresli bir bilgisayarda,% 56 verimlilikle tahsis edersiniz, bu size 4096*1024*1024*56%= 2,4 milyar değişken verir. Bu, adreslenebilir bir bilgisayara kıyasla neredeyse 5 kat daha fazla! Tabii ki, 8 kat daha fazla bellek satın almanız gerekecek.
  • 32 bit adreslenebilir bir bilgisayarda, değişkenlerinizin en az yarısı 8 bit'ten daha az yer kaplayacağından,% 7'nin altında verimlilikle tahsis edilecektir (32'den 4,5 bit kullanılarak). Her durumda, 4.3 milyardan fazla değişken elde edemezsiniz (çünkü yalnızca bu kadar çok farklı adrese sahipsiniz) ve gerçekte bundan daha az. Karmaşık hesaplamalardan kaçınarak, RAM'in fiyatının 4 katını ödeyerek bayt adresli bilgisayara kıyasla belki de% 20-30 daha yararlı depolama alanı elde edeceğimizi tahmin ediyorum.

1

Muhtemelen diğer cevaplarda zaten çeşitli yollar söyledi. Genel olarak bugün, ancak zorunlu olarak tarihsel olarak değil, bir bayt 8 bittir. Çoğu zaman "byte adreslenebilir bellek" ile uğraştığımız anlamına gelir, yani tek bir adresle erişebileceğimiz en küçük şey bir bayttır. Ancak bu, ele alabileceğimiz tek şey olduğu anlamına gelmez. Platforma bağlı olarak, bir bayta, bir yarım kelimeye / kelimeye (16 bit), bir kelimeye / çift kelimeye (32 bit) ve buna benzer şekilde 64 bit'e erişmek için tek bir adres kullanılabilir. Talimat temel olarak genellikle 8, 16, 32, 64 ünitelerinde istenen erişimin büyüklüğünün (8,16,32,64, vb.) Ne olduğunu belirler. Ancak bu zor ve hızlı değildir, "duruma bağlıdır".

Ayrıca, işlemcinin ve / veya sistemin tasarımına bağlı olarak, erişimin boyutunun belleğin boyutu veya en küçük erişimin boyutu olduğunu varsaymak için hiçbir neden yoktur. Daha büyük ve daha büyük gereksinimlerle, zaman içinde gerçekte en küçük boyutu kullanarak bellek sistemini uygulamak daha az mantıklıdır, bunu okuduğunuz bilgisayar muhtemelen tüm erişimler için 32 bit genişliğinde veri yolu veya 64 bit genişliğinde veri yolu kullanır, bir bayt okumak istiyor, 64 bit okuma yapıyor ve bitlerin geri kalanını fırlatıyor, neden ekstra bir şeye mal olmuyor, otobüsü işlemci çekirdeğinin yakınına kadar geniş tutun ve işlemci doğru bayt şeridini seçer. otobüsü daha dar hale getirmek veya bayt şeritlerinde baytları hareket ettirmek için daha fazla mantık ve / veya saat maliyeti (bazen yapılır). bu nedenle bir mikrodenetleyicideki dahili koçlar, örneğin sistem için anlamlıysa, 32 bit genişliğinde olabilir. Evet, daha fazla döngü yazdığınız için, satır boyunca bir yerde okuma-değiştirme-yazma işlemi yapmanız gerekir. Bilgisayarınıza tek bir bayt yazmak istiyorsanız, bir yerde 64 bit okuma olur ve daha sonra bir yerde bu 64 bitlik bir bayt değiştirilir, bundan sonra ne yaptığınıza bağlı olarak 64 bit sadece bu 8 bitle dramatik hale gelebilir önceden var olandan farklı olarak, önbelleğe alma ve kodunuz bunu genel bir kural haline getirmez. Yazmalar ateşlidir ve unutur, bellek denetleyicisi işlemciden adresi ve verileri toplayabilir ve işlemcinin sonunda yazma tasarruflu saatler, belki de bir okuma-değiştirme-yazmada yanan daha fazla saat (işlemcinin çalışmaya devam etmesine izin verebilir) önbellekte zaten),

Bugün bile hemen hemen tüm bunların istisnaları vardır, belki biraz adreslenebilir bazı sistemlerde talimatlar veya erişim türleri vardır, adresin bir bayt dışında bir şeyin birimleri olduğu bazı sistemler vardır. Bir bayt her zaman 8 bit değildi ve belki de hala doğru olan sistemler çalışıyor (sekizli kullanıyorduk ve 9 bit bayt 18 veya 36 bitlik bir kelime, sekizlik düşünen insan programcılarına ve çip tasarımcılarına çok mantıklı geliyor, 8 bit onaltılık düşünürler için çok mantıklı).

Şimdi bunu okuduğunuz bilgisayar, bu dram denetleyicisinin veri yolu 32 veya 64 bit genişliğinde olsa da, gerçek dram modülünün kendisi muhtemelen kolayca görebileceğiniz birden fazla 8 bit geniş parçadan oluşur. Bir tarafta 8 veya 9 yongası varsa, muhtemelen 8 bit genişlikli parçalarla uygulanan 64 bit veya 72 bit (64 bit artı 8 bit ECC) genişliğindedir. Modülün bir tarafında 4 veya 5 çip varsa, ancak hala tonlarca pim varsa, o zaman 32 bit genişliğinde (bu günlerde pek olası değildir) veya 4 çip 16 bit genişliğinde ve 5. varsa 16 bit genişliğinde ve sadece 8 bit kullanılır veya 8 bit genişliğinde bir parçadır. 32 bit genişliğinde parçalar da vardır, ancak 8 bit genişlik en yaygın olanıdır. Çok eski bir uygulama.

Hangi mikrodenetleyiciyi bilmemiz gerekir. 32 bit'ten bahsettiğiniz için, bu bölümün içindeki belleğin 32 bit genişliğinde ve buna tüm erişimlerin 32 bit genişliğinde olması muhtemeldir (ayrıntılı bilgi olmadan). talimatlar büyük olasılıkla 8 bit, 16 bit ve 32 bit erişim türü sunan programın ne istediğini belirleyecek, yazmadaki küçük olanlar bir yerde bir okuma-değiştirme-yazma gerektirecek, bayt şeritlerini görmezden geldiğinizi okuyor. Flaş yazma başka bir konu olmasına rağmen, flaş için de aynı şey geçerli. Ancak dahili flaş büyük olasılıkla 32 bit genişliğindedir ve tüm okumalar 32 bitlik birimlerdir. Harici bir flaş olsa da, bu başka bir hikaye, büyük olasılıkla bir bit genişliğidir (spi veya i2c), ancak spi parçaları bazen 1, 2 veya 4 biti destekleyebilir, ancak bir miso pimi en yaygın olanıdır. Dahili olarak bayt birimleri halinde organize edilirler, 8 bit genişliğinde veya 16 veya 32 olabilir ya da kim bilir, siz onları kaydırın ve bayt birimleriyle adresleyin. spi ile tek bir işlemde bir bayt ve tüm bellek arasında herhangi bir yere geçiş yapabilirsiniz, flash bölüm tasarımına bağlıdır.


0

1 bit işlemciler de alabilirsiniz!

Veri genişliği yazmaç (akümülatör) genişliğini izleyecektir. bu normalde 'işlemci genişliği'dir, ancak adres veriyolu farklı olabilir (genellikle daha geniş), ancak kullanıma bağlı olarak teknik olarak daha dar olabilir.

8 tabii ki iki sayının gücüdür. 8 bitin her yerde kullanımı ve COST / teknoloji yeteneği için teşekkür etmek için geçmişimiz var. Uzun bir süre 8 bit karar verdi, bunun nedeni otobüslerin genişliği ve kayıtların (ve RAM'in) 8 bitten daha geniş hale getirilmesinin zorluğu (kayıtlarınızın hepsi 8 bit ise 16 bit verilerinde bir nokta yok). 8 bit oldukça şıktır ve Hex'de çok mantıklıdır. 8 bit, alfabenizi, sayılarınızı, çizim ve kontrol karakterlerinizi (ASCII) veya 0 ila 255 veya + -127 tutabilir 256 bayttan fazla veriye (8 bit adres veriyolu) erişmek disk belleği ile kolaydır, sayfayı seçin, ardından bayt örn. 256 sayfa 256 sizi 64K'ya (65536) ulaştıracaktır. Genellikle sayfanın ayarlanmasını gerektirmeyeceğinden, sayfa sıfırlaması erişimin daha hızlı olacağı için bir not defteri olacaktır. İlk bilgisayar 1k x 8 bit statik ram vardı! (dinamik RAM daha ucuzdu, ancak yenilemek için daha fazla donanıma ihtiyaç vardı). Birkaç bayrakla (c, nc, z, nz) toplayın, çıkarın, sola ve sağa döndürün, 8 bitlik bir makinede oldukça karmaşık bir matematik yapabilirsiniz. Kayan noktalı aritmetik üniteye ihtiyacınız yok! Süper hızlı değil, ama yapılabilir! Birçok erken işlemci tek aşamalı olabilir ve hata ayıklamayı gerçekten kolaylaştıran basit statik RAM ile kullanılabilir; bazı sekizli tamponlar ve erken kırmızı LED'ler ekleyerek, adres ve veri yollarının değiştiğini izleyebilirsiniz :)

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.