Harvard mimarisi nasıl yardımcı olur?


13

Arduino ve AVR mimarisi hakkında okuyordum ve boru hattının durması veya köpürmesinin AVR'deki Harvard mimarisi tanıtımı ile nasıl çözüldüğü noktasında takılı kaldım. programı operatör olmadan yüklemeyi mümkün kılar.Ancak yukarıdaki sorunun çözülmesine nasıl yardımcı olur?


2
Bu biraz tahmin, bu yüzden bir cevap olarak yayınlamayacağım, ama sanırım Harvard mimarisi yardımcı olur, çünkü boru hattında önceki bir talimatla kodu kendi kendine değiştirme olasılığı yoktur.
PeterJ

1
i u olsun emin değilim ... u "talimat getirildi" kez değiştirilmiş veya geri atılamaz demek mi demek istiyorsun?
Ayush

1
Evet bu doğru, Harvard olmayanlar için kod kendini değiştirebileceğinden, daha önce talimatın aşağıdaki talimatı değiştirmesi olasılığı vardır. Ama biraz bekleyin, birisi muhtemelen daha kesin ve daha net bir cevap alacaktır.
PeterJ

Yanıtlar:


9

AVR'lerin icat edilmesinden çok önce tesadüfen kullanılan Harvard mimarisi, aslında program belleği ve veri belleği için ayrı adres alanlarına sahiptir. Bunun partiye getirdiği şey, devreyi, program belleğinden bilgi akışını ve veri belleğine bilgi akışını işlemek için ayrı bir veri yolu ve kontrol devresi kullanılabilecek şekilde tasarlama yeteneğidir. Ayrı veri yollarının kullanılması, programın getirilmesi ve yürütülmesinin, zaman zaman veri belleğine veri aktarımından kesintisiz olarak devam edebileceği anlamına gelir. Örneğin, mimarinin en basit versiyonunda, program getirme birimi, bir önceki program komutunun bir parçası olabilecek veri aktarım işlemine paralel olarak, program dizisindeki bir sonraki talimatı almakla meşgul olabilir.

Bu en basit seviyede Harvard mimarisinin, program kodunu veri belleğine koymanın ve oradan yürütülmesinin genellikle mümkün olmaması nedeniyle bir sınırlaması vardır.

Tanımladığım mimarinin bu en basit biçiminin üzerine eklenebilecek birçok varyasyon ve karmaşıklık var. Yaygın olarak kullanılan bir ekleme, program bilgi veriyoluna, talimat yürütme biriminin, her gerektiğinde program adımını getirmek için daha yavaş belleğe gitmeye gerek kalmadan bir sonraki program adımına daha hızlı erişmesini sağlayan komut önbelleği eklemektir.


çok teşekkürler .... gerçekten onu almak bana yardımcı oldu, ama sadece bir şey daha ... biz farklı otobüs ama aynı bellek ve aynı anda çalışmak olamaz mı?
Ayush

@Ayush - Aynı bellek alanına giden iki veri yolunuz varsa, aynı anda belleğe gelen iki bellek işlemi isteği yine de bellek erişimi için uğraşmak zorunda kalır. Bir diğerinin tamamlanması için beklemek zorunda! Şimdi, bazı tasarımcılar bu problemi, belleği normal hızın iki katında çalışacak şekilde tasarlayarak ve daha sonra bir veri yolunun diğer veri yolundan erişimle değişen belleğe erişmesine izin vererek "çözdü". Yani şeyler ilk otobüs her zaman bellek ve garip erişim yuvaları ile senkronize olacak şekilde tasarlanmıştır (devamı devamı)
Michael Karas

(önceki açıklamadan devam eder) ikinci veri yolu belleğin eşit erişim yuvalarıyla senkronize edilirse, her iki veri yolu da bellek erişim çekişmesi olmadan hızda çalışmaya devam edebilir.
Michael Karas

