Flash ve RAM: Kod Yürütme


13

Son zamanlarda montaj öğrenmeye başladım ve bağlayıcı komut dosyaları ve donanım programlamanın diğer düşük düzeyli ayrıntıları hakkında bilgi edindim. Ayrıca kendime bilgisayar mimarisi öğretiyorum ve hat boyunca bir yerde, bellek modeli resmimin baştan başa yanlış olabileceğinden korkmaya başladım.

Şu anda anladığım kadarıyla, tüm kod ve veriler, ikiliyi bir işlemciye 'yaktıktan' hemen sonra kalıcı bellekte bulunur - RAM'in geçici olması sıfırlandıktan sonra hiçbir şey içermez. Program 'yürütmeye' başladığında, bunu hemen hemen her zaman (AFAIK) Flash'taki en düşük adres olan 0x0000 adresinden yapar. Bu nedenle, Flash'ı CPU çekirdeğine bağlayan veri yoluna talimatlar yerleştirilir ve gerçek yürütme burada gerçekleşir. Ancak, CPU'nun bellekten veri alması veya depolaması hakkında konuştuğumuzda, genellikle RAM'den bahsediyoruz - program belleğinden de veri okuyabildiğimiz / yazabileceğimizin farkındayım (bunu AVR'lerde yaptım) ama o kadar yaygın değil mi? RAM, orada veri depolamayı tercih ettiğimiz ROM'dan daha hızlı olduğu için mi?

Bu soruya kabul edilen cevap , çoğu kod parçasının RAM dışında yürütüldüğünü söylüyor.

