Neden RAM'den kod çalıştırmalı?


27

Mikrodenetleyici derleyicimin RAM'den bir işlevi çalıştırmaya zorlaması (veya önermesi) için bazı makrolara rastladım.

https://siliconlabs.github.io/Gecko_SDK_Doc/efr32mg1/html/group__RAMFUNC.html#gac6abbc7f869eec9fb47e57427587c556

http://processors.wiki.ti.com/index.php/Placing_functions_in_RAM

https://www.iar.com/support/tech-notes/linker/controlling-placement-of-the-section-where-__ramfunc-functions-reside-ewarm-5.x--6.x/

https://community.nxp.com/thread/389099

Hangi durumlarda bu değerlidir? Fayda sadece hız arttırılırsa neden sadece her zaman RAM'den yürütmedim? Bu genellikle daha yüksek akım çekmesine neden olur mu?


13
RAM'den kod çalıştırmak daha az akım çekiyor (Tüm CPU / SoC'ler için doğru olup olmadığından emin değilim). Bir zamanlar kodun çoğunu RAM'e koyduğumuz bir proje yaptım çünkü bataryaydı ve mümkün olduğu kadar uzun süre yaşamasını istedik. Kodu yalnızca RAM'den çalıştırabilirseniz, bazı SoC'lardaki flaş bloklarını bile kapatabilir ve daha fazla güç tasarrufu sağlayabilirsiniz.
Al Bundy

4
@ pipo - Bir cevap yerine yorum yapmanın nedenini asıl soruya cevap vermemesi olduğunu düşünüyorum, bu yüzden kodunuzu çalıştırmak için her zaman RAM'i kullanmak istemezsiniz .
Jules

1
@Jules Evet, "yardımcı bir fıkra" anlamına geldiğini sanıyorum. Stack Exchange şeyleri, çok iyi nedenlerle önlemek için tasarlanmıştır.
boru

1
Çünkü kayıt defterinden çalıştırmak için yeterli kaydınız yok. (Ben bu çip var.)
Joshua

Her şeye ek olarak: özellikle dinamik RAM'den kod çalıştırmak, DRAM yenilemesini sürdürmek için ayrıntılı bir yazılım saldırısının parçası olabilir. :)
Kaz

Yanıtlar:


32

Diğerlerinin söylediği hız ve diğer özelliklere ek olarak, RAM'den kod çalıştırmak, mikro flaşınızı yeniden programlamanız gereken önyükleyicilerde yararlı olabilir - silme işleminin ortasında olduğunuz flaştan kod çalıştıramazsınız. yeniden programlanması.


4
kaç tane flash bloğunuz olduğuna ve önyükleyicinizin hangilerinin değiştirilmesine izin verdiğine, bir sonraki bloğun verilerini hazırlamak için ne kadar ram bıraktığınıza, vb. bunun için iyi ...
old_timer

1
Bu sadece sorunun yarısını cevaplıyor gibi görünüyor (titüler kısım). OP aynı zamanda "parası sadece hız artarsa Neden sadece hep RAM dan çalıştırmayacak?" Diye sordu ve bir olası nedenlerini bu cevap açıklamaz değil RAM dan yürütmek istiyoruz.
Doktor J