@MichaelKaras: Bunu yapabiliriz. Diğer yandan, çoğu durumda, genel sistem hızı için birincil sınırlayıcı faktör bellek hızıdır. Birisinin sadece veri veya kod için gerekenden iki kat daha hızlı çalışabilen bir belleği varsa, bellek sistemini veri ve kod için her birine bölmek, işlerin iki kat daha hızlı gitmesine izin verir.
supercat

4

Michaels'a ek olarak bazı notlar cevaplıyor:

1) Harvard mimarisi, veri ve kod için iki ayrı alan olmasını gerektirmez , sadece (çoğunlukla) iki farklı veri yoluna getirilir .

2) Harvard mimarisi tarafından çözülen sorun otobüs tartışmasıdır: kod belleğinin CPU'yu tam hızda çalıştıracak kadar hızlı talimatlar verebileceği bir sistem için, ek veri getirme / depolama yükü CPU'yu yavaşlatacaktır aşağı. Bu sorun bir Hardvard mimarisi tarafından çözülür: CPU'nun hızı için (biraz) çok yavaş bir bellek.

Önbelleğe almanın bu sorunu çözmenin başka bir yolu olduğunu unutmayın. Genellikle Harvarding ve önbellekleme ilginç kombinasyonlarda kullanılır.

Harvard iki otobüs kullanıyor. İkisine bağlı kalmanın doğal bir nedeni yoktur, özellikle DSP'lerde (Dijital Sinyal işlemcileri) ikiden fazla kullanılır.

Bellek Bankacılığı (bellek erişimini farklı yonga kümelerine dağıtma anlamında), veri / kod ayrımına değil, adresin belirli bitlerine dayanarak bellek sisteminin içinde bir tür Harvarding olarak görülebilir.


4
Aslında "saf" bir Harvard mimarisi , talimatlar ve veriler için ayrı anılar (adres alanları) gerektirir. Bununla birlikte, bu bir bilgisayarın kendini önyüklemesini engellediğinden, birçok makine "değiştirilmiş" bir Harvard mimarisi uygular ve burada komut belleğine yazma izni verilir.
Dave Tweed

CPU ve bellek bankalarının her biri arasında iki (veya daha fazla) veri yolu olmadığı sürece bellek bankacılığı yardımcı olmaz.
Dave Tweed

@Kaydet 2: Bankacılık belirli durumlarda yardımcı olur, örneğin sorun bellek zamanlamasıysa ve belleğe giden veri yolu tıkanmıyorsa (birden fazla işlem olağanüstü olabilir).
Wouter van Ooijen

@ Dave1: referans verebilir misiniz?
Wouter van Ooijen

Wikipedia , ayrıca Princeton Üniversitesi (gerçekten Wikipedia sayfasının bir kopyası). Ayrıca, çoğu tek çipli mikro denetleyici Harvard mimarisidir ve birçok veri sayfası aslında kod flash belleğini kendi kendine yazmak için bir mekanizmanın nasıl değiştirilmiş bir Harvard mimarisi oluşturduğunu tartışır.
Dave Tweed

2

Saf bir Harvard mimarisi, belirli bir karmaşıklık düzeyine sahip bir bilgisayarın, kod ve veri anıları arasında hiçbir kaynağın paylaşılması gerekmiyorsa, Von Neuman mimarisinden daha hızlı çalışmasına izin verecektir. Pinout sınırlamaları veya diğer faktörler, her iki bellek alanına erişmek için bir veri yolu kullanımını zorlarsa, bu avantajlar büyük ölçüde geçersiz kılmaya eğilimlidir.

"Saf" bir Harvard mimarisi, kodu çalıştıracak işlemci dışındaki bazı mekanizmalar tarafından belleğe alınan çalışan kodla sınırlı olacaktır. Bu, bu tür mimarilerin amacı fabrika tarafından (veya özel programlama ekipmanı olan biri) tarafından ayarlanmayan cihazlar için kullanımını sınırlar. Bu sorunu hafifletmek için iki yaklaşım kullanılabilir:

Bazı sistemler ayrı kod ve bellek alanlarına sahiptir, ancak kod veriyolunu kısaca devralması, biraz işlem gerçekleştirmesi ve böyle bir işlem tamamlandığında kontrolü CPU'ya iade etmesi istenebilen özel donanım sağlar. Bu tür bazı sistemler, bu tür işlemleri gerçekleştirmek için oldukça ayrıntılı bir protokole ihtiyaç duyarlar, bazılarında böyle bir görevi yerine getirmek için özel talimatlar bulunur ve hatta bazıları belirli "veri belleği" adreslerini izler ve bunlara erişmeye çalışıldığında devralma / serbest bırakmayı tetikler. . Bu tür sistemlerin önemli bir yönü, "kod" ve "veri" için açıkça tanımlanmış bellek alanları olmasıdır; CPU'nun "kod" alanını okuması ve yazması mümkün olsa bile, yine de veri alanından anlamsal olarak farklı olduğu kabul edilmektedir. '

Bazı üst düzey sistemlerde kullanılan alternatif bir yaklaşım, ikisi de bir bellek tahkim birimine bağlanan biri kod ve diğeri veri için olmak üzere iki bellek veriyoluna sahip bir denetleyiciye sahip olmaktır. Bu birim sırayla her biri için ayrı bir bellek veri yolu kullanarak çeşitli bellek alt sistemlerine bağlanır. Bir bellek alt sistemine bir kod erişimi, bir diğerine veri erişimi ile aynı anda işlenebilir; ancak kod ve veriler aynı alt sisteme aynı anda erişmeye çalışırsa ya birinin beklemesi gerekir.

Bu yaklaşımı kullanan sistemlerde, bir programın performans açısından kritik olmayan kısımları bellek alt sistemleri arasındaki sınırları göz ardı edebilir. Kod ve veriler aynı bellek alt sisteminde bulunuyorsa, işler ayrı alt sistemlerde olduğu kadar hızlı çalışmaz, ancak tipik bir programın önemli olmayan birçok bölümü için de çalışmaz. Tipik bir sistemde, kodun performansın gerçekten önemli olduğu küçük bir kısmı olacaktır ve sistem tarafından tutulan verilerin yalnızca küçük bir kısmında çalışacaktır. Birisi, iki 8K bölüme ayrılmış 16K RAM'e sahip bir sisteme sahipse, performans açısından kritik kodun genel bellek alanının başlangıcına yakın olmasını ve performans açısından kritik verilerin son. Toplam kod boyutu örneğin 9 KB'ye çıkarsa, Son 1K içindeki kod, başka bir yere yerleştirilen koddan daha yavaş çalışır, ancak bu kod performans açısından kritik olmaz. Benzer şekilde, kod sadece 6K olsaydı, ancak veriler 9K'ya büyüdüyse, en düşük 1K veriye erişim yavaş olurdu, ancak performans açısından kritik veriler başka bir yerde bulunsaydı, bu sorun yaratmazdı.

Kod 8K'ın altında ve veriler 8K'nın altında olsaydı performansın optimum olacağını, ancak yukarıda belirtilen bellek sistemi tasarımının kod ve veri alanı arasında katı bir bölüm oluşturmayacağını unutmayın. Bir programın yalnızca 1K veriye ihtiyacı varsa, kod 15K'a kadar büyüyebilir. Yalnızca 2K kod gerektiriyorsa, veriler 14K'ya kadar büyüyebilir. Sadece kod için 8K alana ve sadece veri için 8K alana sahip olmaktan çok daha çok yönlüdür.


2

Tartışılmayan bir husus, tipik olarak sadece 16-bit adres veriyolu olan küçük mikrodenetleyiciler için bir Harvard mimarisinin adres alanını etkili bir şekilde iki katına çıkarması (veya üç katına çıkarması). 64K kod, 64K RAM ve 64k bellek eşlemeli G / Ç'ye sahip olabilirsiniz (sistem bağlantı noktası numaraları yerine bellek eşlemeli G / Ç kullanıyorsa, ikincisi zaten G / Ç adreslemesini koddan ayırır ve RAM alanları).

Aksi takdirde, aynı 64K adres alanında kod, RAM ve isteğe bağlı olarak G / Ç adresini sıkıştırmanız gerekir.

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.