RAMからコードを実行する理由


27

マイコンコンパイラがRAMから関数を強制実行(または提案)するためのマクロに出くわしました。

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

これはどのような場合に価値がありますか?利点が速度の向上だけである場合、常にRAMから実行しないのはなぜですか?これは一般に、より高い電流引き込みを引き起こしますか?


13
RAMからコードを実行すると、消費電流が少なくなります(すべてのCPU / SoCに当てはまるかどうかわかりません)。バッテリーデバイスであり、可能な限り長く使用したいため、ほとんどのコードをRAMに配置するプロジェクトを一度作成しました。RAMからのみコードを実行できる場合は、一部のSoCのフラッシュブロックの電源をオフにして、さらに電力を節約することもできます。
アルバンディ

4
@pipe-答えではなくコメントにする理由は、実際の質問に答えないからだと思います。そのため、コードの実行に常に RAMを使用する必要はありません。
ジュール

1
@Julesはい、「役に立つ逸話」として意図されていると思います。Stack Exchangeは、非常に正当な理由により、防止するように設計されています。
パイプ

1
レジスタから実行するのに十分なレジスタがないためです。(私はそのチップを持っています。)
ジョシュア

すべてに加えて、ダイナミック RAM からコードを実行することは、DRAMリフレッシュを実行するための精巧なソフトウェアハックの一部である可能性があります。:)
カズ

回答:


32

他の人がすでに言及した速度と他の機能に加えて、RAMからコードを実行することは、マイクロフラッシュを再プログラムする必要があるブートローダーで役立ちます-消去中のフラッシュからコードを実行することはできません&再プログラミング。


4
あなたが持っているフラッシュブロックの数とブートローダーを変更できるもの、次のブロックのデータをステージングするために残したRAMの量などに依存しますが、フラッシュRAMを変更できるようにフラッシュをトランポリンに当てはまりますそのための良い...
old_timer

1
これは、質問の半分(名目上の部分)にしか答えていないようです。OPは、「利点が速度の向上だけである場合、常にRAMから実行しないのはなぜですか」と尋ねましたが、この回答では、RAMから実行したくない理由を説明していません。
ドクターJ

2
これまでのところは良いのですが、フラッシュを書き換えている最中に電源(つまりRAM)を失うとどうなりますか?これ解決できますが、ブートローダーの他のデザインと同様に、考慮する必要があります。
AaronD

19

私はそのマイクロのデータシートを見ませんでした。ただし、この状況では、RAMからのフェッチが、プログラムメモリが実装されているフラッシュからのフェッチよりも高速であることがよくあります。

フラッシュの利点は、大量に比較的安価にできることです。そのため、マイクロコントローラーの製造元はチップ上に大量のフラッシュを配置し、コードを実行できるより限られたRAMスペースを提供することがあります。これにより、タイムクリティカルなルーチンをRAMにコピーし、そこから実行できます。

参照するコンパイラスイッチは、おそらくリンカで機能し、リセットから実行されるコンパイラランタイムコードによってRAMにコピーされるフラッシュのセクションにフラグを立てます。実装が異なると、詳細が異なります。


17

より高速であるためにRAMで実行する場合、通常はそのRAMがオンチップSRAMであるためです。これは希少なリソースであり、おそらく読み取り/書き込みアクセスを必要とするデータに必要です。

あなたはすでに時にコードのためにそれを使用していますが、フラッシュのX量とRAMの追加のX量が必要であることをROM /フラッシュ手段でコードを。

また、ほとんどの場合重要ではありませんが、起動時または実行するときに追加のコピーステージが必要です。

従来、これは命令キャッシュで解決されていましたが、マイクロコントローラでは、実行速度を最速にしたいためマイクロコントローラを使用しないため、内部SRAMを汎用的に保持する方が理にかなっています。

また、信頼性の問題もあります。実際のROMで実行されるコードは、バグのあるコードでは変更が困難です。


14

すべての良い答えに加えて:

利点が速度の向上だけである場合、常にRAMから実行しないのはなぜですか?

組み込みシステムでは、通常、必要な量のRAMがないためです。たとえば、32kBまたはRAMと512kBのEEPROMを備えたSTM32。RAMでプログラム全体を実行するには、EEPROMよりも大きいRAMサイズが必要です。