2
Şimdiye kadar çok iyi, ama yeniden yazma flaşın ortasındaki gücünü (ve böylece RAM'i) kaybederseniz ne olur? Bu olabilir çözülecek, ama sadece bir bootloader için başka tasarımı gibi, bu düşünülmelidir.
AaronD

19

Bu mikro için veri sayfasına bakmadım. Bununla birlikte, bu durumda, RAM’den alma işleminin, program belleğinin uygulandığı flaştan alma işleminden daha hızlı olması genellikle mümkündür.

Flaşın avantajı, büyük miktarların nispeten ucuz olabilmesidir. Mikrodenetleyici üreticileri bu nedenle bazen bir çip üzerine çok fazla flaş koyar, daha sonra kodun çalıştırabileceği daha sınırlı bir RAM alanı sağlar. Bu, kritik zaman rutinlerinin RAM'e kopyalanmasını ve ardından oradan çalıştırılmasını sağlar.

Bahsettiğiniz derleyici anahtarı muhtemelen linker ile çalışır ve flaşın bu bölümünün sıfırlamaya çalışan derleyici çalışma zamanı kodu ile RAM'e kopyalanmasını işaretler. Ayrıntılara göre farklı uygulamalar değişecektir.


17

RAM'de yürütmek istediğinizde, çünkü daha hızlıdır, çünkü genellikle RAM'de SRAM bulunur. Bu, okuma / yazma erişimi gerektiren veriler için muhtemelen isteyeceğiniz kıt bir kaynaktır.

Zaten sahipken kod için kullanmak ROM kodu / sen flaş X miktar ve RAM fazladan bir X miktar gerektiğini araçları flaş.

Ayrıca önyükleme sırasında veya çalıştırmak istediğinizde, çoğunlukla önemsiz olmasına rağmen, fazladan bir kopyalama aşaması gerektirir.

Geleneksel olarak bu bir talimat önbelleği ile çözülür, ancak mikrodenetleyicide dahili SRAM'in genel tutulması daha mantıklı olabilir çünkü en hızlı yürütme hızını istediğiniz için bir mikrodenetleyici kullanmazsınız.

Bir güvenilirlik sorunu da var - gerçek ROM'da kod çalıştırmak buggy koduyla değiştirmek zordur.


14

Tüm iyi cevaplara ek olarak:

Fayda sadece hız arttırılırsa neden sadece her zaman RAM'den yürütmedim?

Çünkü gömülü bir sistemde, genellikle gerekli miktarda RAM'e sahip değilsiniz. Örneğin, 32kB veya RAM ve 512kB EEPROM'a sahip bir STM32. Programın tamamını RAM'de yürütebilmek için EEPROM'dan daha büyük bir RAM boyutuna ihtiyacınız olacaktır.


5
“Gömülü bir sistemde, genellikle gerekli miktarda RAM'e sahip değilsiniz.” - ve eğer bunu yapmak için yeterli RAM'iniz varsa, daha az RAM'li daha ucuz bir MCU'ya geçerek maliyetleri kesinlikle kesinlikle düşürebilirsiniz. Çünkü soruyu soruyorsanız, her zaman daha az RAM'li daha ucuz bir MCU vardır (en küçük ve en ucuz MCU'lar Harvard mimarisini kullanır, bu nedenle RAM'den yürütülemez)
Jules

13

Diğer cevaplar, özellikle sorduğunuz güç tüketimini pek tartışmamış gibi görünüyor.

Bunun cevabı, mikrodenetleyiciye biraz bağlı olmasına bağlı, ancak RAM'den yürütme, güç tüketimini azaltabilir çünkü RAM'deki talimatları okumak için flash bellekten daha az enerji gerektirir.

Tipik bir kullanım, düşük güçte bir "uyku" işlevini RAM'den çalıştırmak, flaş belleği kapalıyken olacaktır. Yalnızca güç tüketimi azalmakla kalmaz, aynı zamanda mikrodenetleyicinin hızlı bir şekilde uyanması gerekiyorsa (örn. Harici bir kesmeye yanıt olarak), flaş belleği tekrar açarken gecikme olmaz.

Bazı Atmel SAM serileri gibi bazı parçalarda, bu amaç için kullanılabilecek özel düşük güçte RAM bulunur. Bu, özel RAM'e küçük bir miktar kod yüklenmesine izin verirken, mevcut RAM ve diğer tüm belleklerin büyük kısmı kapatılır ve mikrodenetleyici derin bir uyku moduna girer.


7

Diğerleri tarafından belirtilen potansiyel hız avantajları dışında, RAM kodu da dinamiktir ve gerektiğinde FLASH'daki bazı uyarlama kodlarıyla anında değiştirilebilir.

Bu, birkaç parametre değiştirmek kadar basit olabilir veya uzaktan yüklenen tüm işleyici yordamları olabilir.


Veya RAM kod disk (örn SD) veya ağ yüklenebilir
teambob

4

RAM'den kod çalıştırmak, flash bellekten çalıştırmaktan çok daha hızlıdır. Çoğu CPU, mümkün olan en hızlı RAM erişimi için yoğun bir şekilde optimize edilmiştir ve en hızlı flash bellek bile RAM hızının sadece bir kısmına ulaşmaktadır.

Ancak, kodu flaştan RAM'e taşımanın da zaman alacağını unutmayın. Kod yalnızca bir kez yürütülürse, yalnızca bir kez okumalısınız ve bu nedenle doğrudan doğrudan çalıştırmak yerine önce RAM'e kopyalamak için zaman harcarsınız. Kod zaman zaman yürütülürse (bu nedenle RAM'e kopyalanması, ikinci kez çağrıldığında yürütmeyi artırır), ancak sistem genel olarak boşta kalırsa, bu kodu RAM'e kopyalayarak daha hızlı yürütürsünüz, ancak hiç kimse umursamaz çünkü sistem geçirmek için yeterli zamana sahip.

Bu nedenle, bu tür optimizasyonlar, yalnızca kod sıkça çalıştırıldığında ve sistemin boğulma noktası olduğunu ölçtüyseniz, çabaya değer.

Öte yandan, RAM'in aktif tutulması gerekir; flash bellekte yer almazken, RAM'in aktif tutulması gerekiyorsa, toplam güç tüketimi artar. Bununla birlikte, bu yalnızca RAM'in başka türlü kullanılmaması durumunda geçerlidir, ancak çoğu modern sistem - bir şekilde veya başka bir durumda - mevcut RAM'i zaten kullanacaktır ve bu nedenle aktif durumda tutmaktadır.


4

RAM'den kod yürütmenin iki genel nedeni vardır:

  1. Bazı mikroişlemciler flaş programlama sırasında flaştan yürütülemez - çoğu kod yazılan flaştan farklı bir blokta olduğu sürece bunu yapabilir. Flash yazarları, uygulamayı yeniden başlatıyor olabilir (önyükleyici kasası) veya uçucu olmayan program bilgilerini (yapılandırma, kalibrasyon vb.) Saklamak için flaş kullanıldığında

  2. Birçok mikroişlemcide, RAM flaştan çok daha hızlıdır. Bu aygıtlar için, RAM'de flaştan çok daha kısa beslemede olmasına rağmen, kritik hızda küçük rutinler RAM'den yürütülebilir.


2

RAM için bir başka usecase yalnızca rastgele bit dosyalarına karşı yürütme güvenliği. Bu modeli küçük küpatımızda kullanıyoruz, çünkü ana bilgisayar kartı radyasyondan dolayı bit kliplerini tolere eden bir ECC tokmağına sahip. Tüm işletim sistemi bir ECC ortamında tamamen başlangıçta bir ramdisk çalıştığında ram'a yüklenir.

Flaş ECC korumalı değildir (rafta mikro SD kartlarda standart olarak bulunur), ancak bozulma kontrolü için başka yöntemlerimiz de var (birden fazla görüntü, sağlama kartı vb.)


EEPROM veya flaş gibi bir şeyin radyasyonla bit çarpması için çok daha zor olacağını, yani daha fazla enerji gerektirdiğini düşünürdüm.
boru

Gerçekten de öyle, ancak sadece özel ECC özelliklerine sahip olmayan standart flaş kullandığımız için, ram kullanmak bu amaç için çok daha iyi.
Tejas Kale
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.