Bu, başlangıç ​​çalışma zamanı kodunun (kendisi Flash'tan yürütülür) tüm program opcodlarını Flash'tan RAM'e kopyalaması gerektiği anlamına gelir ve bir şekilde Flash'taki adresleri RAM'e işaret edecek şekilde eşler, böylece CPU oradan opcodes alır. Başlangıçta .data bölümlerini ROM'dan RAM'e taşıdığımız sürece benzer mi?

Programın ve veri anılarının bir otobüsü paylaştığı von Neumann mimarilerinde bunun daha basit olduğunu hayal edebiliyorum, ancak Harvard mimarilerinde bu, tüm kod ve verilerin önce CPU kayıtlarından geçmesi gerektiği anlamına gelmez mi?

Tahmin edebileceğiniz gibi, tüm bu iş için biraz kafam karıştı. Her zaman daha yüksek bir soyutlama düzeyinde programladığımda, bu tür ayrıntılarla kolayca rahatsız oluyorum. Herhangi bir yardım takdir.


2
Basit mikrodenetleyicilerde, yürütmek için program belleğinden (genellikle günümüzde flaş) RAM'e kopyalamaya gerek yoktur.
David

Bunun nedeni bir RAM'in Flash'tan daha hızlı olmasıdır, ancak güç kaybından sonra veri kaybettiği için kalıcı bellek Flash'ı gelir. Güç açıkken, veriler Flash'tan RAM'e yüklenir ve CPU tekrar çalışmaya başlar.
Lazar

Yanıtlar:


14

Bu aygıta bağlıdır.

RAM Flash'tan daha hızlı oluşturulabilir; bu yaklaşık 100MHz aralığında önem kazanmaya başlar.

Basit mikrodenetleyiciler

Küçük yavaş mikrodenetleyiciler doğrudan Flash dışında çalışır. Bu sistemler genellikle SRAM'den daha fazla Flash'a sahiptir.

Orta aralık sistemleri

Cihazınız hızlandıktan sonra durum biraz farklıdır. Orta kademe ARM sistemleri de bunu yapabilir veya daha akıllıca bir şey yapan bir maske ROM önyükleyicisine sahip olabilir: belki de USB'den veya harici EEPROM'lardan dahili SRAM'a kod indirmek.

Büyük sistemler

Daha büyük, daha hızlı sistemlerde harici DRAM ve harici Flash bulunur. Bu tipik bir cep telefonu mimarisidir. Bu noktada, bol miktarda RAM vardır ve Flash'tan daha hızlıdır, bu nedenle önyükleyici onu kopyalar ve yürütür. Bu, CPU kayıtları üzerinden kürek çekmeyi veya bir DMA ünitesi mevcutsa bir DMA aktarımını içerebilir.

Harvard mimarileri genellikle küçüktür, bu yüzden kopyalama aşamasıyla uğraşmayın. Ben çeşitli anılar ama iki farklı getirme birimleri içeren tek bir adres alanı olan "hibrid harvard" ile bir ARM gördüm. Kod ve veriler, aynı bellekten olmadıkları sürece paralel olarak getirilebilir. Böylece Flash'tan kod ve SRAM'den veri veya SRAM'den kod ve DRAM'den veri vb. Alabilirsiniz.


1

RAM genellikle flaştan daha hızlıdır, ancak 80-100MHz veya daha yüksek saat hızlarına ulaşana kadar gerçekten önemli değildir - flaş erişim süresi bir talimatı çalıştırmak için gereken süreden daha hızlı olduğu sürece, önemli değil.

RAM'in fiziksel yapısı çok hızlı cihazlar üretmemizi sağlar; flaştan çok daha hızlı. Bu noktada, kod bloklarını yürütmeden önce RAM'e kopyalamak mantıklıdır. Bu, geliştiriciye çalışma zamanında kod değiştirebilme gibi ek avantajlar da getirir.

program ve veri anılarının bir otobüsü paylaştığı von Neumann mimarilerinde, ancak Harvard mimarilerinde bu, tüm kod ve verilerin önce CPU kayıtlarından geçmesi gerektiği anlamına gelmez mi?

Şart değil. Bu, sanal adreslemenin devreye girdiği yerdir . Ham donanım RAM adreslerine atıfta bulunan program kodu yerine, aslında sanal bir adres alanına başvurur. Sanal adres alanı blokları, RAM, ROM, flash veya hatta aygıt arabellekleri olabilen fiziksel bellek aygıtlarına eşlenir.

Örneğin, bir mikroda 0x000f0004 adresine başvurduğunuzda, flaştan 0x0004 adresini okuyor olabilirsiniz. Sanal adres 0x000f0004 olmakla fiziksel adres sadece 0x0004 - tüm 0x000fxxxx adres alanı 4 KB fiziksel bellek cihazına eşleştirilir. Bu sadece elbette bir örnektir ve sanal adres alanını yönetme ve düzenleme yöntemi mimariler arasında büyük ölçüde farklılık gösterir.

Bu nedenle, "program hemen hemen her zaman flaştaki en düşük adres olan 0x0000 adresinden [...] yürütmeye başlar" dediğinizde, doğru olduğunuz garanti edilmez. Aslında, birçok mikrodenetleyici 0x1000'de başlar.


3
Ayrımın 100Mhz değil, 20-40MHz civarında alakalı hale geldiğini söyleyebilirim, çünkü gördüğüm çoğu flaş cihazı bu noktada bir bekleme durumuna ihtiyaç duymaya başladı. Çoğu durumda, kod flaşı devre içerecektir, böylece her getirme birden fazla talimat kelimesi alacaktır, böylece birçok kod türü için flaştan "ceza" sadece% 5-10, ancak diğer bazı türler için (örn. çok fazla sıçrama ile) ceza çok daha ağır olabilir.
Supercat

Bu sanal adresleme değil, bu bellek eşlemeli G / Ç (bellek bölgesi bir çevre birimi kullanarak G / Ç ile eşleşir, birçok MCU'daki ad "Statik Bellek Denetleyicisi" dir). Elbette, G / Ç başka bir belleğe uzanır, bu yüzden bazen G / Ç olarak düşünmüyoruz. Ama bu kesinlikle bir sanal bellek eşlemesi değil.
Ben Voigt

1

Söyledikleriniz tamamen doğru ya da yanlış değil. Bunun için farklı senaryolar var.

Bu, ham donanıma mı yoksa işletim sistemi ile kurulan donanıma mı programlama yaptığınıza bağlıdır.

Genel amaçlı bilgisayarda çalışan işletim sisteminiz, HDD'den kod alır ve daha hızlı erişim için RAM'de depolar. İşlemciniz sürekli olarak doğrudan HDD'den almaya çalışırsa, ikisi arasındaki hız uyuşmazlığı nedeniyle işlemler çok daha yavaş olur. Böylece RAM'iniz daha hızlı erişim için tekrarlayan kodunuzun bir bölümünün saklandığı yerde devreye girer. Ve bu işlemcinin daha da hızlı olması için işlemcilerin ön belleğinde daha da fazlası var.

Şimdi mikro denetleyici üzerinde çalışırken, tamamen çip üzerindeki verilerinizi nerede bulduğunuza bağlıdır. Veriler sabitse, RAM'inizi Kod belleğinden nispeten daha küçük olan RAM'inizi koruyacak kod belleğinde bulmak isteyebilirsiniz. C dilinde veri tipini statik kullanarak başlattığınızda veya bazı derleyici const öneklerinde veriler kod belleğinde saklanır veya RAM'de saklanır. Ve derlemede, belirli bir konumdaki verileri başlatmak için doğrudan DB'yi (Basic 8051 durumunda Tanımlama Baytını) kullanırsınız. Şimdi PIC ARM gibi bazı kontrolörlerde bile çalışma zamanında ROM yazabilirsiniz, ancak veri almak çok zaman alacaktır.

Ayrıca, orta seviye ve gelişmiş kontrolörlerde Boot loader donanımları vardır, bu da kontrolörlere veya işlemciye başlangıç ​​kodunun nerede çalıştırılacağını söyler veya kendisi aslında belleğe bölünmüş olan başlangıç ​​kodudur. , Endüstrideki geleneksel RAM ROM ve anıların tüm konseptini karmakarışık hibrid bir şekilde kullanmayı tercih ederim. Temel olarak karışıklığınız geçerlidir.

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.