5
「組み込みシステムでは、通常、必要な量のRAMがありません。」-そして、これを行うのに十分なRAMがある場合は、RAMの少ない安価なMCUに切り替えることで、ほぼ確実にコストを削減できます。あなたが質問をしている場合は、必ず以下RAM(最小で最も安価なマイコンを使用ハーバードアーキテクチャがそうRAMから実行することはできません)と安価なMCUがありますので
ジュール・

13

他の答えは、あなたが特に尋ねた電力消費についてあまり議論していないようです。

答えは、マイクロコントローラーに多少依存しますが、多くの場合、RAMからの実行は、フラッシュメモリからよりもRAMから命令を読み取るために必要なエネルギーが少ないため、消費電力を削減できます。

典型的な使用法は、フラッシュメモリの電源を切った状態で、RAMから低電力の「スリープ」機能を実行することです。消費電力が削減されるだけでなく、マイクロコントローラが(たとえば外部割り込みに応答して)すばやく起動する必要がある場合、フラッシュメモリの電源が再びオンになるまで遅延はありません。

一部のAtmel SAM範囲などの一部の部品には、この目的に使用できる特別な低電力RAMがあります。これにより、使用可能なRAMの大部分と他のすべてのメモリの電源がオフになり、マイクロコントローラがディープスリープモードになり、少量のコードを特別なRAMにロードできます。


7

他の人が言及した潜在的な速度の利点以外に、RAMコードも動的であり、必要に応じてFLASH内のコードを調整することでオンザフライで変更できます。

これは、いくつかのパラメータを変更するのと同じくらい簡単な場合もあれば、リモートでアップロードされるハンドラルーチン全体の場合もあります。


または、RAMのコードをディスク(SDなど)またはネットワークからロードできます
teambob

4

RAMからのコードの実行は、フラッシュメモリからの実行よりも大幅に高速です。ほとんどのCPUは、可能な限り高速なRAMアクセス用に高度に最適化されており、最速のフラッシュメモリでさえRAMの数分の1の速度にしか達しません。

ただし、コードをフラッシュからRAMに移動するのにも時間がかかることに注意してください。コードが1回しか実行されない場合は、コードを1回読み取るだけで済むため、実際にコードを直接実行するのではなく、最初にRAMにコピーする時間を失うことになります。コードがときどき実行される場合(したがって、コードをRAMにコピーすると2回目の呼び出しで実行が増加します)、システムが一般的にアイドル状態の場合、RAMにコピーすることでコードをより速く実行できますが、システムは十分な時間があります。

そのため、コードが頻繁に実行され、システムのチョークポイントであると測定した場合、そのような最適化は努力するだけの価値があります。

一方、RAMはデータをアクティブに保持する必要がありますが、フラッシュメモリは保持しないため、RAMをアクティブに保つ必要がある場合、総消費電力が増加します。ただし、これはRAMがまったく使用されていない場合にのみ関係しますが、最新のシステムのほとんどは、何らかの方法で使用可能なRAMを既に使用しているため、既にアクティブになっています。


4

RAMからコードを実行する2つの非常に一般的な理由があります。

  1. 一部のマイクロプロセッサは、フラッシュプログラミング中にフラッシュから実行できませんが、コードが書き込まれているフラッシュとは異なるブロックにある限り、多くのマイクロプロセッサはこれを実行できます。フラッシュ書き込みは、アプリケーションの再プログラミング(ブートローダーの場合)、または不揮発性プログラム情報の保存にフラッシュが使用されている場合(構成、キャリブレーションなど)

  2. 多くのマイクロプロセッサでは、RAMはフラッシュよりもはるかに高速です。これらのデバイスでは、通常、RAMはフラッシュよりもはるかに短い供給ですが、速度重視の小さなルーチンをRAMから実行できます。


2

ランダムビットフリップに対するRAMのみの実行セキュリティの別のユースケース。メインコンピューターボードには、放射線によるビットフリップを許容するECCラムがあるため、小さなキューブでこのモデルを使用します。起動時のRAMディスクはECC環境で完全に実行されるため、OS全体がRAMにロードされます。

フラッシュはECC保護されていません(標準の市販のマイクロSDカード)が、破損をチェックする他の方法(複数のイメージ、チェックサムなど)があります


EEPROMやフラッシュのようなものは、放射線によってビットフリップするのがはるかに「難しい」、つまり、より多くのエネルギーを必要とすると想定していました。
パイプ

確かにそうですが、特別なECC機能のない標準フラッシュを使用するだけなので、この目的にはRAMを使用する方がはるかに優れています。
テハスケール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.